diff --git a/BUILD.gn b/BUILD.gn
index 6eefc1b..549429e 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -101,7 +101,6 @@
       "//chrome",
       "//chrome/installer/zucchini:zucchini",
       "//chrome/installer/zucchini:zucchini_unittests",
-      "//chrome/profiling:unit_tests",
       "//chrome/test:browser_tests",
       "//chrome/test:interactive_ui_tests",
       "//chrome/test:sync_integration_tests",
@@ -714,6 +713,10 @@
       deps += [ "//tools/perf/contrib/vr_benchmarks:vr_perf_tests" ]
     }
   }
+
+  if (is_fuchsia) {
+    deps += [ "//headless" ]
+  }
 }
 
 # TODO(GYP_GONE): This target exists for compatibility with GYP, specifically
diff --git a/DEPS b/DEPS
index dbf21c3..aaa4d1f 100644
--- a/DEPS
+++ b/DEPS
@@ -40,11 +40,11 @@
   # 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': '32fa5104148722dbd6aac1ce8d38dcf47737f669',
+  'skia_revision': '228f761111ea4c914dc11fc5523bdabc5eca7ffc',
   # 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': 'f1317ecc526a2026e55c9bd6c532c3046defdeaa',
+  'v8_revision': 'e67e792e74a4e1c115c1e22d6e7b0b58ba41f6c8',
   # 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.
@@ -52,7 +52,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '553590a57921fd83abb814fee943c0ccc9bf45a2',
+  'angle_revision': '9b11ea4f2df63784bb34ccef2456d58939a0efb9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling build tools
   # and whatever else without interference from each other.
@@ -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': 'd27998f6526272a5b8732106aa9b75f724434aca',
+  'pdfium_revision': 'aeac95192c106b41c058c8372aa2ec8d0092f60b',
   # 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,7 +96,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '0eeb5baed7a4417ac083221805842019185ccec0',
+  'catapult_revision': '122dd5e91bf64888049459ce73a8fd34c084cfe0',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -362,7 +362,7 @@
       Var('chromium_git') + '/external/github.com/swisspol/GCDWebServer.git' + '@' + '43555c66627f6ed44817855a0f6d465f559d30e0',
 
     'src/ios/third_party/material_components_ios/src':
-      Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'c2a357fb67321e9660190c55b49836c51fe04821',
+      Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'a0466df249c593ba65007440d7a84e4665ac2631',
 
     'src/ios/third_party/material_font_disk_loader_ios/src':
       Var('chromium_git') + '/external/github.com/material-foundation/material-font-disk-loader-ios.git' + '@' + '8e30188777b016182658fbaa0a4a020a48183224',
diff --git a/WATCHLISTS b/WATCHLISTS
index 5ee2978..e9fb9ff 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -772,6 +772,9 @@
     'courgette': {
       'filepath': 'courgette/',
     },
+    'cq': {
+      'filepath': 'infra/config/cq.cfg',
+    },
     'cr_elements': {
       'filepath': 'ui/webui/resources/cr_element',
     },
@@ -920,9 +923,6 @@
     'gn': {
       'filepath': 'tools/gn',
     },
-    'goma': {
-      'filepath': 'infra/config/cq.cfg',
-    },
     'gpu': {
       'filepath': 'gpu/',
     },
@@ -1913,7 +1913,8 @@
                'rouslan+bubble@chromium.org'],
     'cache_storage': ['jkarlin+watch@chromium.org',
                       'nhiroki@chromium.org'],
-    'cast': ['avayvod+watch@chromium.org',
+    'cast': ['amp+watch@chromium.org',
+             'avayvod+watch@chromium.org',
              'imcheng+watch@chromium.org',
              'isheriff+watch@chromium.org',
              'jasonroberts+watch@google.com',
@@ -1922,7 +1923,8 @@
     'cast_certificate': ['dougsteed+watch@chromium.org',
                          'mfoltz+watch@chromium.org',
                          'ryanchung+watch@chromium.org'],
-    'cast_channel': ['mfoltz+watch@chromium.org',
+    'cast_channel': ['amp+watch@chromium.org',
+                     'mfoltz+watch@chromium.org',
                      'ryanchung+watch@chromium.org'],
     'cc': ['cc-bugs@chromium.org'],
     'certificate_transparency': ['certificate-transparency-chrome@googlegroups.com',
@@ -1985,6 +1987,11 @@
                           'twellington+watch@chromium.org'],
     'courgette': ['huangs+watch@chromium.org',
                   'wfh+watch@chromium.org'],
+    'cq': ['cq-config-changes@chromium.org',
+           'shinyak+cc@chromium.org',
+           'tikuta+cc@chromium.org',
+           'ukai+cc@chromium.org',
+           'yyanagisawa+cc@chromium.org'],
     'cr_elements': ['michaelpg+watch-elements@chromium.org',
                     'stevenjb+watch-md-settings@chromium.org'],
     'custom_tabs': ['lizeb+watch-custom-tabs@chromium.org'],
@@ -1999,7 +2006,8 @@
                        'timvolodine@chromium.org'],
     'devtools': ['devtools-reviews@chromium.org',
                  'pfeldman@chromium.org'],
-    'dial': ['mfoltz+watch@chromium.org',
+    'dial': ['amp+watch@chromium.org',
+             'mfoltz+watch@chromium.org',
              'zhaobin+watch@chromium.org'],
     'disk_cache': ['gavinp+disk@chromium.org'],
     'download': ['dtrainor+watch@chromium.org'],
@@ -2037,10 +2045,6 @@
     'gn': ['agrieve+watch@chromium.org',
            'dpranke@chromium.org',
            'tfarina@chromium.org'],
-    'goma': ['shinyak+cc@chromium.com',
-             'tikuta+cc@chromium.com',
-             'ukai+cc@chromium.com',
-             'yyanagisawa+cc@chromium.com'],
     'gpu': ['piman+watch@chromium.org'],
     'history_ui': ['pam+watch@chromium.org'],
     'hotword': ['rlp+watch@chromium.org'],
@@ -2104,12 +2108,14 @@
     'media_mojo': ['alokp+watch@chromium.org'],
     'media_recorder': ['emircan+watch+mediarecorder@chromium.org',
                        'mcasas+mediarecorder@chromium.org'],
-    'media_remoting': ['apacible+watch@chromium.org',
+    'media_remoting': ['amp+watch@chromium.org',
+                       'apacible+watch@chromium.org',
                        'erickung+watch@chromium.org',
                        'mfoltz+watch@chromium.org',
                        'miu+watch@chromium.org',
                        'xjz+watch@chromium.org'],
-    'media_router': ['imcheng+watch@chromium.org',
+    'media_router': ['amp+watch@chromium.org',
+                     'imcheng+watch@chromium.org',
                      'mfoltz+watch@chromium.org'],
     'memory_coordinator': ['chrome-grc-reviews+memory@chromium.org'],
     'message_loop': ['sadrul@chromium.org'],
@@ -2196,7 +2202,8 @@
     'prerender': ['cbentzel+watch@chromium.org',
                   'gavinp+prer@chromium.org',
                   'tburkard+watch@chromium.org'],
-    'presentation': ['mfoltz+watch@chromium.org'],
+    'presentation': ['amp+watch@chromium.org',
+                     'mfoltz+watch@chromium.org'],
     'push_messaging': ['johnme+watch@chromium.org',
                        'peter@chromium.org'],
     'reading_list': ['stkhapugin@chromium.org'],
@@ -2243,7 +2250,8 @@
                'nhiroki@chromium.org',
                'tzik@chromium.org'],
     'tab_alert_indicators': ['miu+watch@chromium.org'],
-    'tab_capture': ['miu+watch@chromium.org',
+    'tab_capture': ['amp+watch@chromium.org',
+                    'miu+watch@chromium.org',
                     'xjz+watch@chromium.org'],
     'tab_contents': ['ajwong+watch@chromium.org',
                      'avi@chromium.org',
diff --git a/android_webview/browser/aw_browser_main_parts.cc b/android_webview/browser/aw_browser_main_parts.cc
index 7f05440..6418442 100644
--- a/android_webview/browser/aw_browser_main_parts.cc
+++ b/android_webview/browser/aw_browser_main_parts.cc
@@ -149,7 +149,7 @@
   }
 
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kEnableWebViewFinch)) {
+          switches::kEnableWebViewVariations)) {
     AwMetricsServiceClient::GetOrCreateGUID();
   }
 
diff --git a/android_webview/browser/aw_contents_statics.cc b/android_webview/browser/aw_contents_statics.cc
index 43b71bd..be551515 100644
--- a/android_webview/browser/aw_contents_statics.cc
+++ b/android_webview/browser/aw_contents_statics.cc
@@ -13,6 +13,7 @@
 #include "base/android/jni_string.h"
 #include "base/android/scoped_java_ref.h"
 #include "base/callback.h"
+#include "components/security_interstitials/core/urls.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/storage_partition.h"
 #include "content/public/common/url_constants.h"
@@ -52,6 +53,15 @@
 }  // namespace
 
 // static
+ScopedJavaLocalRef<jstring> GetSafeBrowsingPrivacyPolicyUrl(
+    JNIEnv* env,
+    const JavaParamRef<jclass>&) {
+  // TODO(ntfschr): append the locale to this URL
+  return base::android::ConvertUTF8ToJavaString(
+      env, security_interstitials::kSafeBrowsingPrivacyPolicyUrl);
+}
+
+// static
 void ClearClientCertPreferences(JNIEnv* env,
                                 const JavaParamRef<jclass>&,
                                 const JavaParamRef<jobject>& callback) {
diff --git a/android_webview/browser/aw_metrics_service_client.cc b/android_webview/browser/aw_metrics_service_client.cc
index b8b55aa..1a7e8e7 100644
--- a/android_webview/browser/aw_metrics_service_client.cc
+++ b/android_webview/browser/aw_metrics_service_client.cc
@@ -125,10 +125,10 @@
   request_context_ = request_context;
   channel_ = GetChannelFromPackageName();
 
-  // If Finch is enabled for WebView the GUID will already have been read at
-  // startup
+  // If variations are enabled for WebView the GUID will already have been read
+  // at startup
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kEnableWebViewFinch)) {
+          switches::kEnableWebViewVariations)) {
     InitializeWithGUID();
   } else {
     content::BrowserThread::PostTaskAndReply(
@@ -141,7 +141,8 @@
 
 void AwMetricsServiceClient::InitializeWithGUID() {
   // The guid must have already been initialized at this point, either
-  // synchronously or asynchronously depending on the kEnableWebViewFinch flag
+  // synchronously or asynchronously depending on the kEnableWebViewVariations
+  // flag
   DCHECK_EQ(g_client_id_guid.Get().length(), GUID_SIZE);
   pref_service_->SetString(metrics::prefs::kMetricsClientID,
                            g_client_id_guid.Get());
diff --git a/android_webview/common/aw_switches.cc b/android_webview/common/aw_switches.cc
index 555513c9f..a8d9e825 100644
--- a/android_webview/common/aw_switches.cc
+++ b/android_webview/common/aw_switches.cc
@@ -6,7 +6,7 @@
 
 namespace switches {
 
-const char kEnableWebViewFinch[] = "enable-webview-finch";
+const char kEnableWebViewVariations[] = "enable-webview-variations";
 const char kSyncOnDrawHardware[] = "sync-on-draw-hardware";
 const char kWebViewSandboxedRenderer[] = "webview-sandboxed-renderer";
 
diff --git a/android_webview/common/aw_switches.h b/android_webview/common/aw_switches.h
index c41a274..341712b 100644
--- a/android_webview/common/aw_switches.h
+++ b/android_webview/common/aw_switches.h
@@ -7,7 +7,7 @@
 
 namespace switches {
 
-extern const char kEnableWebViewFinch[];
+extern const char kEnableWebViewVariations[];
 extern const char kSyncOnDrawHardware[];
 extern const char kWebViewSandboxedRenderer[];
 extern const char kWebViewEnableSafeBrowsingSupport[];
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java
index 6a5c5cc..c7eb4e9 100644
--- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java
+++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java
@@ -583,6 +583,16 @@
                         AwContentsStatics.setSafeBrowsingWhitelist(urls, callback);
                     }
 
+                    /**
+                     * Returns a URL pointing to the privacy policy for Safe Browsing reporting.
+                     *
+                     * @return the url pointing to a privacy policy document which can be displayed
+                     * to users.
+                     */
+                    // TODO(ntfschr): add @Override once next android SDK rolls
+                    public Uri getSafeBrowsingPrivacyPolicyUrl() {
+                        return AwContentsStatics.getSafeBrowsingPrivacyPolicyUrl();
+                    }
                 };
             }
         }
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContentsStatics.java b/android_webview/java/src/org/chromium/android_webview/AwContentsStatics.java
index e4e2605..f03750db 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContentsStatics.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContentsStatics.java
@@ -6,6 +6,7 @@
 
 import android.annotation.TargetApi;
 import android.content.Context;
+import android.net.Uri;
 import android.webkit.ValueCallback;
 
 import org.chromium.base.ThreadUtils;
@@ -154,6 +155,10 @@
         }
     }
 
+    public static Uri getSafeBrowsingPrivacyPolicyUrl() {
+        return Uri.parse(nativeGetSafeBrowsingPrivacyPolicyUrl());
+    }
+
     public static void setCheckClearTextPermitted(boolean permitted) {
         nativeSetCheckClearTextPermitted(permitted);
     }
@@ -176,6 +181,7 @@
     //--------------------------------------------------------------------------------------------
     //  Native methods
     //--------------------------------------------------------------------------------------------
+    private static native String nativeGetSafeBrowsingPrivacyPolicyUrl();
     private static native void nativeClearClientCertPreferences(Runnable callback);
     private static native String nativeGetUnreachableWebDataUrl();
     private static native String nativeGetProductVersion();
diff --git a/android_webview/javatests/AndroidManifest.xml b/android_webview/javatests/AndroidManifest.xml
index ed0ae66f..07a3566 100644
--- a/android_webview/javatests/AndroidManifest.xml
+++ b/android_webview/javatests/AndroidManifest.xml
@@ -8,6 +8,10 @@
     <instrumentation android:name="org.chromium.android_webview.test.AwInstrumentationTestRunner"
         android:targetPackage="org.chromium.android_webview.shell"
         android:label="Tests for org.chromium.android_webview"/>
+    <instrumentation android:name="org.chromium.base.test.BaseChromiumAndroidJUnitRunner"
+        android:targetPackage="org.chromium.android_webview.shell"
+        chromium-junit4="true"
+        android:label="Tests for org.chromium.android_webview"/>
     <uses-permission android:name="android.permission.RUN_INSTRUMENTATION" />
     <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
     <uses-permission android:name="android.permission.READ_LOGS"/>
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AcceptLanguageTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AcceptLanguageTest.java
index fdbc2148..187b398 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AcceptLanguageTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AcceptLanguageTest.java
@@ -85,9 +85,9 @@
                 getJavaScriptResultBodyTextContent(mAwContents, mContentsClient));
         assertEquals(LocaleUtils.getDefaultLocaleString(), acceptLanguages[0]);
 
-        String[] acceptLanguagesJs = getAcceptLanguages(
-                JSUtils.executeJavaScriptAndWaitForResult(
-                        this, mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper(),
+        String[] acceptLanguagesJs =
+                getAcceptLanguages(JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(),
+                        mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper(),
                         "navigator.languages.join(',')"));
         assertEquals(acceptLanguagesJs.length, acceptLanguages.length);
         for (int i = 0; i < acceptLanguagesJs.length; ++i) {
@@ -128,9 +128,10 @@
         assertEquals(
                 LocaleUtils.getDefaultLocaleListString(), TextUtils.join(",", acceptLanguages));
 
-        String[] acceptLanguagesJs = getAcceptLanguages(JSUtils.executeJavaScriptAndWaitForResult(
-                this, mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper(),
-                "navigator.languages.join(',')"));
+        String[] acceptLanguagesJs =
+                getAcceptLanguages(JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(),
+                        mAwContents, mContentsClient.getOnEvaluateJavaScriptResultHelper(),
+                        "navigator.languages.join(',')"));
         assertEquals(acceptLanguagesJs.length, acceptLanguages.length);
         for (int i = 0; i < acceptLanguagesJs.length; ++i) {
             assertEquals(acceptLanguagesJs[i], acceptLanguages[i]);
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AndroidScrollIntegrationTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidScrollIntegrationTest.java
index 4ff65e9..84f74a24 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AndroidScrollIntegrationTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidScrollIntegrationTest.java
@@ -126,7 +126,7 @@
     }
 
     @Override
-    protected TestDependencyFactory createTestDependencyFactory() {
+    public TestDependencyFactory createTestDependencyFactory() {
         return new TestDependencyFactory() {
             @Override
             public AwScrollOffsetManager createScrollOffsetManager(
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java
index ad613bf..16b780d 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java
@@ -70,7 +70,7 @@
     }
 
     @Override
-    protected TestDependencyFactory createTestDependencyFactory() {
+    public TestDependencyFactory createTestDependencyFactory() {
         return new TestDependencyFactory() {
             @Override
             public AwLayoutSizer createLayoutSizer() {
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java
new file mode 100644
index 0000000..d3bd9a5
--- /dev/null
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java
@@ -0,0 +1,412 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.android_webview.test;
+
+import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.rule.ActivityTestRule;
+
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+import org.chromium.android_webview.AwBrowserContext;
+import org.chromium.android_webview.AwContents;
+import org.chromium.android_webview.AwContentsClient;
+import org.chromium.android_webview.AwSettings;
+import org.chromium.android_webview.test.AwTestBase.PopupInfo;
+import org.chromium.android_webview.test.AwTestBase.TestDependencyFactory;
+import org.chromium.android_webview.test.AwTestCommon.AwTestCommonCallback;
+import org.chromium.base.test.util.CallbackHelper;
+import org.chromium.base.test.util.InMemorySharedPreferences;
+import org.chromium.net.test.util.TestWebServer;
+
+import java.lang.annotation.Annotation;
+import java.util.Map;
+import java.util.concurrent.Callable;
+
+/** Custom ActivityTestRunner for WebView instrumentation tests */
+public class AwActivityTestRule
+        extends ActivityTestRule<AwTestRunnerActivity> implements AwTestCommonCallback {
+    public static final long WAIT_TIMEOUT_MS = scaleTimeout(15000);
+
+    public static final int CHECK_INTERVAL = 100;
+
+    private Description mCurrentTestDescription;
+
+    private final AwTestCommon mTestCommon;
+
+    public AwActivityTestRule() {
+        super(AwTestRunnerActivity.class);
+        mTestCommon = new AwTestCommon(this);
+    }
+
+    @Override
+    public Statement apply(final Statement base, Description description) {
+        mCurrentTestDescription = description;
+        return super.apply(new Statement() {
+            @Override
+            public void evaluate() throws Throwable {
+                setUp();
+                base.evaluate();
+            }
+        }, description);
+    }
+
+    public void setUp() throws Exception {
+        mTestCommon.setUp();
+    }
+
+    @Override
+    public AwBrowserContext createAwBrowserContextOnUiThread(
+            InMemorySharedPreferences prefs, Context appContext) {
+        return new AwBrowserContext(prefs, appContext);
+    }
+
+    @Override
+    public TestDependencyFactory createTestDependencyFactory() {
+        return new TestDependencyFactory();
+    }
+
+    /**
+     * Override this to return false if the test doesn't want to create an
+     * AwBrowserContext automatically.
+     */
+    @Override
+    public boolean needsAwBrowserContextCreated() {
+        return true;
+    }
+
+    /**
+     * Override this to return false if the test doesn't want the browser
+     * startup sequence to be run automatically.
+     *
+     * @return Whether the instrumentation test requires the browser process to
+     *         already be started.
+     */
+    @Override
+    public boolean needsBrowserProcessStarted() {
+        return true;
+    }
+
+    public void createAwBrowserContext() {
+        mTestCommon.createAwBrowserContext();
+    }
+
+    public void startBrowserProcess() throws Exception {
+        mTestCommon.startBrowserProcess();
+    }
+
+    /**
+     * Runs a {@link Callable} on the main thread, blocking until it is
+     * complete, and returns the result. Calls
+     * {@link Instrumentation#waitForIdleSync()} first to help avoid certain
+     * race conditions.
+     *
+     * @param <R> Type of result to return
+     */
+    public <R> R runTestOnUiThreadAndGetResult(Callable<R> callable) throws Exception {
+        return mTestCommon.runTestOnUiThreadAndGetResult(callable);
+    }
+
+    public void enableJavaScriptOnUiThread(final AwContents awContents) {
+        mTestCommon.enableJavaScriptOnUiThread(awContents);
+    }
+
+    public void setNetworkAvailableOnUiThread(
+            final AwContents awContents, final boolean networkUp) {
+        mTestCommon.setNetworkAvailableOnUiThread(awContents, networkUp);
+    }
+
+    /**
+     * Loads url on the UI thread and blocks until onPageFinished is called.
+     */
+    public void loadUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper,
+            final String url) throws Exception {
+        mTestCommon.loadUrlSync(awContents, onPageFinishedHelper, url);
+    }
+
+    public void loadUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper,
+            final String url, final Map<String, String> extraHeaders) throws Exception {
+        mTestCommon.loadUrlSync(awContents, onPageFinishedHelper, url, extraHeaders);
+    }
+
+    public void loadUrlSyncAndExpectError(final AwContents awContents,
+            CallbackHelper onPageFinishedHelper, CallbackHelper onReceivedErrorHelper,
+            final String url) throws Exception {
+        mTestCommon.loadUrlSyncAndExpectError(
+                awContents, onPageFinishedHelper, onReceivedErrorHelper, url);
+    }
+
+    /**
+     * Loads url on the UI thread but does not block.
+     */
+    public void loadUrlAsync(final AwContents awContents, final String url) throws Exception {
+        mTestCommon.loadUrlAsync(awContents, url);
+    }
+
+    public void loadUrlAsync(
+            final AwContents awContents, final String url, final Map<String, String> extraHeaders) {
+        mTestCommon.loadUrlAsync(awContents, url, extraHeaders);
+    }
+
+    /**
+     * Posts url on the UI thread and blocks until onPageFinished is called.
+     */
+    public void postUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper,
+            final String url, byte[] postData) throws Exception {
+        mTestCommon.postUrlSync(awContents, onPageFinishedHelper, url, postData);
+    }
+
+    /**
+     * Loads url on the UI thread but does not block.
+     */
+    public void postUrlAsync(final AwContents awContents, final String url, byte[] postData)
+            throws Exception {
+        mTestCommon.postUrlAsync(awContents, url, postData);
+    }
+
+    /**
+     * Loads data on the UI thread and blocks until onPageFinished is called.
+     */
+    public void loadDataSync(final AwContents awContents, CallbackHelper onPageFinishedHelper,
+            final String data, final String mimeType, final boolean isBase64Encoded)
+            throws Exception {
+        mTestCommon.loadDataSync(awContents, onPageFinishedHelper, data, mimeType, isBase64Encoded);
+    }
+
+    public void loadDataSyncWithCharset(final AwContents awContents,
+            CallbackHelper onPageFinishedHelper, final String data, final String mimeType,
+            final boolean isBase64Encoded, final String charset) throws Exception {
+        mTestCommon.loadDataSyncWithCharset(
+                awContents, onPageFinishedHelper, data, mimeType, isBase64Encoded, charset);
+    }
+
+    /**
+     * Loads data on the UI thread but does not block.
+     */
+    public void loadDataAsync(final AwContents awContents, final String data, final String mimeType,
+            final boolean isBase64Encoded) throws Exception {
+        mTestCommon.loadDataAsync(awContents, data, mimeType, isBase64Encoded);
+    }
+
+    public void loadDataWithBaseUrlSync(final AwContents awContents,
+            CallbackHelper onPageFinishedHelper, final String data, final String mimeType,
+            final boolean isBase64Encoded, final String baseUrl, final String historyUrl)
+            throws Throwable {
+        mTestCommon.loadDataWithBaseUrlSync(awContents, onPageFinishedHelper, data, mimeType,
+                isBase64Encoded, baseUrl, historyUrl);
+    }
+
+    public void loadDataWithBaseUrlAsync(final AwContents awContents, final String data,
+            final String mimeType, final boolean isBase64Encoded, final String baseUrl,
+            final String historyUrl) throws Throwable {
+        mTestCommon.loadDataWithBaseUrlAsync(
+                awContents, data, mimeType, isBase64Encoded, baseUrl, historyUrl);
+    }
+
+    /**
+     * Reloads the current page synchronously.
+     */
+    public void reloadSync(final AwContents awContents, CallbackHelper onPageFinishedHelper)
+            throws Exception {
+        mTestCommon.reloadSync(awContents, onPageFinishedHelper);
+    }
+
+    /**
+     * Stops loading on the UI thread.
+     */
+    public void stopLoading(final AwContents awContents) {
+        mTestCommon.stopLoading(awContents);
+    }
+
+    public void waitForVisualStateCallback(final AwContents awContents) throws Exception {
+        mTestCommon.waitForVisualStateCallback(awContents);
+    }
+
+    public void insertVisualStateCallbackOnUIThread(final AwContents awContents,
+            final long requestId, final AwContents.VisualStateCallback callback) {
+        mTestCommon.insertVisualStateCallbackOnUIThread(awContents, requestId, callback);
+    }
+
+    // Waits for the pixel at the center of AwContents to color up into expectedColor.
+    // Note that this is a stricter condition that waiting for a visual state callback,
+    // as visual state callback only indicates that *something* has appeared in WebView.
+    public void waitForPixelColorAtCenterOfView(final AwContents awContents,
+            final AwTestContainerView testContainerView, final int expectedColor) throws Exception {
+        mTestCommon.waitForPixelColorAtCenterOfView(awContents, testContainerView, expectedColor);
+    }
+
+    public AwTestContainerView createAwTestContainerView(final AwContentsClient awContentsClient) {
+        return mTestCommon.createAwTestContainerView(awContentsClient);
+    }
+
+    public AwTestContainerView createAwTestContainerView(final AwContentsClient awContentsClient,
+            boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) {
+        return mTestCommon.createAwTestContainerView(
+                awContentsClient, supportsLegacyQuirks, testDependencyFactory);
+    }
+
+    public AwBrowserContext getAwBrowserContext() {
+        return mTestCommon.getAwBrowserContext();
+    }
+
+    public AwTestContainerView createDetachedAwTestContainerView(
+            final AwContentsClient awContentsClient) {
+        return mTestCommon.createDetachedAwTestContainerView(awContentsClient);
+    }
+
+    public AwTestContainerView createDetachedAwTestContainerView(
+            final AwContentsClient awContentsClient, boolean supportsLegacyQuirks,
+            TestDependencyFactory testDependencyFactory) {
+        return mTestCommon.createDetachedAwTestContainerView(
+                awContentsClient, supportsLegacyQuirks, testDependencyFactory);
+    }
+
+    protected boolean isHardwareAcceleratedTest() {
+        return mTestCommon.isHardwareAcceleratedTest();
+    }
+
+    public AwTestContainerView createAwTestContainerViewOnMainSync(final AwContentsClient client)
+            throws Exception {
+        return mTestCommon.createAwTestContainerViewOnMainSync(client);
+    }
+
+    public AwTestContainerView createAwTestContainerViewOnMainSync(
+            final AwContentsClient client, final boolean supportsLegacyQuirks) {
+        return mTestCommon.createAwTestContainerViewOnMainSync(client, supportsLegacyQuirks);
+    }
+
+    public AwTestContainerView createAwTestContainerViewOnMainSync(final AwContentsClient client,
+            final boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) {
+        return mTestCommon.createAwTestContainerViewOnMainSync(
+                client, supportsLegacyQuirks, testDependencyFactory);
+    }
+
+    public void destroyAwContentsOnMainSync(final AwContents awContents) {
+        mTestCommon.destroyAwContentsOnMainSync(awContents);
+    }
+
+    public String getTitleOnUiThread(final AwContents awContents) throws Exception {
+        return mTestCommon.getTitleOnUiThread(awContents);
+    }
+
+    public AwSettings getAwSettingsOnUiThread(final AwContents awContents) throws Exception {
+        return mTestCommon.getAwSettingsOnUiThread(awContents);
+    }
+
+    /**
+     * Verify double quotes in both sides of the raw string. Strip the double quotes and
+     * returns rest of the string.
+     */
+    protected String maybeStripDoubleQuotes(String raw) {
+        return mTestCommon.maybeStripDoubleQuotes(raw);
+    }
+
+    /**
+     * Executes the given snippet of JavaScript code within the given ContentView. Returns the
+     * result of its execution in JSON format.
+     */
+    public String executeJavaScriptAndWaitForResult(final AwContents awContents,
+            TestAwContentsClient viewClient, final String code) throws Exception {
+        return mTestCommon.executeJavaScriptAndWaitForResult(awContents, viewClient, code);
+    }
+
+    /**
+     * Executes JavaScript code within the given ContentView to get the text content in
+     * document body. Returns the result string without double quotes.
+     */
+    public String getJavaScriptResultBodyTextContent(
+            final AwContents awContents, final TestAwContentsClient viewClient) throws Exception {
+        return mTestCommon.getJavaScriptResultBodyTextContent(awContents, viewClient);
+    }
+
+    /**
+     * Wrapper around CriteriaHelper.pollInstrumentationThread. This uses AwTestBase-specifc
+     * timeouts and treats timeouts and exceptions as test failures automatically.
+     */
+    public static void pollInstrumentationThread(final Callable<Boolean> callable)
+            throws Exception {
+        AwTestCommon.pollInstrumentationThread(callable);
+    }
+
+    /**
+     * Wrapper around {@link AwTestBase#poll()} but runs the callable on the UI thread.
+     */
+    public void pollUiThread(final Callable<Boolean> callable) throws Exception {
+        mTestCommon.pollUiThread(callable);
+    }
+
+    /**
+     * Clears the resource cache. Note that the cache is per-application, so this will clear the
+     * cache for all WebViews used.
+     */
+    public void clearCacheOnUiThread(final AwContents awContents, final boolean includeDiskFiles)
+            throws Exception {
+        mTestCommon.clearCacheOnUiThread(awContents, includeDiskFiles);
+    }
+
+    /**
+     * Returns pure page scale.
+     */
+    public float getScaleOnUiThread(final AwContents awContents) throws Exception {
+        return mTestCommon.getScaleOnUiThread(awContents);
+    }
+
+    /**
+     * Returns page scale multiplied by the screen density.
+     */
+    public float getPixelScaleOnUiThread(final AwContents awContents) throws Exception {
+        return mTestCommon.getPixelScaleOnUiThread(awContents);
+    }
+
+    /**
+     * Returns whether a user can zoom the page in.
+     */
+    public boolean canZoomInOnUiThread(final AwContents awContents) throws Exception {
+        return mTestCommon.canZoomInOnUiThread(awContents);
+    }
+
+    /**
+     * Returns whether a user can zoom the page out.
+     */
+    public boolean canZoomOutOnUiThread(final AwContents awContents) throws Exception {
+        return mTestCommon.canZoomOutOnUiThread(awContents);
+    }
+
+    public void killRenderProcessOnUiThreadAsync(final AwContents awContents) throws Exception {
+        mTestCommon.killRenderProcessOnUiThreadAsync(awContents);
+    }
+
+    /**
+     * Loads the main html then triggers the popup window.
+     */
+    public void triggerPopup(final AwContents parentAwContents,
+            TestAwContentsClient parentAwContentsClient, TestWebServer testWebServer,
+            String mainHtml, String popupHtml, String popupPath, String triggerScript)
+            throws Exception {
+        mTestCommon.triggerPopup(parentAwContents, parentAwContentsClient, testWebServer, mainHtml,
+                popupHtml, popupPath, triggerScript);
+    }
+
+    /**
+     * Supplies the popup window with AwContents then waits for the popup window to finish loading.
+     */
+    public PopupInfo connectPendingPopup(final AwContents parentAwContents) throws Exception {
+        return mTestCommon.connectPendingPopup(parentAwContents);
+    }
+
+    @Override
+    public boolean testMethodHasAnnotation(Class<? extends Annotation> clazz) {
+        return mCurrentTestDescription.getAnnotation(clazz) != null ? true : false;
+    }
+
+    @Override
+    public Instrumentation getInstrumentation() {
+        return InstrumentationRegistry.getInstrumentation();
+    }
+}
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java
index 5e3004e..f56533f1 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java
@@ -214,7 +214,7 @@
                 mShouldInterceptRequestHelper.getRequestsForUrl(pageWithFormUrl).method);
 
         callCount = mShouldInterceptRequestHelper.getCallCount();
-        JSUtils.clickOnLinkUsingJs(this, mAwContents,
+        JSUtils.clickOnLinkUsingJs(getInstrumentation(), mAwContents,
                 mContentsClient.getOnEvaluateJavaScriptResultHelper(), "link");
         mShouldInterceptRequestHelper.waitForCallback(callCount);
         assertEquals("POST",
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java
index c02be0dc..28090bd1 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java
@@ -78,7 +78,7 @@
 
     private void clickOnLinkUsingJs() throws Throwable {
         enableJavaScriptOnUiThread(mAwContents);
-        JSUtils.clickOnLinkUsingJs(this, mAwContents,
+        JSUtils.clickOnLinkUsingJs(getInstrumentation(), mAwContents,
                 mContentsClient.getOnEvaluateJavaScriptResultHelper(), "link");
     }
 
@@ -926,8 +926,9 @@
 
             loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), urlWithLink);
             // Executing JS code that tries to navigate somewhere should not create an intent.
-            assertEquals("\"" + testUrl + "\"", JSUtils.executeJavaScriptAndWaitForResult(
-                            this, mAwContents, new OnEvaluateJavaScriptResultHelper(),
+            assertEquals("\"" + testUrl + "\"",
+                    JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), mAwContents,
+                            new OnEvaluateJavaScriptResultHelper(),
                             "document.location.href='" + testUrl + "'"));
             assertNull(getActivity().getLastSentIntent());
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsGarbageCollectionTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsGarbageCollectionTest.java
index cb5c93d..e0c4d29 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsGarbageCollectionTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsGarbageCollectionTest.java
@@ -42,7 +42,7 @@
     }
 
     @Override
-    protected TestDependencyFactory createTestDependencyFactory() {
+    public TestDependencyFactory createTestDependencyFactory() {
         if (mOverridenFactory == null) {
             return new TestDependencyFactory();
         } else {
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java
index ce37246..a787e7c 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java
@@ -4,6 +4,8 @@
 
 package org.chromium.android_webview.test;
 
+import static org.chromium.android_webview.test.AwTestCommon.WAIT_TIMEOUT_MS;
+
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
@@ -11,14 +13,19 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
+import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.LargeTest;
 import android.support.test.filters.SmallTest;
-import android.test.UiThreadTest;
 import android.util.Pair;
 import android.view.KeyEvent;
 import android.view.View;
 import android.webkit.JavascriptInterface;
 
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 import org.chromium.android_webview.AwContents;
 import org.chromium.android_webview.AwSettings;
 import org.chromium.android_webview.AwSwitches;
@@ -52,117 +59,141 @@
 /**
  * AwContents tests.
  */
-public class AwContentsTest extends AwTestBase {
+@RunWith(AwJUnit4ClassRunner.class)
+public class AwContentsTest {
+    @Rule
+    public AwActivityTestRule mActivityTestRule = new AwActivityTestRule();
 
     private TestAwContentsClient mContentsClient = new TestAwContentsClient();
 
+    @Test
     @SmallTest
     @Feature({"AndroidWebView"})
-    @UiThreadTest
     public void testCreateDestroy() throws Throwable {
         // NOTE this test runs on UI thread, so we cannot call any async methods.
-        createAwTestContainerView(mContentsClient).getAwContents().destroy();
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivityTestRule.createAwTestContainerView(mContentsClient)
+                        .getAwContents()
+                        .destroy();
+            }
+        });
     }
 
+    @Test
     @SmallTest
     @Feature({"AndroidWebView"})
     public void testCreateLoadPageDestroy() throws Throwable {
         AwTestContainerView awTestContainerView =
-                createAwTestContainerViewOnMainSync(mContentsClient);
-        loadDataSync(awTestContainerView.getAwContents(), mContentsClient.getOnPageFinishedHelper(),
-                CommonResources.ABOUT_HTML, "text/html", false);
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
+        mActivityTestRule.loadDataSync(awTestContainerView.getAwContents(),
+                mContentsClient.getOnPageFinishedHelper(), CommonResources.ABOUT_HTML, "text/html",
+                false);
 
-        destroyAwContentsOnMainSync(awTestContainerView.getAwContents());
+        mActivityTestRule.destroyAwContentsOnMainSync(awTestContainerView.getAwContents());
         // It should be safe to call destroy multiple times.
-        destroyAwContentsOnMainSync(awTestContainerView.getAwContents());
+        mActivityTestRule.destroyAwContentsOnMainSync(awTestContainerView.getAwContents());
     }
 
+    @Test
     @LargeTest
     @Feature({"AndroidWebView"})
     public void testCreateLoadDestroyManyTimes() throws Throwable {
         for (int i = 0; i < 10; ++i) {
-            AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient);
+            AwTestContainerView testView =
+                    mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
             AwContents awContents = testView.getAwContents();
 
-            loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(),
+            mActivityTestRule.loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(),
                     ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL);
-            destroyAwContentsOnMainSync(awContents);
+            mActivityTestRule.destroyAwContentsOnMainSync(awContents);
         }
     }
 
+    @Test
     @LargeTest
     @Feature({"AndroidWebView"})
     public void testCreateLoadDestroyManyAtOnce() throws Throwable {
         AwTestContainerView views[] = new AwTestContainerView[10];
 
         for (int i = 0; i < views.length; ++i) {
-            views[i] = createAwTestContainerViewOnMainSync(mContentsClient);
-            loadUrlSync(views[i].getAwContents(), mContentsClient.getOnPageFinishedHelper(),
+            views[i] = mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
+            mActivityTestRule.loadUrlSync(views[i].getAwContents(),
+                    mContentsClient.getOnPageFinishedHelper(),
                     ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL);
         }
 
         for (int i = 0; i < views.length; ++i) {
-            destroyAwContentsOnMainSync(views[i].getAwContents());
+            mActivityTestRule.destroyAwContentsOnMainSync(views[i].getAwContents());
             views[i] = null;
         }
     }
 
+    @Test
     @SmallTest
     @Feature({"AndroidWebView"})
-    @UiThreadTest
     public void testWebViewApisFailGracefullyAfterDestruction() throws Throwable {
-        AwContents awContents =
-                createAwTestContainerView(mContentsClient).getAwContents();
-        awContents.destroy();
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                AwContents awContents = mActivityTestRule.createAwTestContainerView(mContentsClient)
+                                                .getAwContents();
+                awContents.destroy();
 
-        // The documentation for WebView#destroy() reads "This method should be called
-        // after this WebView has been removed from the view system. No other methods
-        // may be called on this WebView after destroy".
-        // However, some apps do not respect that restriction so we need to ensure that
-        // we fail gracefully and do not crash when APIs are invoked after destruction.
-        // Due to the large number of APIs we only test a representative selection here.
-        awContents.clearHistory();
-        awContents.loadUrl("http://www.google.com");
-        awContents.findAllAsync("search");
-        assertNull(awContents.getUrl());
-        assertFalse(awContents.canGoBack());
-        awContents.disableJavascriptInterfacesInspection();
-        awContents.invokeZoomPicker();
-        awContents.onResume();
-        awContents.stopLoading();
-        awContents.onWindowVisibilityChanged(View.VISIBLE);
-        awContents.requestFocus();
-        awContents.isMultiTouchZoomSupported();
-        awContents.setOverScrollMode(View.OVER_SCROLL_NEVER);
-        awContents.pauseTimers();
-        awContents.onContainerViewScrollChanged(200, 200, 100, 100);
-        awContents.computeScroll();
-        awContents.onMeasure(100, 100);
-        awContents.onDraw(new Canvas());
-        awContents.getMostRecentProgress();
-        assertEquals(0, awContents.computeHorizontalScrollOffset());
-        assertEquals(0, awContents.getContentWidthCss());
-        awContents.onKeyUp(KeyEvent.KEYCODE_BACK,
-                new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MENU));
+                // The documentation for WebView#destroy() reads "This method should be called
+                // after this WebView has been removed from the view system. No other methods
+                // may be called on this WebView after destroy".
+                // However, some apps do not respect that restriction so we need to ensure that
+                // we fail gracefully and do not crash when APIs are invoked after destruction.
+                // Due to the large number of APIs we only test a representative selection here.
+                awContents.clearHistory();
+                awContents.loadUrl("http://www.google.com");
+                awContents.findAllAsync("search");
+                Assert.assertNull(awContents.getUrl());
+                Assert.assertFalse(awContents.canGoBack());
+                awContents.disableJavascriptInterfacesInspection();
+                awContents.invokeZoomPicker();
+                awContents.onResume();
+                awContents.stopLoading();
+                awContents.onWindowVisibilityChanged(View.VISIBLE);
+                awContents.requestFocus();
+                awContents.isMultiTouchZoomSupported();
+                awContents.setOverScrollMode(View.OVER_SCROLL_NEVER);
+                awContents.pauseTimers();
+                awContents.onContainerViewScrollChanged(200, 200, 100, 100);
+                awContents.computeScroll();
+                awContents.onMeasure(100, 100);
+                awContents.onDraw(new Canvas());
+                awContents.getMostRecentProgress();
+                Assert.assertEquals(0, awContents.computeHorizontalScrollOffset());
+                Assert.assertEquals(0, awContents.getContentWidthCss());
+                awContents.onKeyUp(KeyEvent.KEYCODE_BACK,
+                        new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MENU));
+            }
+        });
     }
 
+    @Test
     @SmallTest
     @Feature({"AndroidWebView"})
     public void testUseAwSettingsAfterDestroy() throws Throwable {
         AwTestContainerView awTestContainerView =
-                createAwTestContainerViewOnMainSync(mContentsClient);
-        AwSettings awSettings = getAwSettingsOnUiThread(awTestContainerView.getAwContents());
-        loadDataSync(awTestContainerView.getAwContents(), mContentsClient.getOnPageFinishedHelper(),
-                CommonResources.ABOUT_HTML, "text/html", false);
-        destroyAwContentsOnMainSync(awTestContainerView.getAwContents());
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
+        AwSettings awSettings =
+                mActivityTestRule.getAwSettingsOnUiThread(awTestContainerView.getAwContents());
+        mActivityTestRule.loadDataSync(awTestContainerView.getAwContents(),
+                mContentsClient.getOnPageFinishedHelper(), CommonResources.ABOUT_HTML, "text/html",
+                false);
+        mActivityTestRule.destroyAwContentsOnMainSync(awTestContainerView.getAwContents());
 
         // AwSettings should still be usable even after native side is destroyed.
         String newFontFamily = "serif";
         awSettings.setStandardFontFamily(newFontFamily);
-        assertEquals(newFontFamily, awSettings.getStandardFontFamily());
+        Assert.assertEquals(newFontFamily, awSettings.getStandardFontFamily());
         boolean newBlockNetworkLoads = !awSettings.getBlockNetworkLoads();
         awSettings.setBlockNetworkLoads(newBlockNetworkLoads);
-        assertEquals(newBlockNetworkLoads, awSettings.getBlockNetworkLoads());
+        Assert.assertEquals(newBlockNetworkLoads, awSettings.getBlockNetworkLoads());
     }
 
     private int callDocumentHasImagesSync(final AwContents awContents)
@@ -178,21 +209,23 @@
                 s.release();
             }
         });
-        runTestOnUiThread(new Runnable() {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
                 awContents.documentHasImages(msg);
             }
         });
-        assertTrue(s.tryAcquire(WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS));
+        Assert.assertTrue(s.tryAcquire(AwActivityTestRule.WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS));
         int result = val.get();
         return result;
     }
 
+    @Test
     @SmallTest
     @Feature({"AndroidWebView"})
     public void testDocumentHasImages() throws Throwable {
-        AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient);
+        AwTestContainerView testView =
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
         AwContents awContents = testView.getAwContents();
 
         final CallbackHelper loadHelper = mContentsClient.getOnPageFinishedHelper();
@@ -202,21 +235,22 @@
         final String imageDoc = "<head/><body><img/><img/></body>";
 
         // Make sure a document that does not have images returns 0
-        loadDataSync(awContents, loadHelper, emptyDoc, mime, false);
+        mActivityTestRule.loadDataSync(awContents, loadHelper, emptyDoc, mime, false);
         int result = callDocumentHasImagesSync(awContents);
-        assertEquals(0, result);
+        Assert.assertEquals(0, result);
 
         // Make sure a document that does have images returns 1
-        loadDataSync(awContents, loadHelper, imageDoc, mime, false);
+        mActivityTestRule.loadDataSync(awContents, loadHelper, imageDoc, mime, false);
         result = callDocumentHasImagesSync(awContents);
-        assertEquals(1, result);
+        Assert.assertEquals(1, result);
     }
 
+    @Test
     @SmallTest
     @Feature({"AndroidWebView"})
     public void testClearCacheMemoryAndDisk() throws Throwable {
         final AwTestContainerView testContainer =
-                createAwTestContainerViewOnMainSync(mContentsClient);
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
         final AwContents awContents = testContainer.getAwContents();
 
         TestWebServer webServer = TestWebServer.start();
@@ -230,46 +264,44 @@
                     pagePath, "<html><body>foo</body></html>", headers);
 
             // First load to populate cache.
-            clearCacheOnUiThread(awContents, true);
-            loadUrlSync(awContents,
-                        mContentsClient.getOnPageFinishedHelper(),
-                        pageUrl);
-            assertEquals(1, webServer.getRequestCount(pagePath));
+            mActivityTestRule.clearCacheOnUiThread(awContents, true);
+            mActivityTestRule.loadUrlSync(
+                    awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl);
+            Assert.assertEquals(1, webServer.getRequestCount(pagePath));
 
             // Load about:blank so next load is not treated as reload by webkit and force
             // revalidate with the server.
-            loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(),
+            mActivityTestRule.loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(),
                     ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL);
 
             // No clearCache call, so should be loaded from cache.
-            loadUrlSync(awContents,
-                        mContentsClient.getOnPageFinishedHelper(),
-                        pageUrl);
-            assertEquals(1, webServer.getRequestCount(pagePath));
+            mActivityTestRule.loadUrlSync(
+                    awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl);
+            Assert.assertEquals(1, webServer.getRequestCount(pagePath));
 
             // Same as above.
-            loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(),
+            mActivityTestRule.loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(),
                     ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL);
 
             // Clear cache, so should hit server again.
-            clearCacheOnUiThread(awContents, true);
-            loadUrlSync(awContents,
-                        mContentsClient.getOnPageFinishedHelper(),
-                        pageUrl);
-            assertEquals(2, webServer.getRequestCount(pagePath));
+            mActivityTestRule.clearCacheOnUiThread(awContents, true);
+            mActivityTestRule.loadUrlSync(
+                    awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl);
+            Assert.assertEquals(2, webServer.getRequestCount(pagePath));
         } finally {
             webServer.shutdown();
         }
     }
 
+    @Test
     @SmallTest
     @Feature({"AndroidWebView"})
     public void testClearCacheInQuickSuccession() throws Throwable {
         final AwTestContainerView testContainer =
-                createAwTestContainerViewOnMainSync(new TestAwContentsClient());
+                mActivityTestRule.createAwTestContainerViewOnMainSync(new TestAwContentsClient());
         final AwContents awContents = testContainer.getAwContents();
 
-        runTestOnUiThread(new Runnable() {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
                 for (int i = 0; i < 10; ++i) {
@@ -279,11 +311,13 @@
         });
     }
 
+    @Test
     @SmallTest
     @Feature({"AndroidWebView"})
     public void testGetFavicon() throws Throwable {
         AwContents.setShouldDownloadFavicons();
-        final AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient);
+        final AwTestContainerView testView =
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
         final AwContents awContents = testView.getAwContents();
 
         TestWebServer webServer = TestWebServer.start();
@@ -298,10 +332,11 @@
             // the page load completes which makes it slightly hard to test.
             final Bitmap defaultFavicon = awContents.getFavicon();
 
-            getAwSettingsOnUiThread(awContents).setImagesEnabled(true);
-            loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl);
+            mActivityTestRule.getAwSettingsOnUiThread(awContents).setImagesEnabled(true);
+            mActivityTestRule.loadUrlSync(
+                    awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl);
 
-            pollUiThread(new Callable<Boolean>() {
+            mActivityTestRule.pollUiThread(new Callable<Boolean>() {
                 @Override
                 public Boolean call() {
                     return awContents.getFavicon() != null
@@ -312,19 +347,21 @@
             final Object originalFaviconSource = (new URL(faviconUrl)).getContent();
             final Bitmap originalFavicon =
                     BitmapFactory.decodeStream((InputStream) originalFaviconSource);
-            assertNotNull(originalFavicon);
+            Assert.assertNotNull(originalFavicon);
 
-            assertTrue(awContents.getFavicon().sameAs(originalFavicon));
+            Assert.assertTrue(awContents.getFavicon().sameAs(originalFavicon));
 
         } finally {
             webServer.shutdown();
         }
     }
 
+    @Test
     @Feature({"AndroidWebView", "Downloads"})
     @SmallTest
     public void testDownload() throws Throwable {
-        AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient);
+        AwTestContainerView testView =
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
         AwContents awContents = testView.getAwContents();
 
         final String data = "download data";
@@ -343,42 +380,47 @@
             final OnDownloadStartHelper downloadStartHelper =
                     mContentsClient.getOnDownloadStartHelper();
             final int callCount = downloadStartHelper.getCallCount();
-            loadUrlAsync(awContents, pageUrl);
+            mActivityTestRule.loadUrlAsync(awContents, pageUrl);
             downloadStartHelper.waitForCallback(callCount);
 
-            assertEquals(pageUrl, downloadStartHelper.getUrl());
-            assertEquals(contentDisposition, downloadStartHelper.getContentDisposition());
-            assertEquals(mimeType, downloadStartHelper.getMimeType());
-            assertEquals(data.length(), downloadStartHelper.getContentLength());
+            Assert.assertEquals(pageUrl, downloadStartHelper.getUrl());
+            Assert.assertEquals(contentDisposition, downloadStartHelper.getContentDisposition());
+            Assert.assertEquals(mimeType, downloadStartHelper.getMimeType());
+            Assert.assertEquals(data.length(), downloadStartHelper.getContentLength());
         } finally {
             webServer.shutdown();
         }
     }
 
+    @Test
     @Feature({"AndroidWebView", "setNetworkAvailable"})
     @SmallTest
     public void testSetNetworkAvailable() throws Throwable {
-        AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient);
+        AwTestContainerView testView =
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
         AwContents awContents = testView.getAwContents();
         String script = "navigator.onLine";
 
-        enableJavaScriptOnUiThread(awContents);
-        loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(),
+        mActivityTestRule.enableJavaScriptOnUiThread(awContents);
+        mActivityTestRule.loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(),
                 ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL);
 
         // Default to "online".
-        assertEquals("true", executeJavaScriptAndWaitForResult(awContents, mContentsClient,
-                script));
+        Assert.assertEquals("true",
+                mActivityTestRule.executeJavaScriptAndWaitForResult(
+                        awContents, mContentsClient, script));
 
         // Forcing "offline".
-        setNetworkAvailableOnUiThread(awContents, false);
-        assertEquals("false", executeJavaScriptAndWaitForResult(awContents, mContentsClient,
-                script));
+        mActivityTestRule.setNetworkAvailableOnUiThread(awContents, false);
+        Assert.assertEquals("false",
+                mActivityTestRule.executeJavaScriptAndWaitForResult(
+                        awContents, mContentsClient, script));
 
         // Forcing "online".
-        setNetworkAvailableOnUiThread(awContents, true);
-        assertEquals("true", executeJavaScriptAndWaitForResult(awContents, mContentsClient,
-                script));
+        mActivityTestRule.setNetworkAvailableOnUiThread(awContents, true);
+        Assert.assertEquals("true",
+                mActivityTestRule.executeJavaScriptAndWaitForResult(
+                        awContents, mContentsClient, script));
     }
 
 
@@ -394,13 +436,15 @@
         }
     }
 
+    @Test
     @Feature({"AndroidWebView", "Android-JavaBridge"})
     @SmallTest
     public void testJavaBridge() throws Throwable {
-        final AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient);
+        final AwTestContainerView testView =
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
         final CallbackHelper callback = new CallbackHelper();
 
-        runTestOnUiThread(new Runnable() {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
                 AwContents awContents = testView.getAwContents();
@@ -413,56 +457,64 @@
         callback.waitForCallback(0, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
     }
 
+    @Test
     @Feature({"AndroidWebView"})
     @SmallTest
     public void testEscapingOfErrorPage() throws Throwable {
-        AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient);
+        AwTestContainerView testView =
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
         AwContents awContents = testView.getAwContents();
         String script = "window.failed == true";
 
-        enableJavaScriptOnUiThread(awContents);
+        mActivityTestRule.enableJavaScriptOnUiThread(awContents);
         CallbackHelper onPageFinishedHelper = mContentsClient.getOnPageFinishedHelper();
         int currentCallCount = onPageFinishedHelper.getCallCount();
-        loadUrlAsync(awContents,
+        mActivityTestRule.loadUrlAsync(awContents,
                 "file:///file-that-does-not-exist#<script>window.failed = true;</script>");
-        onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS,
-                                             TimeUnit.MILLISECONDS);
+        onPageFinishedHelper.waitForCallback(
+                currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
 
-        assertEquals("false", executeJavaScriptAndWaitForResult(awContents, mContentsClient,
-                script));
+        Assert.assertEquals("false",
+                mActivityTestRule.executeJavaScriptAndWaitForResult(
+                        awContents, mContentsClient, script));
     }
 
+    @Test
     @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE")
     @Feature({"AndroidWebView"})
     @SmallTest
     public void testCanInjectHeaders() throws Throwable {
         final AwTestContainerView testContainer =
-                createAwTestContainerViewOnMainSync(mContentsClient);
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
         final AwContents awContents = testContainer.getAwContents();
 
-        enableJavaScriptOnUiThread(awContents);
+        mActivityTestRule.enableJavaScriptOnUiThread(awContents);
 
-        EmbeddedTestServer testServer =
-                EmbeddedTestServer.createAndStartServer(getInstrumentation().getContext());
+        EmbeddedTestServer testServer = EmbeddedTestServer.createAndStartServer(
+                InstrumentationRegistry.getInstrumentation().getContext());
 
         try {
             String url = testServer.getURL("/echoheader?X-foo");
 
             final Map<String, String> extraHeaders = new HashMap<String, String>();
             extraHeaders.put("X-foo", "bar");
-            loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), url, extraHeaders);
+            mActivityTestRule.loadUrlSync(
+                    awContents, mContentsClient.getOnPageFinishedHelper(), url, extraHeaders);
 
-            String xfoo = getJavaScriptResultBodyTextContent(awContents, mContentsClient);
-            assertEquals("bar", xfoo);
+            String xfoo = mActivityTestRule.getJavaScriptResultBodyTextContent(
+                    awContents, mContentsClient);
+            Assert.assertEquals("bar", xfoo);
 
             url = testServer.getURL("/echoheader?Referer");
 
             extraHeaders.clear();
             extraHeaders.put("Referer", "http://www.example.com/");
-            loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), url, extraHeaders);
+            mActivityTestRule.loadUrlSync(
+                    awContents, mContentsClient.getOnPageFinishedHelper(), url, extraHeaders);
 
-            String referer = getJavaScriptResultBodyTextContent(awContents, mContentsClient);
-            assertEquals("http://www.example.com/", referer);
+            String referer = mActivityTestRule.getJavaScriptResultBodyTextContent(
+                    awContents, mContentsClient);
+            Assert.assertEquals("http://www.example.com/", referer);
         } finally {
             testServer.stopAndDestroyServer();
         }
@@ -471,17 +523,19 @@
     // This is a meta test that we don't accidentally turn off hardware
     // acceleration in instrumentation tests without notice. Do not add the
     // @DisableHardwareAccelerationForTest annotation for this test.
+    @Test
     @Feature({"AndroidWebView"})
     @SmallTest
     public void testHardwareModeWorks() throws Throwable {
         AwTestContainerView testContainer =
-                createAwTestContainerViewOnMainSync(mContentsClient);
-        assertTrue(testContainer.isHardwareAccelerated());
-        assertTrue(testContainer.isBackedByHardwareView());
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
+        Assert.assertTrue(testContainer.isHardwareAccelerated());
+        Assert.assertTrue(testContainer.isBackedByHardwareView());
     }
 
     // TODO(hush): more ssl tests. And put the ssl tests into a separate test
     // class.
+    @Test
     @Feature({"AndroidWebView"})
     @SmallTest
     // If the user allows the ssl error, the same ssl error will not trigger
@@ -489,7 +543,7 @@
     // error will still trigger the onReceivedSslError callback.
     public void testSslPreferences() throws Throwable {
         final AwTestContainerView testContainer =
-                createAwTestContainerViewOnMainSync(mContentsClient);
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
         final AwContents awContents = testContainer.getAwContents();
         TestWebServer webServer = TestWebServer.startSsl();
         final String pagePath = "/hello.html";
@@ -499,54 +553,62 @@
                 mContentsClient.getOnReceivedSslErrorHelper();
         int onSslErrorCallCount = onReceivedSslErrorHelper.getCallCount();
 
-        loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl);
+        mActivityTestRule.loadUrlSync(
+                awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl);
 
-        assertEquals(onSslErrorCallCount + 1, onReceivedSslErrorHelper.getCallCount());
-        assertEquals(1, webServer.getRequestCount(pagePath));
+        Assert.assertEquals(onSslErrorCallCount + 1, onReceivedSslErrorHelper.getCallCount());
+        Assert.assertEquals(1, webServer.getRequestCount(pagePath));
 
         // Now load the page again. This time, we expect no ssl error, because
         // user's decision should be remembered.
         onSslErrorCallCount = onReceivedSslErrorHelper.getCallCount();
-        loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl);
-        assertEquals(onSslErrorCallCount, onReceivedSslErrorHelper.getCallCount());
+        mActivityTestRule.loadUrlSync(
+                awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl);
+        Assert.assertEquals(onSslErrorCallCount, onReceivedSslErrorHelper.getCallCount());
 
         // Now clear the ssl preferences then load the same url again. Expect to see
         // onReceivedSslError getting called again.
         awContents.clearSslPreferences();
         onSslErrorCallCount = onReceivedSslErrorHelper.getCallCount();
-        loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl);
-        assertEquals(onSslErrorCallCount + 1, onReceivedSslErrorHelper.getCallCount());
+        mActivityTestRule.loadUrlSync(
+                awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl);
+        Assert.assertEquals(onSslErrorCallCount + 1, onReceivedSslErrorHelper.getCallCount());
 
         // Now clear the stored decisions and tell the client to deny ssl errors.
         awContents.clearSslPreferences();
         mContentsClient.setAllowSslError(false);
         onSslErrorCallCount = onReceivedSslErrorHelper.getCallCount();
-        loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl);
-        assertEquals(onSslErrorCallCount + 1, onReceivedSslErrorHelper.getCallCount());
+        mActivityTestRule.loadUrlSync(
+                awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl);
+        Assert.assertEquals(onSslErrorCallCount + 1, onReceivedSslErrorHelper.getCallCount());
 
         // Now load the same page again. This time, we still expect onReceivedSslError,
         // because we only remember user's decision if it is "allow".
         onSslErrorCallCount = onReceivedSslErrorHelper.getCallCount();
-        loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl);
-        assertEquals(onSslErrorCallCount + 1, onReceivedSslErrorHelper.getCallCount());
+        mActivityTestRule.loadUrlSync(
+                awContents, mContentsClient.getOnPageFinishedHelper(), pageUrl);
+        Assert.assertEquals(onSslErrorCallCount + 1, onReceivedSslErrorHelper.getCallCount());
     }
 
     /**
      * Verifies that Web Notifications and the Push API are not exposed in WebView.
      */
+    @Test
     @Feature({"AndroidWebView"})
     @SmallTest
     public void testPushAndNotificationsDisabled() throws Throwable {
-        AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient);
+        AwTestContainerView testView =
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
         AwContents awContents = testView.getAwContents();
 
         String script = "window.Notification || window.PushManager";
 
-        enableJavaScriptOnUiThread(awContents);
-        loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(),
+        mActivityTestRule.enableJavaScriptOnUiThread(awContents);
+        mActivityTestRule.loadUrlSync(awContents, mContentsClient.getOnPageFinishedHelper(),
                 ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL);
-        assertEquals("null", executeJavaScriptAndWaitForResult(awContents, mContentsClient,
-                script));
+        Assert.assertEquals("null",
+                mActivityTestRule.executeJavaScriptAndWaitForResult(
+                        awContents, mContentsClient, script));
     }
 
     private static class MockBindingManager implements BindingManager {
@@ -573,8 +635,8 @@
                     } catch (InterruptedException e) {
                     }
                 }
-                assertTrue(mForegroundState.size() != 0);
-                assertEquals(inForeground, mForegroundState.get(0).booleanValue());
+                Assert.assertTrue(mForegroundState.size() != 0);
+                Assert.assertEquals(inForeground, mForegroundState.get(0));
                 mForegroundState.remove(0);
                 return;
             }
@@ -612,6 +674,7 @@
     /**
      * Verifies that a child process is actually gets created with WEBVIEW_SANDBOXED_RENDERER flag.
      */
+    @Test
     @Feature({"AndroidWebView"})
     @SmallTest
     @CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER)
@@ -619,21 +682,24 @@
     public void testSandboxedRendererWorks() throws Throwable {
         MockBindingManager bindingManager = new MockBindingManager();
         ChildProcessLauncherHelper.setBindingManagerForTesting(bindingManager);
-        assertFalse(bindingManager.isChildProcessCreated());
+        Assert.assertFalse(bindingManager.isChildProcessCreated());
 
-        AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient);
+        AwTestContainerView testView =
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
         AwContents awContents = testView.getAwContents();
         final String pageTitle = "I am sandboxed";
-        loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(),
+        mActivityTestRule.loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(),
                 "<html><head><title>" + pageTitle + "</title></head></html>", "text/html", false);
-        assertEquals(pageTitle, getTitleOnUiThread(awContents));
+        Assert.assertEquals(pageTitle, mActivityTestRule.getTitleOnUiThread(awContents));
 
-        assertTrue(bindingManager.isChildProcessCreated());
+        Assert.assertTrue(bindingManager.isChildProcessCreated());
 
         // Test end-to-end interaction with the renderer.
-        AwSettings awSettings = getAwSettingsOnUiThread(awContents);
+        AwSettings awSettings = mActivityTestRule.getAwSettingsOnUiThread(awContents);
         awSettings.setJavaScriptEnabled(true);
-        assertEquals("42", JSUtils.executeJavaScriptAndWaitForResult(this, awContents,
+        Assert.assertEquals("42",
+                JSUtils.executeJavaScriptAndWaitForResult(
+                        InstrumentationRegistry.getInstrumentation(), awContents,
                         mContentsClient.getOnEvaluateJavaScriptResultHelper(), "21 + 21"));
     }
 
@@ -641,6 +707,7 @@
      * By default the renderer should be considererd to be in the
      * foreground.
      */
+    @Test
     @Feature({"AndroidWebView"})
     @SmallTest
     @CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER)
@@ -648,14 +715,15 @@
     public void testRendererPriorityStartsHigh() throws Throwable {
         MockBindingManager bindingManager = new MockBindingManager();
         ChildProcessLauncherHelper.setBindingManagerForTesting(bindingManager);
-        assertFalse(bindingManager.isChildProcessCreated());
+        Assert.assertFalse(bindingManager.isChildProcessCreated());
 
-        AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient);
+        AwTestContainerView testView =
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
         AwContents awContents = testView.getAwContents();
-        loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(), "<html></html>",
-                "text/html", false);
+        mActivityTestRule.loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(),
+                "<html></html>", "text/html", false);
 
-        assertTrue(bindingManager.isChildProcessCreated());
+        Assert.assertTrue(bindingManager.isChildProcessCreated());
         bindingManager.assertSetInForegroundCall(true);
     }
 
@@ -663,6 +731,7 @@
      * If we specify that the priority is WAIVED, then the renderer
      * should not be in the foreground.
      */
+    @Test
     @Feature({"AndroidWebView"})
     @SmallTest
     @CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER)
@@ -670,21 +739,22 @@
     public void testRendererPriorityLow() throws Throwable {
         MockBindingManager bindingManager = new MockBindingManager();
         ChildProcessLauncherHelper.setBindingManagerForTesting(bindingManager);
-        assertFalse(bindingManager.isChildProcessCreated());
+        Assert.assertFalse(bindingManager.isChildProcessCreated());
 
-        final AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient);
+        final AwTestContainerView testView =
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
         final AwContents awContents = testView.getAwContents();
-        runTestOnUiThread(new Runnable() {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
                 awContents.setRendererPriorityPolicy(RendererPriority.WAIVED, false);
             }
         });
-        loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(), "<html></html>",
-                "text/html", false);
+        mActivityTestRule.loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(),
+                "<html></html>", "text/html", false);
 
-        assertTrue(awContents.isPageVisible());
-        assertTrue(bindingManager.isChildProcessCreated());
+        Assert.assertTrue(awContents.isPageVisible());
+        Assert.assertTrue(bindingManager.isChildProcessCreated());
         bindingManager.assertSetInForegroundCall(false);
     }
 
@@ -693,6 +763,7 @@
      * background, then pausing the view should send the renderer to
      * the background.
      */
+    @Test
     @Feature({"AndroidWebView"})
     @SmallTest
     @CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER)
@@ -700,23 +771,24 @@
     public void testRendererPriorityManaged() throws Throwable {
         MockBindingManager bindingManager = new MockBindingManager();
         ChildProcessLauncherHelper.setBindingManagerForTesting(bindingManager);
-        assertFalse(bindingManager.isChildProcessCreated());
+        Assert.assertFalse(bindingManager.isChildProcessCreated());
 
-        final AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient);
+        final AwTestContainerView testView =
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
         final AwContents awContents = testView.getAwContents();
-        runTestOnUiThread(new Runnable() {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
                 awContents.setRendererPriorityPolicy(RendererPriority.HIGH, true);
             }
         });
-        loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(), "<html></html>",
-                "text/html", false);
+        mActivityTestRule.loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(),
+                "<html></html>", "text/html", false);
 
-        assertTrue(awContents.isPageVisible());
-        assertTrue(bindingManager.isChildProcessCreated());
+        Assert.assertTrue(awContents.isPageVisible());
+        Assert.assertTrue(bindingManager.isChildProcessCreated());
         bindingManager.assertSetInForegroundCall(true);
-        runTestOnUiThread(new Runnable() {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
                 awContents.onPause();
@@ -725,30 +797,39 @@
         bindingManager.assertSetInForegroundCall(false);
     }
 
+    @Test
     @Feature({"AndroidWebView"})
     @SmallTest
-    @UiThreadTest
     @CommandLineFlags.Add(AwSwitches.WEBVIEW_SANDBOXED_RENDERER)
     @SkipCommandLineParameterization
     public void testPauseDestroyResume() throws Throwable {
-        AwContents awContents;
-        awContents = createAwTestContainerView(mContentsClient).getAwContents();
-        awContents.pauseTimers();
-        awContents.pauseTimers();
-        awContents.destroy();
-        awContents = createAwTestContainerView(mContentsClient).getAwContents();
-        awContents.resumeTimers();
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                AwContents awContents;
+                awContents = mActivityTestRule.createAwTestContainerView(mContentsClient)
+                                     .getAwContents();
+                awContents.pauseTimers();
+                awContents.pauseTimers();
+                awContents.destroy();
+                awContents = mActivityTestRule.createAwTestContainerView(mContentsClient)
+                                     .getAwContents();
+                awContents.resumeTimers();
+            }
+        });
     }
 
     /** Regression test for https://crbug.com/732976. Load a data URL, then immediately
      * after that load a javascript URL. The data URL navigation shouldn't be blocked.
      */
+    @Test
     @LargeTest
     @Feature({"AndroidWebView"})
     public void testJavaScriptUrlAfterLoadData() throws Throwable {
-        AwTestContainerView testView = createAwTestContainerViewOnMainSync(mContentsClient);
+        AwTestContainerView testView =
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
         final AwContents awContents = testView.getAwContents();
-        getInstrumentation().runOnMainSync(new Runnable() {
+        mActivityTestRule.runOnUiThread(new Runnable() {
             @Override
             public void run() {
                 // Run javascript navigation immediately, without waiting for the completion of data
@@ -760,10 +841,10 @@
 
         mContentsClient.getOnPageFinishedHelper().waitForCallback(
                 0, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        assertEquals("data:text/html,<html>test</html>", awContents.getLastCommittedUrl());
+        Assert.assertEquals("data:text/html,<html>test</html>", awContents.getLastCommittedUrl());
 
         TestAwContentsClient.AddMessageToConsoleHelper consoleHelper =
                 mContentsClient.getAddMessageToConsoleHelper();
-        assertEquals(0, consoleHelper.getMessages().size());
+        Assert.assertEquals(0, consoleHelper.getMessages().size());
     }
 }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwSecondBrowserProcessTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwSecondBrowserProcessTest.java
index 328b864..a864b82c 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwSecondBrowserProcessTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwSecondBrowserProcessTest.java
@@ -31,7 +31,7 @@
     private int mSecondBrowserServicePid;
 
     @Override
-    protected boolean needsBrowserProcessStarted() {
+    public boolean needsBrowserProcessStarted() {
         return false;
     }
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
index eb19757..fd5db6f5e 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
@@ -2930,7 +2930,7 @@
     }
 
     @Override
-    protected TestDependencyFactory createTestDependencyFactory() {
+    public TestDependencyFactory createTestDependencyFactory() {
         if (mOverridenFactory == null) {
             return new TestDependencyFactory();
         } else {
@@ -2960,12 +2960,12 @@
         final AwTestContainerView mContainerView = createAwTestContainerViewOnMainSync(client);
         final AwContents awContents = mContainerView.getAwContents();
         enableJavaScriptOnUiThread(awContents);
-        JSUtils.executeJavaScriptAndWaitForResult(this, awContents,
+        JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), awContents,
                 client.getOnEvaluateJavaScriptResultHelper(),
                 "window.emptyDocumentPersistenceTest = true;");
         loadUrlSync(awContents, client.getOnPageFinishedHelper(),
                 ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL);
-        String result = JSUtils.executeJavaScriptAndWaitForResult(this, awContents,
+        String result = JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), awContents,
                 client.getOnEvaluateJavaScriptResultHelper(),
                 "window.emptyDocumentPersistenceTest ? 'set' : 'not set';");
         assertEquals(allow ? "\"set\"" : "\"not set\"", result);
@@ -3038,12 +3038,12 @@
                 awContents, client.getOnPageFinishedHelper(), testPageHtml, "text/html", false);
 
         // Focus on an empty DIV.
-        JSUtils.executeJavaScriptAndWaitForResult(this, awContents,
+        JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), awContents,
                 client.getOnEvaluateJavaScriptResultHelper(), "window.a.focus();");
         assertEquals(1, getSelectionChangeCountForSelectionUpdateTest(awContents, client));
 
         // Create and delete a zero-width space. See crbug.com/698752 for details.
-        JSUtils.executeJavaScriptAndWaitForResult(this, awContents,
+        JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), awContents,
                 client.getOnEvaluateJavaScriptResultHelper(),
                 "(function() {"
                         + "var sel = window.getSelection();"
@@ -3075,16 +3075,16 @@
         String expectedTitle = Integer.toString(mTitleIdx);
         // Since selectionchange event is posted on a message loop, we run another message loop
         // before we get the result. On Chromium both run on the same message loop.
-        JSUtils.executeJavaScriptAndWaitForResult(this, awContents,
+        JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), awContents,
                 client.getOnEvaluateJavaScriptResultHelper(),
                 "setTimeout(function() { document.title = '" + expectedTitle + "'; });");
         pollTitleAs(expectedTitle, awContents);
 
-        String result = JSUtils.executeJavaScriptAndWaitForResult(
-                this, awContents, client.getOnEvaluateJavaScriptResultHelper(), "window.cnt");
+        String result = JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), awContents,
+                client.getOnEvaluateJavaScriptResultHelper(), "window.cnt");
         // Clean up
-        JSUtils.executeJavaScriptAndWaitForResult(
-                this, awContents, client.getOnEvaluateJavaScriptResultHelper(), "window.cnt = 0;");
+        JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), awContents,
+                client.getOnEvaluateJavaScriptResultHelper(), "window.cnt = 0;");
         return Integer.parseInt(result);
     }
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwStrictModeTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwStrictModeTest.java
index 898d9eb..80f6261 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwStrictModeTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwStrictModeTest.java
@@ -33,13 +33,13 @@
     }
 
     @Override
-    protected boolean needsAwBrowserContextCreated() {
+    public boolean needsAwBrowserContextCreated() {
         return false;
     }
 
 
     @Override
-    protected boolean needsBrowserProcessStarted() {
+    public boolean needsBrowserProcessStarted() {
         // Don't start the browser process in AwTestBase - we want to start it ourselves with
         // strictmode policies turned on.
         return false;
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java
index f67a272..c39c643 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java
@@ -9,12 +9,9 @@
 import android.app.Instrumentation;
 import android.content.Context;
 import android.os.Build;
-import android.util.AndroidRuntimeException;
-import android.util.Log;
 import android.view.ViewGroup;
 
 import org.chromium.android_webview.AwBrowserContext;
-import org.chromium.android_webview.AwBrowserProcess;
 import org.chromium.android_webview.AwContents;
 import org.chromium.android_webview.AwContents.DependencyFactory;
 import org.chromium.android_webview.AwContents.InternalAccessDelegate;
@@ -22,18 +19,13 @@
 import org.chromium.android_webview.AwContentsClient;
 import org.chromium.android_webview.AwSettings;
 import org.chromium.android_webview.AwSwitches;
-import org.chromium.android_webview.test.util.GraphicsTestUtils;
-import org.chromium.android_webview.test.util.JSUtils;
-import org.chromium.base.ThreadUtils;
+import org.chromium.android_webview.test.AwTestCommon.AwTestCommonCallback;
+import org.chromium.base.Log;
 import org.chromium.base.test.BaseActivityInstrumentationTestCase;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.InMemorySharedPreferences;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.parameter.CommandLineParameter;
-import org.chromium.content.browser.test.util.Criteria;
-import org.chromium.content.browser.test.util.CriteriaHelper;
-import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPageFinishedHelper;
-import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.net.test.util.TestWebServer;
 
 import java.lang.annotation.Annotation;
@@ -41,94 +33,102 @@
 import java.lang.reflect.Method;
 import java.util.Map;
 import java.util.concurrent.Callable;
-import java.util.concurrent.FutureTask;
-import java.util.concurrent.TimeUnit;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 /**
- * A base class for android_webview tests. WebView only runs on KitKat and later,
- * so make sure no one attempts to run the tests on earlier OS releases.
- *
- * By default, all tests run both in single-process mode, and with sandboxed renderer.
- * If a test doesn't yet work with sandboxed renderer, an entire class, or an individual test
- * method can be marked for single-process testing only by adding the following annotation:
- *
- * @SkipCommandLineParameterization
+ * A base class for android_webview tests. WebView only runs on KitKat and
+ * later, so make sure no one attempts to run the tests on earlier OS releases.
+ * By default, all tests run both in single-process mode, and with sandboxed
+ * renderer. If a test doesn't yet work with sandboxed renderer, an entire
+ * class, or an individual test method can be marked for single-process testing
+ * only by adding @SkipCommandLineParameterization to the test
  */
 @MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT)
 @CommandLineParameter({"", AwSwitches.WEBVIEW_SANDBOXED_RENDERER})
-public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunnerActivity> {
-    public static final long WAIT_TIMEOUT_MS = scaleTimeout(15000);
-    public static final int CHECK_INTERVAL = 100;
+public class AwTestBase extends BaseActivityInstrumentationTestCase<AwTestRunnerActivity>
+        implements AwTestCommonCallback {
     private static final String TAG = "AwTestBase";
-    private static final Pattern MAYBE_QUOTED_STRING = Pattern.compile("^(\"?)(.*)\\1$");
 
-    // The browser context needs to be a process-wide singleton.
-    private AwBrowserContext mBrowserContext;
+    public static final long WAIT_TIMEOUT_MS = scaleTimeout(15000);
+
+    public static final int CHECK_INTERVAL = 100;
+
+    private final AwTestCommon mTestCommon;
 
     public AwTestBase() {
         super(AwTestRunnerActivity.class);
+        mTestCommon = new AwTestCommon(this);
     }
 
     @Override
     protected void setUp() throws Exception {
-        if (needsAwBrowserContextCreated()) {
-            createAwBrowserContext();
-        }
-
-        super.setUp();
-        if (needsBrowserProcessStarted()) {
-            startBrowserProcess();
-        }
+        mTestCommon.setUp();
     }
 
-    protected void createAwBrowserContext() {
-        if (mBrowserContext != null) {
-            throw new AndroidRuntimeException("There should only be one browser context.");
-        }
-        getActivity(); // The Activity must be launched in order to load native code
-        final InMemorySharedPreferences prefs = new InMemorySharedPreferences();
-        final Context appContext = getInstrumentation().getTargetContext().getApplicationContext();
-        getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                mBrowserContext = createAwBrowserContextOnUiThread(prefs, appContext);
-            }
-        });
-    }
-
-    protected AwBrowserContext createAwBrowserContextOnUiThread(
+    @Override
+    public AwBrowserContext createAwBrowserContextOnUiThread(
             InMemorySharedPreferences prefs, Context appContext) {
         return new AwBrowserContext(prefs, appContext);
     }
 
+    @Override
+    public TestDependencyFactory createTestDependencyFactory() {
+        return new TestDependencyFactory();
+    }
+
+    /**
+     * Override this to return false if the test doesn't want to create an
+     * AwBrowserContext automatically.
+     */
+    @Override
+    public boolean needsAwBrowserContextCreated() {
+        return true;
+    }
+
+    /**
+     * Override this to return false if the test doesn't want the browser
+     * startup sequence to be run automatically.
+     *
+     * @return Whether the instrumentation test requires the browser process to
+     *         already be started.
+     */
+    @Override
+    public boolean needsBrowserProcessStarted() {
+        return true;
+    }
+
+    /**
+     * Checks the current test has |clazz| annotation. Note this swallows
+     * NoSuchMethodException and returns false in that case.
+     */
+    @Override
+    public boolean testMethodHasAnnotation(Class<? extends Annotation> clazz) {
+        String testName = getName();
+        Method method = null;
+        try {
+            method = getClass().getMethod(testName);
+        } catch (NoSuchMethodException e) {
+            Log.w(TAG, "Test method name not found.", e);
+            return false;
+        }
+
+        // Cast to AnnotatedElement to work around a compilation failure.
+        // Method.isAnnotationPresent() was removed in Java 8 (which is used by
+        // the Android N SDK),
+        // so compilation with Java 7 fails. See crbug.com/608792.
+        return ((AnnotatedElement) method).isAnnotationPresent(clazz);
+    }
+
+    @Override
+    public void runOnUiThread(Runnable runnable) {
+        getInstrumentation().runOnMainSync(runnable);
+    }
+
+    protected void createAwBrowserContext() {
+        mTestCommon.createAwBrowserContext();
+    }
+
     protected void startBrowserProcess() throws Exception {
-        // The Activity must be launched in order for proper webview statics to be setup.
-        getActivity();
-        getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                AwBrowserProcess.start();
-            }
-        });
-    }
-
-    /**
-     * Override this to return false if the test doesn't want to create an AwBrowserContext
-     * automatically.
-     */
-    protected boolean needsAwBrowserContextCreated() {
-        return true;
-    }
-
-    /**
-     * Override this to return false if the test doesn't want the browser startup sequence to
-     * be run automatically.
-     * @return Whether the instrumentation test requires the browser process to already be started.
-     */
-    protected boolean needsBrowserProcessStarted() {
-        return true;
+        mTestCommon.startBrowserProcess();
     }
 
     /**
@@ -141,28 +141,16 @@
      */
     public <R> R runTestOnUiThreadAndGetResult(Callable<R> callable)
             throws Exception {
-        FutureTask<R> task = new FutureTask<R>(callable);
-        getInstrumentation().runOnMainSync(task);
-        return task.get();
+        return mTestCommon.runTestOnUiThreadAndGetResult(callable);
     }
 
     public void enableJavaScriptOnUiThread(final AwContents awContents) {
-        getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                awContents.getSettings().setJavaScriptEnabled(true);
-            }
-        });
+        mTestCommon.enableJavaScriptOnUiThread(awContents);
     }
 
     public void setNetworkAvailableOnUiThread(final AwContents awContents,
             final boolean networkUp) {
-        getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                awContents.setNetworkAvailable(networkUp);
-            }
-        });
+        mTestCommon.setNetworkAvailableOnUiThread(awContents, networkUp);
     }
 
     /**
@@ -171,30 +159,22 @@
     public void loadUrlSync(final AwContents awContents,
             CallbackHelper onPageFinishedHelper,
             final String url) throws Exception {
-        loadUrlSync(awContents, onPageFinishedHelper, url, null);
+        mTestCommon.loadUrlSync(awContents, onPageFinishedHelper, url);
     }
 
     public void loadUrlSync(final AwContents awContents,
             CallbackHelper onPageFinishedHelper,
             final String url,
             final Map<String, String> extraHeaders) throws Exception {
-        int currentCallCount = onPageFinishedHelper.getCallCount();
-        loadUrlAsync(awContents, url, extraHeaders);
-        onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS,
-                TimeUnit.MILLISECONDS);
+        mTestCommon.loadUrlSync(awContents, onPageFinishedHelper, url, extraHeaders);
     }
 
     public void loadUrlSyncAndExpectError(final AwContents awContents,
             CallbackHelper onPageFinishedHelper,
             CallbackHelper onReceivedErrorHelper,
             final String url) throws Exception {
-        int onErrorCallCount = onReceivedErrorHelper.getCallCount();
-        int onFinishedCallCount = onPageFinishedHelper.getCallCount();
-        loadUrlAsync(awContents, url);
-        onReceivedErrorHelper.waitForCallback(onErrorCallCount, 1, WAIT_TIMEOUT_MS,
-                TimeUnit.MILLISECONDS);
-        onPageFinishedHelper.waitForCallback(onFinishedCallCount, 1, WAIT_TIMEOUT_MS,
-                TimeUnit.MILLISECONDS);
+        mTestCommon.loadUrlSyncAndExpectError(
+                awContents, onPageFinishedHelper, onReceivedErrorHelper, url);
     }
 
     /**
@@ -202,18 +182,13 @@
      */
     public void loadUrlAsync(final AwContents awContents,
             final String url) throws Exception {
-        loadUrlAsync(awContents, url, null);
+        mTestCommon.loadUrlAsync(awContents, url);
     }
 
     public void loadUrlAsync(final AwContents awContents,
             final String url,
             final Map<String, String> extraHeaders) {
-        getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                awContents.loadUrl(url, extraHeaders);
-            }
-        });
+        mTestCommon.loadUrlAsync(awContents, url, extraHeaders);
     }
 
     /**
@@ -222,10 +197,7 @@
     public void postUrlSync(final AwContents awContents,
             CallbackHelper onPageFinishedHelper, final String url,
             byte[] postData) throws Exception {
-        int currentCallCount = onPageFinishedHelper.getCallCount();
-        postUrlAsync(awContents, url, postData);
-        onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS,
-                TimeUnit.MILLISECONDS);
+        mTestCommon.postUrlSync(awContents, onPageFinishedHelper, url, postData);
     }
 
     /**
@@ -233,17 +205,7 @@
      */
     public void postUrlAsync(final AwContents awContents,
             final String url, byte[] postData) throws Exception {
-        class PostUrl implements Runnable {
-            byte[] mPostData;
-            public PostUrl(byte[] postData) {
-                mPostData = postData;
-            }
-            @Override
-            public void run() {
-                awContents.postUrl(url, mPostData);
-            }
-        }
-        getInstrumentation().runOnMainSync(new PostUrl(postData));
+        mTestCommon.postUrlAsync(awContents, url, postData);
     }
 
     /**
@@ -253,10 +215,7 @@
             CallbackHelper onPageFinishedHelper,
             final String data, final String mimeType,
             final boolean isBase64Encoded) throws Exception {
-        int currentCallCount = onPageFinishedHelper.getCallCount();
-        loadDataAsync(awContents, data, mimeType, isBase64Encoded);
-        onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS,
-                TimeUnit.MILLISECONDS);
+        mTestCommon.loadDataSync(awContents, onPageFinishedHelper, data, mimeType, isBase64Encoded);
     }
 
     public void loadDataSyncWithCharset(final AwContents awContents,
@@ -264,16 +223,8 @@
             final String data, final String mimeType,
             final boolean isBase64Encoded, final String charset)
             throws Exception {
-        int currentCallCount = onPageFinishedHelper.getCallCount();
-        getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                awContents.loadUrl(LoadUrlParams.createLoadDataParams(
-                        data, mimeType, isBase64Encoded, charset));
-            }
-        });
-        onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS,
-                TimeUnit.MILLISECONDS);
+        mTestCommon.loadDataSyncWithCharset(
+                awContents, onPageFinishedHelper, data, mimeType, isBase64Encoded, charset);
     }
 
     /**
@@ -282,34 +233,22 @@
     public void loadDataAsync(final AwContents awContents, final String data,
             final String mimeType, final boolean isBase64Encoded)
             throws Exception {
-        getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                awContents.loadData(data, mimeType, isBase64Encoded ? "base64" : null);
-            }
-        });
+        mTestCommon.loadDataAsync(awContents, data, mimeType, isBase64Encoded);
     }
 
     public void loadDataWithBaseUrlSync(final AwContents awContents,
             CallbackHelper onPageFinishedHelper, final String data, final String mimeType,
             final boolean isBase64Encoded, final String baseUrl,
             final String historyUrl) throws Throwable {
-        int currentCallCount = onPageFinishedHelper.getCallCount();
-        loadDataWithBaseUrlAsync(awContents, data, mimeType, isBase64Encoded, baseUrl, historyUrl);
-        onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS,
-                TimeUnit.MILLISECONDS);
+        mTestCommon.loadDataWithBaseUrlSync(awContents, onPageFinishedHelper, data, mimeType,
+                isBase64Encoded, baseUrl, historyUrl);
     }
 
     public void loadDataWithBaseUrlAsync(final AwContents awContents,
             final String data, final String mimeType, final boolean isBase64Encoded,
             final String baseUrl, final String historyUrl) throws Throwable {
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                awContents.loadDataWithBaseURL(
-                        baseUrl, data, mimeType, isBase64Encoded ? "base64" : null, historyUrl);
-            }
-        });
+        mTestCommon.loadDataWithBaseUrlAsync(
+                awContents, data, mimeType, isBase64Encoded, baseUrl, historyUrl);
     }
 
     /**
@@ -317,104 +256,211 @@
      */
     public void reloadSync(final AwContents awContents,
             CallbackHelper onPageFinishedHelper) throws Exception {
-        int currentCallCount = onPageFinishedHelper.getCallCount();
-        getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                awContents.getNavigationController().reload(true);
-            }
-        });
-        onPageFinishedHelper.waitForCallback(currentCallCount, 1, WAIT_TIMEOUT_MS,
-                TimeUnit.MILLISECONDS);
+        mTestCommon.reloadSync(awContents, onPageFinishedHelper);
     }
 
     /**
      * Stops loading on the UI thread.
      */
     public void stopLoading(final AwContents awContents) {
-        getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                awContents.stopLoading();
-            }
-        });
+        mTestCommon.stopLoading(awContents);
     }
 
     public void waitForVisualStateCallback(final AwContents awContents) throws Exception {
-        final CallbackHelper ch = new CallbackHelper();
-        final int chCount = ch.getCallCount();
-        getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                final long requestId = 666;
-                awContents.insertVisualStateCallback(requestId,
-                        new AwContents.VisualStateCallback() {
-                            @Override
-                            public void onComplete(long id) {
-                                assertEquals(requestId, id);
-                                ch.notifyCalled();
-                            }
-                        });
-            }
-        });
-        ch.waitForCallback(chCount);
+        mTestCommon.waitForVisualStateCallback(awContents);
     }
 
     public void insertVisualStateCallbackOnUIThread(final AwContents awContents,
             final long requestId, final AwContents.VisualStateCallback callback) {
-        getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                awContents.insertVisualStateCallback(requestId, callback);
-            }
-        });
+        mTestCommon.insertVisualStateCallbackOnUIThread(awContents, requestId, callback);
     }
 
-    // Waits for the pixel at the center of AwContents to color up into expectedColor.
-    // Note that this is a stricter condition that waiting for a visual state callback,
-    // as visual state callback only indicates that *something* has appeared in WebView.
+    // Waits for the pixel at the center of AwContents to color up into
+    // expectedColor.
+    // Note that this is a stricter condition that waiting for a visual state
+    // callback,
+    // as visual state callback only indicates that *something* has appeared in
+    // WebView.
     public void waitForPixelColorAtCenterOfView(final AwContents awContents,
             final AwTestContainerView testContainerView, final int expectedColor) throws Exception {
-        pollUiThread(new Callable<Boolean>() {
-            @Override
-            public Boolean call() throws Exception {
-                return GraphicsTestUtils.getPixelColorAtCenterOfView(awContents, testContainerView)
-                        == expectedColor;
-            }
-        });
+        mTestCommon.waitForPixelColorAtCenterOfView(awContents, testContainerView, expectedColor);
+    }
+
+    public AwTestContainerView createAwTestContainerView(
+            final AwContentsClient awContentsClient) {
+        return mTestCommon.createAwTestContainerView(awContentsClient);
+    }
+
+    public AwTestContainerView createAwTestContainerView(final AwContentsClient awContentsClient,
+            boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) {
+        return mTestCommon.createAwTestContainerView(
+                awContentsClient, supportsLegacyQuirks, testDependencyFactory);
+    }
+
+    public AwBrowserContext getAwBrowserContext() {
+        return mTestCommon.getAwBrowserContext();
+    }
+
+    public AwTestContainerView createDetachedAwTestContainerView(
+            final AwContentsClient awContentsClient) {
+        return mTestCommon.createDetachedAwTestContainerView(awContentsClient);
+    }
+
+    public AwTestContainerView createDetachedAwTestContainerView(
+            final AwContentsClient awContentsClient, boolean supportsLegacyQuirks,
+            TestDependencyFactory testDependencyFactory) {
+        return mTestCommon.createDetachedAwTestContainerView(
+                awContentsClient, supportsLegacyQuirks, testDependencyFactory);
+    }
+
+    protected boolean isHardwareAcceleratedTest() {
+        return mTestCommon.isHardwareAcceleratedTest();
+    }
+
+    public AwTestContainerView createAwTestContainerViewOnMainSync(
+            final AwContentsClient client) throws Exception {
+        return mTestCommon.createAwTestContainerViewOnMainSync(client);
+    }
+
+    public AwTestContainerView createAwTestContainerViewOnMainSync(
+            final AwContentsClient client, final boolean supportsLegacyQuirks) {
+        return mTestCommon.createAwTestContainerViewOnMainSync(client, supportsLegacyQuirks);
+    }
+
+    public AwTestContainerView createAwTestContainerViewOnMainSync(final AwContentsClient client,
+            final boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) {
+        return mTestCommon.createAwTestContainerViewOnMainSync(
+                client, supportsLegacyQuirks, testDependencyFactory);
+    }
+
+    public void destroyAwContentsOnMainSync(final AwContents awContents) {
+        mTestCommon.destroyAwContentsOnMainSync(awContents);
+    }
+
+    public String getTitleOnUiThread(final AwContents awContents) throws Exception {
+        return mTestCommon.getTitleOnUiThread(awContents);
+    }
+
+    public AwSettings getAwSettingsOnUiThread(
+            final AwContents awContents) throws Exception {
+        return mTestCommon.getAwSettingsOnUiThread(awContents);
     }
 
     /**
-     * Checks the current test has |clazz| annotation. Note this swallows NoSuchMethodException
-     * and returns false in that case.
+     * Verify double quotes in both sides of the raw string. Strip the double
+     * quotes and returns rest of the string.
      */
-    private boolean testMethodHasAnnotation(Class<? extends Annotation> clazz) {
-        String testName = getName();
-        Method method = null;
-        try {
-            method = getClass().getMethod(testName);
-        } catch (NoSuchMethodException e) {
-            Log.w(TAG, "Test method name not found.", e);
-            return false;
-        }
-
-        // Cast to AnnotatedElement to work around a compilation failure.
-        // Method.isAnnotationPresent() was removed in Java 8 (which is used by the Android N SDK),
-        // so compilation with Java 7 fails. See crbug.com/608792.
-        return ((AnnotatedElement) method).isAnnotationPresent(clazz);
+    protected String maybeStripDoubleQuotes(String raw) {
+        return mTestCommon.maybeStripDoubleQuotes(raw);
     }
 
     /**
-     * Factory class used in creation of test AwContents instances.
-     *
-     * Test cases can provide subclass instances to the createAwTest* methods in order to create an
-     * AwContents instance with injected test dependencies.
+     * Executes the given snippet of JavaScript code within the given
+     * ContentView. Returns the result of its execution in JSON format.
+     */
+    public String executeJavaScriptAndWaitForResult(final AwContents awContents,
+            TestAwContentsClient viewClient, final String code) throws Exception {
+        return mTestCommon.executeJavaScriptAndWaitForResult(awContents, viewClient, code);
+    }
+
+    /**
+     * Executes JavaScript code within the given ContentView to get the text content in
+     * document body. Returns the result string without double quotes.
+     */
+    protected String getJavaScriptResultBodyTextContent(
+            final AwContents awContents, final TestAwContentsClient viewClient) throws Exception {
+        return mTestCommon.getJavaScriptResultBodyTextContent(awContents, viewClient);
+    }
+
+    /**
+     * Wrapper around CriteriaHelper.pollInstrumentationThread. This uses AwTestBase-specifc
+     * timeouts and treats timeouts and exceptions as test failures automatically.
+     */
+    public static void pollInstrumentationThread(final Callable<Boolean> callable)
+            throws Exception {
+        AwTestCommon.pollInstrumentationThread(callable);
+    }
+
+    /**
+     * Wrapper around {@link AwTestBase#poll()} but runs the callable on the UI
+     * thread.
+     */
+    public void pollUiThread(final Callable<Boolean> callable) throws Exception {
+        mTestCommon.pollUiThread(callable);
+    }
+
+    /**
+     * Clears the resource cache. Note that the cache is per-application, so
+     * this will clear the cache for all WebViews used.
+     */
+    public void clearCacheOnUiThread(
+            final AwContents awContents,
+            final boolean includeDiskFiles) throws Exception {
+        mTestCommon.clearCacheOnUiThread(awContents, includeDiskFiles);
+    }
+
+    /**
+     * Returns pure page scale.
+     */
+    public float getScaleOnUiThread(final AwContents awContents) throws Exception {
+        return mTestCommon.getScaleOnUiThread(awContents);
+    }
+
+    /**
+     * Returns page scale multiplied by the screen density.
+     */
+    public float getPixelScaleOnUiThread(final AwContents awContents) throws Exception {
+        return mTestCommon.getPixelScaleOnUiThread(awContents);
+    }
+
+    /**
+     * Returns whether a user can zoom the page in.
+     */
+    public boolean canZoomInOnUiThread(final AwContents awContents) throws Exception {
+        return mTestCommon.canZoomInOnUiThread(awContents);
+    }
+
+    /**
+     * Returns whether a user can zoom the page out.
+     */
+    public boolean canZoomOutOnUiThread(final AwContents awContents) throws Exception {
+        return mTestCommon.canZoomOutOnUiThread(awContents);
+    }
+
+    public void killRenderProcessOnUiThreadAsync(final AwContents awContents) throws Exception {
+        mTestCommon.killRenderProcessOnUiThreadAsync(awContents);
+    }
+
+    /**
+     * Loads the main html then triggers the popup window.
+     */
+    public void triggerPopup(final AwContents parentAwContents,
+            TestAwContentsClient parentAwContentsClient, TestWebServer testWebServer,
+            String mainHtml, String popupHtml, String popupPath, String triggerScript)
+            throws Exception {
+        mTestCommon.triggerPopup(parentAwContents, parentAwContentsClient, testWebServer, mainHtml,
+                popupHtml, popupPath, triggerScript);
+    }
+
+    /**
+     * Supplies the popup window with AwContents then waits for the popup window
+     * to finish loading.
+     */
+    public PopupInfo connectPendingPopup(final AwContents parentAwContents) throws Exception {
+        return mTestCommon.connectPendingPopup(parentAwContents);
+    }
+
+    /**
+     * Factory class used in creation of test AwContents instances. Test cases
+     * can provide subclass instances to the createAwTest* methods in order to
+     * create an AwContents instance with injected test dependencies.
      */
     public static class TestDependencyFactory extends AwContents.DependencyFactory {
-        public AwTestContainerView createAwTestContainerView(AwTestRunnerActivity activity,
-                boolean allowHardwareAcceleration) {
+        public AwTestContainerView createAwTestContainerView(
+                AwTestRunnerActivity activity, boolean allowHardwareAcceleration) {
             return new AwTestContainerView(activity, allowHardwareAcceleration);
         }
+
         public AwSettings createAwSettings(Context context, boolean supportsLegacyQuirks) {
             return new AwSettings(context, false /* isAccessFromFileURLsGrantedByDefault */,
                     supportsLegacyQuirks, false /* allowEmptyDocumentPersistence */,
@@ -432,279 +478,6 @@
         }
     }
 
-    protected TestDependencyFactory createTestDependencyFactory() {
-        return new TestDependencyFactory();
-    }
-
-    public AwTestContainerView createAwTestContainerView(
-            final AwContentsClient awContentsClient) {
-        return createAwTestContainerView(awContentsClient, false, null);
-    }
-
-    public AwTestContainerView createAwTestContainerView(final AwContentsClient awContentsClient,
-            boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) {
-        AwTestContainerView testContainerView = createDetachedAwTestContainerView(
-                awContentsClient, supportsLegacyQuirks, testDependencyFactory);
-        getActivity().addView(testContainerView);
-        testContainerView.requestFocus();
-        return testContainerView;
-    }
-
-    public AwBrowserContext getAwBrowserContext() {
-        return mBrowserContext;
-    }
-
-    public AwTestContainerView createDetachedAwTestContainerView(
-            final AwContentsClient awContentsClient) {
-        return createDetachedAwTestContainerView(awContentsClient, false, null);
-    }
-
-    public AwTestContainerView createDetachedAwTestContainerView(
-            final AwContentsClient awContentsClient, boolean supportsLegacyQuirks,
-            TestDependencyFactory testDependencyFactory) {
-        if (testDependencyFactory == null) {
-            testDependencyFactory = createTestDependencyFactory();
-        }
-        boolean allowHardwareAcceleration = isHardwareAcceleratedTest();
-        final AwTestContainerView testContainerView =
-                testDependencyFactory.createAwTestContainerView(
-                        getActivity(), allowHardwareAcceleration);
-
-        AwSettings awSettings =
-                testDependencyFactory.createAwSettings(getActivity(), supportsLegacyQuirks);
-        AwContents awContents = testDependencyFactory.createAwContents(mBrowserContext,
-                testContainerView, testContainerView.getContext(),
-                testContainerView.getInternalAccessDelegate(),
-                testContainerView.getNativeDrawGLFunctorFactory(), awContentsClient, awSettings,
-                testDependencyFactory);
-        testContainerView.initialize(awContents);
-        return testContainerView;
-    }
-
-    protected boolean isHardwareAcceleratedTest() {
-        return !testMethodHasAnnotation(DisableHardwareAccelerationForTest.class);
-    }
-
-    public AwTestContainerView createAwTestContainerViewOnMainSync(
-            final AwContentsClient client) throws Exception {
-        return createAwTestContainerViewOnMainSync(client, false, null);
-    }
-
-    public AwTestContainerView createAwTestContainerViewOnMainSync(
-            final AwContentsClient client, final boolean supportsLegacyQuirks) {
-        return createAwTestContainerViewOnMainSync(client, supportsLegacyQuirks, null);
-    }
-
-    public AwTestContainerView createAwTestContainerViewOnMainSync(final AwContentsClient client,
-            final boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) {
-        return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<AwTestContainerView>() {
-            @Override
-            public AwTestContainerView call() {
-                return createAwTestContainerView(
-                        client, supportsLegacyQuirks, testDependencyFactory);
-            }
-        });
-    }
-
-    public void destroyAwContentsOnMainSync(final AwContents awContents) {
-        if (awContents == null) return;
-        getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                awContents.destroy();
-            }
-        });
-    }
-
-    public String getTitleOnUiThread(final AwContents awContents) throws Exception {
-        return runTestOnUiThreadAndGetResult(new Callable<String>() {
-            @Override
-            public String call() throws Exception {
-                return awContents.getTitle();
-            }
-        });
-    }
-
-    public AwSettings getAwSettingsOnUiThread(
-            final AwContents awContents) throws Exception {
-        return runTestOnUiThreadAndGetResult(new Callable<AwSettings>() {
-            @Override
-            public AwSettings call() throws Exception {
-                return awContents.getSettings();
-            }
-        });
-    }
-
-    /**
-     * Verify double quotes in both sides of the raw string. Strip the double quotes and
-     * returns rest of the string.
-     */
-    protected String maybeStripDoubleQuotes(String raw) {
-        assertNotNull(raw);
-        Matcher m = MAYBE_QUOTED_STRING.matcher(raw);
-        assertTrue(m.matches());
-        return m.group(2);
-    }
-
-    /**
-     * Executes the given snippet of JavaScript code within the given ContentView. Returns the
-     * result of its execution in JSON format.
-     */
-    public String executeJavaScriptAndWaitForResult(final AwContents awContents,
-            TestAwContentsClient viewClient, final String code) throws Exception {
-        return JSUtils.executeJavaScriptAndWaitForResult(this, awContents,
-                viewClient.getOnEvaluateJavaScriptResultHelper(),
-                code);
-    }
-
-    /**
-     * Executes JavaScript code within the given ContentView to get the text content in
-     * document body. Returns the result string without double quotes.
-     */
-    protected String getJavaScriptResultBodyTextContent(
-            final AwContents awContents, final TestAwContentsClient viewClient) throws Exception {
-        String raw = executeJavaScriptAndWaitForResult(
-                awContents, viewClient, "document.body.textContent");
-        return maybeStripDoubleQuotes(raw);
-    }
-
-    /**
-     * Wrapper around CriteriaHelper.pollInstrumentationThread. This uses AwTestBase-specifc
-     * timeouts and treats timeouts and exceptions as test failures automatically.
-     */
-    public static void pollInstrumentationThread(final Callable<Boolean> callable)
-            throws Exception {
-        CriteriaHelper.pollInstrumentationThread(new Criteria() {
-            @Override
-            public boolean isSatisfied() {
-                try {
-                    return callable.call();
-                } catch (Throwable e) {
-                    Log.e(TAG, "Exception while polling.", e);
-                    return false;
-                }
-            }
-        }, WAIT_TIMEOUT_MS, CHECK_INTERVAL);
-    }
-
-    /**
-     * Wrapper around {@link AwTestBase#poll()} but runs the callable on the UI thread.
-     */
-    public void pollUiThread(final Callable<Boolean> callable) throws Exception {
-        pollInstrumentationThread(new Callable<Boolean>() {
-            @Override
-            public Boolean call() throws Exception {
-                return runTestOnUiThreadAndGetResult(callable);
-            }
-        });
-    }
-
-    /**
-     * Clears the resource cache. Note that the cache is per-application, so this will clear the
-     * cache for all WebViews used.
-     */
-    public void clearCacheOnUiThread(
-            final AwContents awContents,
-            final boolean includeDiskFiles) throws Exception {
-        getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                awContents.clearCache(includeDiskFiles);
-            }
-        });
-    }
-
-    /**
-     * Returns pure page scale.
-     */
-    public float getScaleOnUiThread(final AwContents awContents) throws Exception {
-        return runTestOnUiThreadAndGetResult(new Callable<Float>() {
-            @Override
-            public Float call() throws Exception {
-                return awContents.getPageScaleFactor();
-            }
-        });
-    }
-
-    /**
-     * Returns page scale multiplied by the screen density.
-     */
-    public float getPixelScaleOnUiThread(final AwContents awContents) throws Exception {
-        return runTestOnUiThreadAndGetResult(new Callable<Float>() {
-            @Override
-            public Float call() throws Exception {
-                return awContents.getScale();
-            }
-        });
-    }
-
-    /**
-     * Returns whether a user can zoom the page in.
-     */
-    public boolean canZoomInOnUiThread(final AwContents awContents) throws Exception {
-        return runTestOnUiThreadAndGetResult(new Callable<Boolean>() {
-            @Override
-            public Boolean call() throws Exception {
-                return awContents.canZoomIn();
-            }
-        });
-    }
-
-    /**
-     * Returns whether a user can zoom the page out.
-     */
-    public boolean canZoomOutOnUiThread(final AwContents awContents) throws Exception {
-        return runTestOnUiThreadAndGetResult(new Callable<Boolean>() {
-            @Override
-            public Boolean call() throws Exception {
-                return awContents.canZoomOut();
-            }
-        });
-    }
-
-    public void killRenderProcessOnUiThreadAsync(final AwContents awContents) throws Exception {
-        getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                awContents.killRenderProcess();
-            }
-        });
-    }
-
-    /**
-     * Loads the main html then triggers the popup window.
-     */
-    public void triggerPopup(final AwContents parentAwContents,
-            TestAwContentsClient parentAwContentsClient, TestWebServer testWebServer,
-            String mainHtml, String popupHtml, String popupPath, String triggerScript)
-            throws Exception {
-        enableJavaScriptOnUiThread(parentAwContents);
-        getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                parentAwContents.getSettings().setSupportMultipleWindows(true);
-                parentAwContents.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
-            }
-        });
-
-        final String parentUrl = testWebServer.setResponse("/popupParent.html", mainHtml, null);
-        if (popupHtml != null) {
-            testWebServer.setResponse(popupPath, popupHtml, null);
-        } else {
-            testWebServer.setResponseWithNoContentStatus(popupPath);
-        }
-
-        parentAwContentsClient.getOnCreateWindowHelper().setReturnValue(true);
-        loadUrlSync(parentAwContents, parentAwContentsClient.getOnPageFinishedHelper(), parentUrl);
-
-        TestAwContentsClient.OnCreateWindowHelper onCreateWindowHelper =
-                parentAwContentsClient.getOnCreateWindowHelper();
-        int currentCallCount = onCreateWindowHelper.getCallCount();
-        parentAwContents.evaluateJavaScriptForTests(triggerScript, null);
-        onCreateWindowHelper.waitForCallback(
-                currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
-    }
-
     /**
      * POD object for holding references to helper objects of a popup window.
      */
@@ -712,6 +485,7 @@
         public final TestAwContentsClient popupContentsClient;
         public final AwTestContainerView popupContainerView;
         public final AwContents popupContents;
+
         public PopupInfo(TestAwContentsClient popupContentsClient,
                 AwTestContainerView popupContainerView, AwContents popupContents) {
             this.popupContentsClient = popupContentsClient;
@@ -719,37 +493,4 @@
             this.popupContents = popupContents;
         }
     }
-
-    /**
-     * Supplies the popup window with AwContents then waits for the popup window to finish loading.
-     */
-    public PopupInfo connectPendingPopup(final AwContents parentAwContents) throws Exception {
-        TestAwContentsClient popupContentsClient;
-        AwTestContainerView popupContainerView;
-        final AwContents popupContents;
-        popupContentsClient = new TestAwContentsClient();
-        popupContainerView = createAwTestContainerViewOnMainSync(popupContentsClient);
-        popupContents = popupContainerView.getAwContents();
-        enableJavaScriptOnUiThread(popupContents);
-
-        getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                parentAwContents.supplyContentsForPopup(popupContents);
-            }
-        });
-
-        OnPageFinishedHelper onPageFinishedHelper = popupContentsClient.getOnPageFinishedHelper();
-        int finishCallCount = onPageFinishedHelper.getCallCount();
-        TestAwContentsClient.OnReceivedTitleHelper onReceivedTitleHelper =
-                popupContentsClient.getOnReceivedTitleHelper();
-        int titleCallCount = onReceivedTitleHelper.getCallCount();
-
-        onPageFinishedHelper.waitForCallback(finishCallCount, 1, WAIT_TIMEOUT_MS,
-                TimeUnit.MILLISECONDS);
-        onReceivedTitleHelper.waitForCallback(titleCallCount, 1, WAIT_TIMEOUT_MS,
-                TimeUnit.MILLISECONDS);
-
-        return new PopupInfo(popupContentsClient, popupContainerView, popupContents);
-    }
 }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwTestCommon.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwTestCommon.java
new file mode 100644
index 0000000..5ea6498
--- /dev/null
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwTestCommon.java
@@ -0,0 +1,570 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.android_webview.test;
+
+import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.util.AndroidRuntimeException;
+
+import org.junit.Assert;
+
+import org.chromium.android_webview.AwBrowserContext;
+import org.chromium.android_webview.AwBrowserProcess;
+import org.chromium.android_webview.AwContents;
+import org.chromium.android_webview.AwContentsClient;
+import org.chromium.android_webview.AwSettings;
+import org.chromium.android_webview.test.AwTestBase.PopupInfo;
+import org.chromium.android_webview.test.AwTestBase.TestDependencyFactory;
+import org.chromium.android_webview.test.util.GraphicsTestUtils;
+import org.chromium.android_webview.test.util.JSUtils;
+import org.chromium.base.Log;
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.test.util.CallbackHelper;
+import org.chromium.base.test.util.InMemorySharedPreferences;
+import org.chromium.content.browser.test.util.Criteria;
+import org.chromium.content.browser.test.util.CriteriaHelper;
+import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPageFinishedHelper;
+import org.chromium.content_public.browser.LoadUrlParams;
+import org.chromium.net.test.util.TestWebServer;
+
+import java.lang.annotation.Annotation;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+// TODO(yolandyan): move this class to its test rule once JUnit4 migration is over
+final class AwTestCommon {
+    static final long WAIT_TIMEOUT_MS = scaleTimeout(15000);
+
+    static final int CHECK_INTERVAL = 100;
+
+    private static final String TAG = "AwTestCommon";
+
+    private static final Pattern MAYBE_QUOTED_STRING = Pattern.compile("^(\"?)(.*)\\1$");
+
+    // The browser context needs to be a process-wide singleton.
+    private AwBrowserContext mBrowserContext;
+
+    private final AwTestCommonCallback mCallback;
+
+    AwTestCommon(AwTestCommonCallback callback) {
+        mCallback = callback;
+    }
+
+    void setUp() throws Exception {
+        if (mCallback.needsAwBrowserContextCreated()) {
+            createAwBrowserContext();
+        }
+        if (mCallback.needsBrowserProcessStarted()) {
+            startBrowserProcess();
+        }
+    }
+
+    void createAwBrowserContext() {
+        if (mBrowserContext != null) {
+            throw new AndroidRuntimeException("There should only be one browser context.");
+        }
+        mCallback.getActivity(); // The Activity must be launched in order to load native code
+        final InMemorySharedPreferences prefs = new InMemorySharedPreferences();
+        final Context appContext =
+                mCallback.getInstrumentation().getTargetContext().getApplicationContext();
+        mCallback.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mBrowserContext =
+                        mCallback.createAwBrowserContextOnUiThread(prefs, appContext);
+            }
+        });
+    }
+
+    void startBrowserProcess() throws Exception {
+        // The Activity must be launched in order for proper webview statics to be setup.
+        mCallback.getActivity();
+        mCallback.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                AwBrowserProcess.start();
+            }
+        });
+    }
+
+    <R> R runTestOnUiThreadAndGetResult(Callable<R> callable) throws Exception {
+        FutureTask<R> task = new FutureTask<R>(callable);
+        mCallback.getInstrumentation().runOnMainSync(task);
+        return task.get();
+    }
+
+    void enableJavaScriptOnUiThread(final AwContents awContents) {
+        mCallback.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                awContents.getSettings().setJavaScriptEnabled(true);
+            }
+        });
+    }
+
+    void setNetworkAvailableOnUiThread(final AwContents awContents, final boolean networkUp) {
+        mCallback.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                awContents.setNetworkAvailable(networkUp);
+            }
+        });
+    }
+
+    void loadUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper,
+            final String url) throws Exception {
+        loadUrlSync(awContents, onPageFinishedHelper, url, null);
+    }
+
+    void loadUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper,
+            final String url, final Map<String, String> extraHeaders) throws Exception {
+        int currentCallCount = onPageFinishedHelper.getCallCount();
+        loadUrlAsync(awContents, url, extraHeaders);
+        onPageFinishedHelper.waitForCallback(
+                currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+    }
+
+    void loadUrlSyncAndExpectError(final AwContents awContents, CallbackHelper onPageFinishedHelper,
+            CallbackHelper onReceivedErrorHelper, final String url) throws Exception {
+        int onErrorCallCount = onReceivedErrorHelper.getCallCount();
+        int onFinishedCallCount = onPageFinishedHelper.getCallCount();
+        loadUrlAsync(awContents, url);
+        onReceivedErrorHelper.waitForCallback(
+                onErrorCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        onPageFinishedHelper.waitForCallback(
+                onFinishedCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+    }
+
+    void loadUrlAsync(final AwContents awContents, final String url) throws Exception {
+        loadUrlAsync(awContents, url, null);
+    }
+
+    void loadUrlAsync(
+            final AwContents awContents, final String url, final Map<String, String> extraHeaders) {
+        mCallback.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                awContents.loadUrl(url, extraHeaders);
+            }
+        });
+    }
+
+    void postUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper,
+            final String url, byte[] postData) throws Exception {
+        int currentCallCount = onPageFinishedHelper.getCallCount();
+        postUrlAsync(awContents, url, postData);
+        onPageFinishedHelper.waitForCallback(
+                currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+    }
+
+    void postUrlAsync(final AwContents awContents, final String url, byte[] postData)
+            throws Exception {
+        class PostUrl implements Runnable {
+            byte[] mPostData;
+            public PostUrl(byte[] postData) {
+                mPostData = postData;
+            }
+            @Override
+            public void run() {
+                awContents.postUrl(url, mPostData);
+            }
+        }
+        mCallback.getInstrumentation().runOnMainSync(new PostUrl(postData));
+    }
+
+    void loadDataSync(final AwContents awContents, CallbackHelper onPageFinishedHelper,
+            final String data, final String mimeType, final boolean isBase64Encoded)
+            throws Exception {
+        int currentCallCount = onPageFinishedHelper.getCallCount();
+        loadDataAsync(awContents, data, mimeType, isBase64Encoded);
+        onPageFinishedHelper.waitForCallback(
+                currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+    }
+
+    void loadDataSyncWithCharset(final AwContents awContents, CallbackHelper onPageFinishedHelper,
+            final String data, final String mimeType, final boolean isBase64Encoded,
+            final String charset) throws Exception {
+        int currentCallCount = onPageFinishedHelper.getCallCount();
+        mCallback.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                awContents.loadUrl(LoadUrlParams.createLoadDataParams(
+                        data, mimeType, isBase64Encoded, charset));
+            }
+        });
+        onPageFinishedHelper.waitForCallback(
+                currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+    }
+
+    void loadDataAsync(final AwContents awContents, final String data, final String mimeType,
+            final boolean isBase64Encoded) throws Exception {
+        mCallback.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                awContents.loadData(data, mimeType, isBase64Encoded ? "base64" : null);
+            }
+        });
+    }
+
+    void loadDataWithBaseUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper,
+            final String data, final String mimeType, final boolean isBase64Encoded,
+            final String baseUrl, final String historyUrl) throws Throwable {
+        int currentCallCount = onPageFinishedHelper.getCallCount();
+        loadDataWithBaseUrlAsync(awContents, data, mimeType, isBase64Encoded, baseUrl, historyUrl);
+        onPageFinishedHelper.waitForCallback(
+                currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+    }
+
+    void loadDataWithBaseUrlAsync(final AwContents awContents, final String data,
+            final String mimeType, final boolean isBase64Encoded, final String baseUrl,
+            final String historyUrl) throws Throwable {
+        mCallback.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                awContents.loadDataWithBaseURL(
+                        baseUrl, data, mimeType, isBase64Encoded ? "base64" : null, historyUrl);
+            }
+        });
+    }
+
+    void reloadSync(final AwContents awContents, CallbackHelper onPageFinishedHelper)
+            throws Exception {
+        int currentCallCount = onPageFinishedHelper.getCallCount();
+        mCallback.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                awContents.getNavigationController().reload(true);
+            }
+        });
+        onPageFinishedHelper.waitForCallback(
+                currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+    }
+
+    void stopLoading(final AwContents awContents) {
+        mCallback.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                awContents.stopLoading();
+            }
+        });
+    }
+
+    void waitForVisualStateCallback(final AwContents awContents) throws Exception {
+        final CallbackHelper ch = new CallbackHelper();
+        final int chCount = ch.getCallCount();
+        mCallback.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                final long requestId = 666;
+                awContents.insertVisualStateCallback(
+                        requestId, new AwContents.VisualStateCallback() {
+                            @Override
+                            public void onComplete(long id) {
+                                Assert.assertEquals(requestId, id);
+                                ch.notifyCalled();
+                            }
+                        });
+            }
+        });
+        ch.waitForCallback(chCount);
+    }
+
+    void insertVisualStateCallbackOnUIThread(final AwContents awContents, final long requestId,
+            final AwContents.VisualStateCallback callback) {
+        mCallback.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                awContents.insertVisualStateCallback(requestId, callback);
+            }
+        });
+    }
+
+    void waitForPixelColorAtCenterOfView(final AwContents awContents,
+            final AwTestContainerView testContainerView, final int expectedColor) throws Exception {
+        pollUiThread(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                return GraphicsTestUtils.getPixelColorAtCenterOfView(awContents, testContainerView)
+                        == expectedColor;
+            }
+        });
+    }
+
+    AwTestContainerView createAwTestContainerView(final AwContentsClient awContentsClient) {
+        return createAwTestContainerView(awContentsClient, false, null);
+    }
+
+    AwTestContainerView createAwTestContainerView(final AwContentsClient awContentsClient,
+            boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) {
+        AwTestContainerView testContainerView = createDetachedAwTestContainerView(
+                awContentsClient, supportsLegacyQuirks, testDependencyFactory);
+        mCallback.getActivity().addView(testContainerView);
+        testContainerView.requestFocus();
+        return testContainerView;
+    }
+
+    AwBrowserContext getAwBrowserContext() {
+        return mBrowserContext;
+    }
+
+    AwTestContainerView createDetachedAwTestContainerView(final AwContentsClient awContentsClient) {
+        return createDetachedAwTestContainerView(awContentsClient, false, null);
+    }
+
+    AwTestContainerView createDetachedAwTestContainerView(final AwContentsClient awContentsClient,
+            boolean supportsLegacyQuirks, TestDependencyFactory testDependencyFactory) {
+        if (testDependencyFactory == null) {
+            testDependencyFactory = mCallback.createTestDependencyFactory();
+        }
+        boolean allowHardwareAcceleration = isHardwareAcceleratedTest();
+        final AwTestContainerView testContainerView =
+                testDependencyFactory.createAwTestContainerView(
+                        mCallback.getActivity(), allowHardwareAcceleration);
+
+        AwSettings awSettings = testDependencyFactory.createAwSettings(
+                mCallback.getActivity(), supportsLegacyQuirks);
+        AwContents awContents = testDependencyFactory.createAwContents(mBrowserContext,
+                testContainerView, testContainerView.getContext(),
+                testContainerView.getInternalAccessDelegate(),
+                testContainerView.getNativeDrawGLFunctorFactory(), awContentsClient, awSettings,
+                testDependencyFactory);
+        testContainerView.initialize(awContents);
+        return testContainerView;
+    }
+
+    boolean isHardwareAcceleratedTest() {
+        return !mCallback.testMethodHasAnnotation(DisableHardwareAccelerationForTest.class);
+    }
+
+    AwTestContainerView createAwTestContainerViewOnMainSync(final AwContentsClient client)
+            throws Exception {
+        return createAwTestContainerViewOnMainSync(client, false, null);
+    }
+
+    AwTestContainerView createAwTestContainerViewOnMainSync(
+            final AwContentsClient client, final boolean supportsLegacyQuirks) {
+        return createAwTestContainerViewOnMainSync(client, supportsLegacyQuirks, null);
+    }
+
+    AwTestContainerView createAwTestContainerViewOnMainSync(final AwContentsClient client,
+            final boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) {
+        return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<AwTestContainerView>() {
+            @Override
+            public AwTestContainerView call() {
+                return createAwTestContainerView(
+                        client, supportsLegacyQuirks, testDependencyFactory);
+            }
+        });
+    }
+
+    void destroyAwContentsOnMainSync(final AwContents awContents) {
+        if (awContents == null) return;
+        mCallback.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                awContents.destroy();
+            }
+        });
+    }
+
+    String getTitleOnUiThread(final AwContents awContents) throws Exception {
+        return runTestOnUiThreadAndGetResult(new Callable<String>() {
+            @Override
+            public String call() throws Exception {
+                return awContents.getTitle();
+            }
+        });
+    }
+
+    AwSettings getAwSettingsOnUiThread(final AwContents awContents) throws Exception {
+        return runTestOnUiThreadAndGetResult(new Callable<AwSettings>() {
+            @Override
+            public AwSettings call() throws Exception {
+                return awContents.getSettings();
+            }
+        });
+    }
+
+    String maybeStripDoubleQuotes(String raw) {
+        Assert.assertNotNull(raw);
+        Matcher m = MAYBE_QUOTED_STRING.matcher(raw);
+        Assert.assertTrue(m.matches());
+        return m.group(2);
+    }
+
+    String executeJavaScriptAndWaitForResult(final AwContents awContents,
+            TestAwContentsClient viewClient, final String code) throws Exception {
+        return JSUtils.executeJavaScriptAndWaitForResult(mCallback.getInstrumentation(), awContents,
+                viewClient.getOnEvaluateJavaScriptResultHelper(), code);
+    }
+
+    /**
+     * Executes JavaScript code within the given ContentView to get the text content in
+     * document body. Returns the result string without double quotes.
+     */
+    String getJavaScriptResultBodyTextContent(
+            final AwContents awContents, final TestAwContentsClient viewClient) throws Exception {
+        String raw = executeJavaScriptAndWaitForResult(
+                awContents, viewClient, "document.body.textContent");
+        return maybeStripDoubleQuotes(raw);
+    }
+
+    static void pollInstrumentationThread(final Callable<Boolean> callable) throws Exception {
+        CriteriaHelper.pollInstrumentationThread(new Criteria() {
+            @Override
+            public boolean isSatisfied() {
+                try {
+                    return callable.call();
+                } catch (Throwable e) {
+                    Log.e(TAG, "Exception while polling.", e);
+                    return false;
+                }
+            }
+        }, WAIT_TIMEOUT_MS, CHECK_INTERVAL);
+    }
+
+    void pollUiThread(final Callable<Boolean> callable) throws Exception {
+        pollInstrumentationThread(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                return runTestOnUiThreadAndGetResult(callable);
+            }
+        });
+    }
+
+    void clearCacheOnUiThread(final AwContents awContents, final boolean includeDiskFiles)
+            throws Exception {
+        mCallback.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                awContents.clearCache(includeDiskFiles);
+            }
+        });
+    }
+
+    float getScaleOnUiThread(final AwContents awContents) throws Exception {
+        return runTestOnUiThreadAndGetResult(new Callable<Float>() {
+            @Override
+            public Float call() throws Exception {
+                return awContents.getPageScaleFactor();
+            }
+        });
+    }
+
+    float getPixelScaleOnUiThread(final AwContents awContents) throws Exception {
+        return runTestOnUiThreadAndGetResult(new Callable<Float>() {
+            @Override
+            public Float call() throws Exception {
+                return awContents.getScale();
+            }
+        });
+    }
+
+    boolean canZoomInOnUiThread(final AwContents awContents) throws Exception {
+        return runTestOnUiThreadAndGetResult(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                return awContents.canZoomIn();
+            }
+        });
+    }
+
+    boolean canZoomOutOnUiThread(final AwContents awContents) throws Exception {
+        return runTestOnUiThreadAndGetResult(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                return awContents.canZoomOut();
+            }
+        });
+    }
+
+    void killRenderProcessOnUiThreadAsync(final AwContents awContents) throws Exception {
+        mCallback.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                awContents.killRenderProcess();
+            }
+        });
+    }
+
+    void triggerPopup(final AwContents parentAwContents,
+            TestAwContentsClient parentAwContentsClient, TestWebServer testWebServer,
+            String mainHtml, String popupHtml, String popupPath, String triggerScript)
+            throws Exception {
+        enableJavaScriptOnUiThread(parentAwContents);
+        mCallback.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                parentAwContents.getSettings().setSupportMultipleWindows(true);
+                parentAwContents.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
+            }
+        });
+
+        final String parentUrl = testWebServer.setResponse("/popupParent.html", mainHtml, null);
+        if (popupHtml != null) {
+            testWebServer.setResponse(popupPath, popupHtml, null);
+        } else {
+            testWebServer.setResponseWithNoContentStatus(popupPath);
+        }
+
+        parentAwContentsClient.getOnCreateWindowHelper().setReturnValue(true);
+        loadUrlSync(parentAwContents, parentAwContentsClient.getOnPageFinishedHelper(), parentUrl);
+
+        TestAwContentsClient.OnCreateWindowHelper onCreateWindowHelper =
+                parentAwContentsClient.getOnCreateWindowHelper();
+        int currentCallCount = onCreateWindowHelper.getCallCount();
+        parentAwContents.evaluateJavaScriptForTests(triggerScript, null);
+        onCreateWindowHelper.waitForCallback(
+                currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+    }
+
+    PopupInfo connectPendingPopup(final AwContents parentAwContents) throws Exception {
+        TestAwContentsClient popupContentsClient;
+        AwTestContainerView popupContainerView;
+        final AwContents popupContents;
+        popupContentsClient = new TestAwContentsClient();
+        popupContainerView = createAwTestContainerViewOnMainSync(popupContentsClient);
+        popupContents = popupContainerView.getAwContents();
+        enableJavaScriptOnUiThread(popupContents);
+
+        mCallback.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                parentAwContents.supplyContentsForPopup(popupContents);
+            }
+        });
+
+        OnPageFinishedHelper onPageFinishedHelper = popupContentsClient.getOnPageFinishedHelper();
+        int finishCallCount = onPageFinishedHelper.getCallCount();
+        TestAwContentsClient.OnReceivedTitleHelper onReceivedTitleHelper =
+                popupContentsClient.getOnReceivedTitleHelper();
+        int titleCallCount = onReceivedTitleHelper.getCallCount();
+
+        onPageFinishedHelper.waitForCallback(
+                finishCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        onReceivedTitleHelper.waitForCallback(
+                titleCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+
+        return new PopupInfo(popupContentsClient, popupContainerView, popupContents);
+    }
+
+    interface AwTestCommonCallback {
+        Instrumentation getInstrumentation();
+        AwTestRunnerActivity getActivity();
+        void runOnUiThread(Runnable runnable) throws Throwable;
+        boolean testMethodHasAnnotation(Class<? extends Annotation> clazz);
+        AwBrowserContext createAwBrowserContextOnUiThread(
+                InMemorySharedPreferences prefs, Context appContext);
+        TestDependencyFactory createTestDependencyFactory();
+        boolean needsAwBrowserContextCreated();
+        boolean needsBrowserProcessStarted();
+    }
+}
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java
index 8e39f2e63..1aa25a7 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java
@@ -264,7 +264,7 @@
             int onPageFinishedCallCount = onPageFinishedHelper.getCallCount();
             int onPageStartedCallCount = onPageStartedHelper.getCallCount();
 
-            JSUtils.clickOnLinkUsingJs(this, mAwContents,
+            JSUtils.clickOnLinkUsingJs(getInstrumentation(), mAwContents,
                     mContentsClient.getOnEvaluateJavaScriptResultHelper(), "link");
 
             onPageFinishedHelper.waitForCallback(onPageFinishedCallCount);
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java
index d49a3de4..777ff9c 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java
@@ -43,12 +43,12 @@
     }
 
     @Override
-    protected boolean needsAwBrowserContextCreated() {
+    public boolean needsAwBrowserContextCreated() {
         return false;
     }
 
     @Override
-    protected boolean needsBrowserProcessStarted() {
+    public boolean needsBrowserProcessStarted() {
         return false;
     }
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java
index f094c9a..d9405ab5 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java
@@ -114,13 +114,12 @@
 
     private void setCookieWithJavaScript(final String name, final String value)
             throws Throwable {
-        JSUtils.executeJavaScriptAndWaitForResult(
-                this, mAwContents,
+        JSUtils.executeJavaScriptAndWaitForResult(getInstrumentation(), mAwContents,
                 mContentsClient.getOnEvaluateJavaScriptResultHelper(),
                 "var expirationDate = new Date();"
-                + "expirationDate.setDate(expirationDate.getDate() + 5);"
-                + "document.cookie='" + name + "=" + value
-                + "; expires=' + expirationDate.toUTCString();");
+                        + "expirationDate.setDate(expirationDate.getDate() + 5);"
+                        + "document.cookie='" + name + "=" + value
+                        + "; expires=' + expirationDate.toUTCString();");
     }
 
     @MediumTest
@@ -366,15 +365,14 @@
     @MediumTest
     @Feature({"AndroidWebView", "Privacy"})
     public void testThirdPartyCookie() throws Throwable {
-        // In theory we need two servers to test this, one server ('the first party') which returns
-        // a response with a link to a second server ('the third party') at different origin. This
-        // second server attempts to set a cookie which should fail if AcceptThirdPartyCookie() is
-        // false.
-        // Strictly according to the letter of RFC6454 it should be possible to set this situation
-        // up with two TestServers on different ports (these count as having different origins) but
-        // Chrome is not strict about this and does not check the port. Instead we cheat making some
-        // of the urls come from localhost and some from 127.0.0.1 which count (both in theory and
-        // pratice) as having different origins.
+        // In theory we need two servers to test this, one server ('the first
+        // party') which returns a response with a link to a second server ('the third party') at
+        // different origin. This second server attempts to set a cookie which should fail if
+        // AcceptThirdPartyCookie() is false. Strictly according to the letter of RFC6454 it should
+        // be possible to set this situation up with two TestServers on different ports (these count
+        // as having different origins) but Chrome is not strict about this and does not check the
+        // port. Instead we cheat making some of the urls come from localhost and some from
+        // 127.0.0.1 which count (both in theory and pratice) as having different origins.
         TestWebServer webServer = TestWebServer.start();
         try {
             // Turn global allow on.
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/GeolocationTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/GeolocationTest.java
index c636700..494855b 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/GeolocationTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/GeolocationTest.java
@@ -102,7 +102,7 @@
     }
 
     @Override
-    protected TestDependencyFactory createTestDependencyFactory() {
+    public TestDependencyFactory createTestDependencyFactory() {
         return mOverridenFactory == null ? new TestDependencyFactory() : mOverridenFactory;
     }
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/HttpCacheTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/HttpCacheTest.java
index d08ee36..2c42c0a 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/HttpCacheTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/HttpCacheTest.java
@@ -18,7 +18,7 @@
 public class HttpCacheTest extends AwTestBase {
 
     @Override
-    protected boolean needsBrowserProcessStarted() {
+    public boolean needsBrowserProcessStarted() {
         return false;
     }
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/LoadUrlTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/LoadUrlTest.java
index 5ac1e250..675ff54 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/LoadUrlTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/LoadUrlTest.java
@@ -288,8 +288,8 @@
         validateHeadersValue(awContents, contentsClient, extraHeaders, true);
 
         int currentCallCount = contentsClient.getOnPageFinishedHelper().getCallCount();
-        JSUtils.clickOnLinkUsingJs(
-                this, awContents, contentsClient.getOnEvaluateJavaScriptResultHelper(), "click");
+        JSUtils.clickOnLinkUsingJs(getInstrumentation(), awContents,
+                contentsClient.getOnEvaluateJavaScriptResultHelper(), "click");
         contentsClient.getOnPageFinishedHelper().waitForCallback(
                 currentCallCount, 1, WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
         // No extra headers for the page navigated via clicking.
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java
index 220cfad..e459e3a 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java
@@ -310,7 +310,7 @@
      * sites are malicious
      */
     @Override
-    protected AwBrowserContext createAwBrowserContextOnUiThread(
+    public AwBrowserContext createAwBrowserContextOnUiThread(
             InMemorySharedPreferences prefs, Context appContext) {
         return new MockAwBrowserContext(prefs, appContext);
     }
@@ -984,4 +984,15 @@
         // trace unless on the instrumentation thread.
         assertTrue("Callback should run on UI Thread", mOnUiThread);
     }
+
+    @SmallTest
+    @Feature({"AndroidWebView"})
+    public void testGetSafeBrowsingPrivacyPolicyUrl() throws Throwable {
+        final Uri privacyPolicyUrl = Uri.parse("https://www.google.com/chrome/browser/privacy/")
+                                             .buildUpon()
+                                             .fragment("safe-browsing-policies")
+                                             .build();
+        assertEquals(privacyPolicyUrl, AwContentsStatics.getSafeBrowsingPrivacyPolicyUrl());
+        assertNotNull(AwContentsStatics.getSafeBrowsingPrivacyPolicyUrl());
+    }
 }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/util/JSUtils.java b/android_webview/javatests/src/org/chromium/android_webview/test/util/JSUtils.java
index 306be04..4f35e75 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/util/JSUtils.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/util/JSUtils.java
@@ -4,12 +4,12 @@
 
 package org.chromium.android_webview.test.util;
 
-import android.test.InstrumentationTestCase;
-
-import junit.framework.Assert;
-
 import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
 
+import android.app.Instrumentation;
+
+import org.junit.Assert;
+
 import org.chromium.android_webview.AwContents;
 import org.chromium.content.browser.test.util.Criteria;
 import org.chromium.content.browser.test.util.CriteriaHelper;
@@ -22,18 +22,16 @@
     private static final long WAIT_TIMEOUT_MS = scaleTimeout(2000);
     private static final int CHECK_INTERVAL = 100;
 
-    public static void clickOnLinkUsingJs(
-            final InstrumentationTestCase testCase,
+    public static void clickOnLinkUsingJs(final Instrumentation instrumentation,
             final AwContents awContents,
             final OnEvaluateJavaScriptResultHelper onEvaluateJavaScriptResultHelper,
             final String linkId) throws Exception {
-
         CriteriaHelper.pollInstrumentationThread(new Criteria() {
             @Override
             public boolean isSatisfied() {
                 try {
-                    String linkIsNotNull = executeJavaScriptAndWaitForResult(testCase, awContents,
-                            onEvaluateJavaScriptResultHelper,
+                    String linkIsNotNull = executeJavaScriptAndWaitForResult(instrumentation,
+                            awContents, onEvaluateJavaScriptResultHelper,
                             "document.getElementById('" + linkId + "') != null");
                     return linkIsNotNull.equals("true");
                 } catch (Throwable t) {
@@ -44,7 +42,7 @@
             }
         }, WAIT_TIMEOUT_MS, CHECK_INTERVAL);
 
-        testCase.getInstrumentation().runOnMainSync(new Runnable() {
+        instrumentation.runOnMainSync(new Runnable() {
             @Override
             public void run() {
                 awContents.getWebContents().evaluateJavaScriptForTests(
@@ -56,12 +54,11 @@
         });
     }
 
-    public static String executeJavaScriptAndWaitForResult(
-            InstrumentationTestCase testCase,
+    public static String executeJavaScriptAndWaitForResult(Instrumentation instrumentation,
             final AwContents awContents,
             final OnEvaluateJavaScriptResultHelper onEvaluateJavaScriptResultHelper,
             final String code) throws Exception {
-        testCase.getInstrumentation().runOnMainSync(new Runnable() {
+        instrumentation.runOnMainSync(new Runnable() {
             @Override
             public void run() {
                 onEvaluateJavaScriptResultHelper.evaluateJavaScriptForTests(
diff --git a/android_webview/test/BUILD.gn b/android_webview/test/BUILD.gn
index c3ebb792..8c3b2e3e 100644
--- a/android_webview/test/BUILD.gn
+++ b/android_webview/test/BUILD.gn
@@ -26,6 +26,8 @@
     "//base:base_java_test_support",
     "//components/policy/android:policy_java_test_support",
     "//content/public/android:content_java",
+    "//third_party/android_support_test_runner:runner_java",
+    "//third_party/junit",
     "//ui/android:ui_java",
   ]
 
@@ -40,6 +42,7 @@
     "shell/src/org/chromium/android_webview/test/AwInstrumentationTestRunner.java",
     "shell/src/org/chromium/android_webview/test/AwTestContainerView.java",
     "shell/src/org/chromium/android_webview/test/AwTestRunnerActivity.java",
+    "shell/src/org/chromium/android_webview/test/AwJUnit4ClassRunner.java",
     "shell/src/org/chromium/android_webview/test/NullContentsClient.java",
     "shell/src/org/chromium/android_webview/test/SecondBrowserProcess.java",
     "shell/src/org/chromium/android_webview/test/TestContentProvider.java",
@@ -126,7 +129,9 @@
     "//device/geolocation:geolocation_java_test_support",
     "//net/android:net_java",
     "//net/android:net_java_test_support",
+    "//third_party/android_support_test_runner:rules_java",
     "//third_party/android_support_test_runner:runner_java",
+    "//third_party/junit",
     "//ui/android:ui_java",
   ]
   java_files = [
@@ -166,7 +171,9 @@
     "../javatests/src/org/chromium/android_webview/test/AwServiceWorkerClientTest.java",
     "../javatests/src/org/chromium/android_webview/test/AwSettingsTest.java",
     "../javatests/src/org/chromium/android_webview/test/AwStrictModeTest.java",
+    "../javatests/src/org/chromium/android_webview/test/AwTestCommon.java",
     "../javatests/src/org/chromium/android_webview/test/AwTestBase.java",
+    "../javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java",
     "../javatests/src/org/chromium/android_webview/test/AwWebContentsObserverTest.java",
     "../javatests/src/org/chromium/android_webview/test/AwVariationsSeedFetchServiceTest.java",
     "../javatests/src/org/chromium/android_webview/test/AwZoomTest.java",
diff --git a/android_webview/test/shell/src/org/chromium/android_webview/test/AwJUnit4ClassRunner.java b/android_webview/test/shell/src/org/chromium/android_webview/test/AwJUnit4ClassRunner.java
new file mode 100644
index 0000000..4bedc5d
--- /dev/null
+++ b/android_webview/test/shell/src/org/chromium/android_webview/test/AwJUnit4ClassRunner.java
@@ -0,0 +1,97 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.android_webview.test;
+
+import android.support.test.InstrumentationRegistry;
+
+import org.junit.runner.notification.RunNotifier;
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.InitializationError;
+
+import org.chromium.android_webview.AwSwitches;
+import org.chromium.base.CollectionUtil;
+import org.chromium.base.CommandLine;
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.BaseTestResult.PreTestHook;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.parameter.SkipCommandLineParameterization;
+import org.chromium.policy.test.annotations.Policies;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A custom runner for //chrome JUnit4 tests.
+ */
+public final class AwJUnit4ClassRunner extends BaseJUnit4ClassRunner {
+    /**
+     * Create an AwJUnit4ClassRunner to run {@code klass} and initialize values
+     *
+     * @param klass Test class to run
+     * @throws InitializationError if the test class is malformed
+     */
+    public AwJUnit4ClassRunner(Class<?> klass) throws InitializationError {
+        super(klass, null, defaultPreTestHooks());
+    }
+
+    private static List<PreTestHook> defaultPreTestHooks() {
+        return CollectionUtil.newArrayList(Policies.getRegistrationHook());
+    }
+
+    @Override
+    protected List<FrameworkMethod> getChildren() {
+        List<FrameworkMethod> result = new ArrayList<>();
+        for (FrameworkMethod method : computeTestMethods()) {
+            if (method.getAnnotation(SkipCommandLineParameterization.class) == null) {
+                result.add(new WebViewMultiProcessFrameworkMethod(method));
+            }
+            result.add(method);
+        }
+        return result;
+    }
+
+    @Override
+    protected void runChild(FrameworkMethod method, RunNotifier notifier) {
+        CommandLineFlags.setUp(InstrumentationRegistry.getTargetContext(), method.getMethod());
+        if (method instanceof WebViewMultiProcessFrameworkMethod) {
+            CommandLine.getInstance().appendSwitch(AwSwitches.WEBVIEW_SANDBOXED_RENDERER);
+        }
+        super.runChild(method, notifier);
+    }
+
+    /**
+     * Custom FrameworkMethod class indicate this test method will run in multiprocess mode.
+     *
+     * The clas also add "__multiprocess_mode" postfix to the test name.
+     */
+    private static class WebViewMultiProcessFrameworkMethod extends FrameworkMethod {
+        public WebViewMultiProcessFrameworkMethod(FrameworkMethod method) {
+            super(method.getMethod());
+        }
+
+        @Override
+        public String getName() {
+            return super.getName() + "__multiprocess_mode";
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (obj instanceof WebViewMultiProcessFrameworkMethod) {
+                WebViewMultiProcessFrameworkMethod method =
+                        (WebViewMultiProcessFrameworkMethod) obj;
+                return super.equals(obj) && method.getName().equals(getName());
+            }
+            return false;
+        }
+
+        @Override
+        public int hashCode() {
+            int result = 17;
+            result = 31 * result + super.hashCode();
+            result = 31 * result + getName().hashCode();
+            return result;
+        }
+    }
+}
diff --git a/ash/app_list/app_list_presenter_delegate_unittest.cc b/ash/app_list/app_list_presenter_delegate_unittest.cc
index 71eb479..d0bb6514 100644
--- a/ash/app_list/app_list_presenter_delegate_unittest.cc
+++ b/ash/app_list/app_list_presenter_delegate_unittest.cc
@@ -525,14 +525,17 @@
        TapAndClickOutsideClosesPeekingAppList) {
   const bool test_mouse_event = TestMouseEventParam();
   app_list_presenter_impl()->Show(GetPrimaryDisplayId());
-  EXPECT_EQ(app_list_presenter_impl()->GetView()->app_list_state(),
-            app_list::AppListView::PEEKING);
+  EXPECT_EQ(app_list::AppListView::PEEKING,
+            app_list_presenter_impl()->GetView()->app_list_state());
   ui::test::EventGenerator& generator = GetEventGenerator();
 
   // Tapping outside the bounds closes the app list.
-  gfx::Point tap_point =
-      app_list_presenter_impl()->GetView()->bounds().origin();
-  tap_point.Offset(0, -10);
+  const gfx::Rect peeking_bounds =
+      app_list_presenter_impl()->GetView()->GetBoundsInScreen();
+  gfx::Point tap_point = peeking_bounds.origin();
+  tap_point.Offset(10, -10);
+  ASSERT_FALSE(peeking_bounds.Contains(tap_point));
+
   if (test_mouse_event) {
     generator.MoveMouseTo(tap_point);
     generator.ClickLeftButton();
diff --git a/ash/fast_ink/fast_ink_view.cc b/ash/fast_ink/fast_ink_view.cc
index 8f1a1c9..c732dcbf5 100644
--- a/ash/fast_ink/fast_ink_view.cc
+++ b/ash/fast_ink/fast_ink_view.cc
@@ -128,19 +128,19 @@
 
 void FastInkView::ReclaimResources(
     const std::vector<viz::ReturnedResource>& resources) {
-  DCHECK_EQ(resources.size(), 1u);
+  for (auto& entry : resources) {
+    auto it = resources_.find(entry.id);
+    DCHECK(it != resources_.end());
+    std::unique_ptr<FastInkResource> resource = std::move(it->second);
+    resources_.erase(it);
 
-  auto it = resources_.find(resources.front().id);
-  DCHECK(it != resources_.end());
-  std::unique_ptr<FastInkResource> resource = std::move(it->second);
-  resources_.erase(it);
+    gpu::gles2::GLES2Interface* gles2 = resource->context_provider->ContextGL();
+    if (entry.sync_token.HasData())
+      gles2->WaitSyncTokenCHROMIUM(entry.sync_token.GetConstData());
 
-  gpu::gles2::GLES2Interface* gles2 = resource->context_provider->ContextGL();
-  if (resources.front().sync_token.HasData())
-    gles2->WaitSyncTokenCHROMIUM(resources.front().sync_token.GetConstData());
-
-  if (!resources.front().lost)
-    returned_resources_.push_back(std::move(resource));
+    if (!entry.lost)
+      returned_resources_.push_back(std::move(resource));
+  }
 }
 
 void FastInkView::UpdateDamageRect(const gfx::Rect& rect) {
diff --git a/ash/login/ui/login_auth_user_view.cc b/ash/login/ui/login_auth_user_view.cc
index df467f5..77aa6d3 100644
--- a/ash/login/ui/login_auth_user_view.cc
+++ b/ash/login/ui/login_auth_user_view.cc
@@ -140,7 +140,7 @@
 void LoginAuthUserView::OnAuthSubmit(bool is_pin,
                                      const base::string16& password) {
   Shell::Get()->lock_screen_controller()->AuthenticateUser(
-      current_user_, UTF16ToUTF8(password), is_pin,
+      current_user_, base::UTF16ToUTF8(password), is_pin,
       base::BindOnce([](OnAuthCallback on_auth,
                         bool auth_success) { on_auth.Run(auth_success); },
                      on_auth_));
diff --git a/ash/public/cpp/BUILD.gn b/ash/public/cpp/BUILD.gn
index ff8fe16..b3d5baa 100644
--- a/ash/public/cpp/BUILD.gn
+++ b/ash/public/cpp/BUILD.gn
@@ -41,6 +41,7 @@
     "shelf_types.h",
     "shell_window_ids.cc",
     "shell_window_ids.h",
+    "voice_interaction_state.h",
     "window_pin_type.cc",
     "window_pin_type.h",
     "window_properties.cc",
diff --git a/ash/public/cpp/shell_window_ids.h b/ash/public/cpp/shell_window_ids.h
index 3d6d8d6..68e9ec8c 100644
--- a/ash/public/cpp/shell_window_ids.h
+++ b/ash/public/cpp/shell_window_ids.h
@@ -111,18 +111,20 @@
   // region selector for partial screenshots.
   kShellWindowId_OverlayContainer,
 
-  // ID of the window created by PhantomWindowController or
-  // DragWindowController.
-  kShellWindowId_PhantomWindow,
-
   // The container for mouse cursor.
   kShellWindowId_MouseCursorContainer,
 
   // The topmost container, used for power off animation.
   kShellWindowId_PowerButtonAnimationContainer,
 
-  kShellWindowId_Min = kShellWindowId_ScreenRotationContainer,
-  kShellWindowId_Max = kShellWindowId_PowerButtonAnimationContainer,
+  kShellWindowId_MinContainer = kShellWindowId_ScreenRotationContainer,
+  kShellWindowId_MaxContainer = kShellWindowId_PowerButtonAnimationContainer,
+};
+
+// Special shell windows that are not containers.
+enum NonContainerWindowId {
+  // The window created by PhantomWindowController or DragWindowController.
+  kShellWindowId_PhantomWindow = kShellWindowId_MaxContainer + 1
 };
 
 // A list of all the above valid container IDs. Add any new ID to this list.
@@ -152,7 +154,6 @@
     kShellWindowId_DragImageAndTooltipContainer,
     kShellWindowId_SettingBubbleContainer,
     kShellWindowId_OverlayContainer,
-    kShellWindowId_PhantomWindow,
     kShellWindowId_MouseCursorContainer,
     kShellWindowId_PowerButtonAnimationContainer,
 };
diff --git a/ash/public/cpp/voice_interaction_state.h b/ash/public/cpp/voice_interaction_state.h
new file mode 100644
index 0000000..fd9d049
--- /dev/null
+++ b/ash/public/cpp/voice_interaction_state.h
@@ -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.
+
+#ifndef ASH_PUBLIC_CPP_VOICE_INTERACTION_STATE_H_
+#define ASH_PUBLIC_CPP_VOICE_INTERACTION_STATE_H_
+
+namespace ash {
+
+enum class VoiceInteractionState {
+  // Voice interaction service is not ready yet, request sent will be waiting.
+  NOT_READY = 0,
+  // Voice interaction session is stopped.
+  STOPPED,
+  // Voice interaction session is currently running.
+  RUNNING
+};
+
+}  // namespace ash
+
+#endif  // ASH_PUBLIC_CPP_VOICE_INTERACTION_STATE_H_
diff --git a/ash/resources/vector_icons/BUILD.gn b/ash/resources/vector_icons/BUILD.gn
index 569640d..70a3281 100644
--- a/ash/resources/vector_icons/BUILD.gn
+++ b/ash/resources/vector_icons/BUILD.gn
@@ -100,8 +100,6 @@
     "shelf_overflow.icon",
     "shelf_overview.1x.icon",
     "shelf_overview.icon",
-    "shelf_voice_interaction.1x.icon",
-    "shelf_voice_interaction.icon",
     "system_menu_accessibility.1x.icon",
     "system_menu_accessibility.icon",
     "system_menu_accessibility_auto_click.1x.icon",
diff --git a/ash/resources/vector_icons/shelf_voice_interaction.1x.icon b/ash/resources/vector_icons/shelf_voice_interaction.1x.icon
deleted file mode 100644
index 57ed627..0000000
--- a/ash/resources/vector_icons/shelf_voice_interaction.1x.icon
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-CANVAS_DIMENSIONS, 24,
-PATH_COLOR_ARGB, 0xFF, 0x34, 0xA8, 0x53,
-MOVE_TO, 22.36f, 8.64f,
-CUBIC_TO, 23.27f, 8.64f, 24, 7.9f, 24, 7,
-CUBIC_TO, 24, 6.1f, 23.27f, 5.36f, 22.36f, 5.36f,
-CUBIC_TO, 21.46f, 5.36f, 20.73f, 6.1f, 20.73f, 7,
-CUBIC_TO, 20.73f, 7.9f, 21.46f, 8.64f, 22.36f, 8.64f,
-LINE_TO, 22.36f, 8.64f,
-CLOSE,
-NEW_PATH,
-PATH_COLOR_ARGB, 0xFF, 0xEB, 0x43, 0x35,
-MOVE_TO, 17.45f, 14.09f,
-CUBIC_TO, 19.26f, 14.09f, 20.73f, 12.63f, 20.73f, 10.82f,
-CUBIC_TO, 20.73f, 9.01f, 19.26f, 7.55f, 17.45f, 7.55f,
-CUBIC_TO, 15.65f, 7.55f, 14.18f, 9.01f, 14.18f, 10.82f,
-CUBIC_TO, 14.18f, 12.63f, 15.65f, 14.09f, 17.45f, 14.09f,
-CLOSE,
-NEW_PATH,
-PATH_COLOR_ARGB, 0xFF, 0xFB, 0xBC, 0x05,
-MOVE_TO, 17.45f, 22.82f,
-CUBIC_TO, 19.56f, 22.82f, 21.27f, 21.11f, 21.27f, 19,
-CUBIC_TO, 21.27f, 16.89f, 19.56f, 15.18f, 17.45f, 15.18f,
-CUBIC_TO, 15.35f, 15.18f, 13.64f, 16.89f, 13.64f, 19,
-CUBIC_TO, 13.64f, 21.11f, 15.35f, 22.82f, 17.45f, 22.82f,
-CLOSE,
-NEW_PATH,
-PATH_COLOR_ARGB, 0xFF, 0x42, 0x85, 0xF4,
-MOVE_TO, 6.55f, 14.09f,
-CUBIC_TO, 10.16f, 14.09f, 13.09f, 11.16f, 13.09f, 7.55f,
-CUBIC_TO, 13.09f, 3.93f, 10.16f, 1, 6.55f, 1,
-CUBIC_TO, 2.93f, 1, 0, 3.93f, 0, 7.55f,
-CUBIC_TO, 0, 11.16f, 2.93f, 14.09f, 6.55f, 14.09f,
-CLOSE,
-END
diff --git a/ash/resources/vector_icons/shelf_voice_interaction.icon b/ash/resources/vector_icons/shelf_voice_interaction.icon
deleted file mode 100644
index 188c78d..0000000
--- a/ash/resources/vector_icons/shelf_voice_interaction.icon
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-CANVAS_DIMENSIONS, 48,
-PATH_COLOR_ARGB, 0xFF, 0x34, 0xA8, 0x53,
-MOVE_TO, 44.73f, 17.27f,
-CUBIC_TO, 46.53f, 17.27f, 48, 15.81f, 48, 14,
-CUBIC_TO, 48, 12.19f, 46.53f, 10.73f, 44.73f, 10.73f,
-CUBIC_TO, 42.92f, 10.73f, 41.45f, 12.19f, 41.45f, 14,
-CUBIC_TO, 41.45f, 15.81f, 42.92f, 17.27f, 44.73f, 17.27f,
-LINE_TO, 44.73f, 17.27f,
-CLOSE,
-NEW_PATH,
-PATH_COLOR_ARGB, 0xFF, 0xEB, 0x43, 0x35,
-MOVE_TO, 34.91f, 28.18f,
-CUBIC_TO, 38.52f, 28.18f, 41.45f, 25.25f, 41.45f, 21.64f,
-CUBIC_TO, 41.45f, 18.02f, 38.52f, 15.09f, 34.91f, 15.09f,
-CUBIC_TO, 31.29f, 15.09f, 28.36f, 18.02f, 28.36f, 21.64f,
-CUBIC_TO, 28.36f, 25.25f, 31.29f, 28.18f, 34.91f, 28.18f,
-CLOSE,
-NEW_PATH,
-PATH_COLOR_ARGB, 0xFF, 0xFB, 0xBC, 0x05,
-MOVE_TO, 34.91f, 45.64f,
-CUBIC_TO, 39.13f, 45.64f, 42.55f, 42.22f, 42.55f, 38,
-CUBIC_TO, 42.55f, 33.78f, 39.13f, 30.36f, 34.91f, 30.36f,
-CUBIC_TO, 30.69f, 30.36f, 27.27f, 33.78f, 27.27f, 38,
-CUBIC_TO, 27.27f, 42.22f, 30.69f, 45.64f, 34.91f, 45.64f,
-CLOSE,
-NEW_PATH,
-PATH_COLOR_ARGB, 0xFF, 0x42, 0x85, 0xF4,
-MOVE_TO, 13.09f, 28.18f,
-CUBIC_TO, 20.32f, 28.18f, 26.18f, 22.32f, 26.18f, 15.09f,
-CUBIC_TO, 26.18f, 7.86f, 20.32f, 2, 13.09f, 2,
-CUBIC_TO, 5.86f, 2, 0, 7.86f, 0, 15.09f,
-CUBIC_TO, 0, 22.32f, 5.86f, 28.18f, 13.09f, 28.18f,
-CLOSE,
-END
diff --git a/ash/shelf/app_list_button.cc b/ash/shelf/app_list_button.cc
index a782a63..57cfa11 100644
--- a/ash/shelf/app_list_button.cc
+++ b/ash/shelf/app_list_button.cc
@@ -381,7 +381,8 @@
 
     if (chromeos::switches::IsVoiceInteractionEnabled())
       // active: 100% alpha, inactive: 54% alpha
-      fg_flags.setAlpha(voice_interaction_running_
+      fg_flags.setAlpha(voice_interaction_state_ ==
+                                ash::VoiceInteractionState::RUNNING
                             ? kVoiceInteractionRunningAlpha
                             : kVoiceInteractionNotRunningAlpha);
 
@@ -459,19 +460,34 @@
     OnAppListDismissed();
 }
 
-void AppListButton::OnVoiceInteractionStatusChanged(bool running) {
-  voice_interaction_running_ = running;
+void AppListButton::OnVoiceInteractionStatusChanged(
+    ash::VoiceInteractionState state) {
+  voice_interaction_state_ = state;
   SchedulePaint();
 
-  // Voice interaction window shows up, we start hiding the animation if it is
-  // running.
-  if (running && voice_interaction_overlay_->IsBursting()) {
-    voice_interaction_animation_hide_delay_timer_->Start(
-        FROM_HERE,
-        base::TimeDelta::FromMilliseconds(
-            kVoiceInteractionAnimationHideDelayMs),
-        base::Bind(&VoiceInteractionOverlay::HideAnimation,
-                   base::Unretained(voice_interaction_overlay_)));
+  switch (state) {
+    case ash::VoiceInteractionState::STOPPED:
+      break;
+    case ash::VoiceInteractionState::NOT_READY:
+      // If we are showing the bursting or waiting animation, no need to do
+      // anything. Otherwise show the waiting animation now.
+      if (!voice_interaction_overlay_->IsBursting() &&
+          !voice_interaction_overlay_->IsWaiting()) {
+        voice_interaction_overlay_->WaitingAnimation();
+      }
+      break;
+    case ash::VoiceInteractionState::RUNNING:
+      // we start hiding the animation if it is running.
+      if (voice_interaction_overlay_->IsBursting() ||
+          voice_interaction_overlay_->IsWaiting()) {
+        voice_interaction_animation_hide_delay_timer_->Start(
+            FROM_HERE,
+            base::TimeDelta::FromMilliseconds(
+                kVoiceInteractionAnimationHideDelayMs),
+            base::Bind(&VoiceInteractionOverlay::HideAnimation,
+                       base::Unretained(voice_interaction_overlay_)));
+      }
+      break;
   }
 }
 
@@ -479,9 +495,10 @@
   // We only show the voice interaction icon and related animation when the
   // shelf is at the bottom position and voice interaction is not running.
   ShelfAlignment alignment = shelf_->alignment();
-  bool show_icon = (alignment == SHELF_ALIGNMENT_BOTTOM ||
-                    alignment == SHELF_ALIGNMENT_BOTTOM_LOCKED) &&
-                   !voice_interaction_running_;
+  bool show_icon =
+      (alignment == SHELF_ALIGNMENT_BOTTOM ||
+       alignment == SHELF_ALIGNMENT_BOTTOM_LOCKED) &&
+      (voice_interaction_state_ == ash::VoiceInteractionState::STOPPED);
   voice_interaction_overlay_->StartAnimation(show_icon);
 }
 
diff --git a/ash/shelf/app_list_button.h b/ash/shelf/app_list_button.h
index 2bf9232..a12d66bf 100644
--- a/ash/shelf/app_list_button.h
+++ b/ash/shelf/app_list_button.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "ash/ash_export.h"
+#include "ash/public/cpp/voice_interaction_state.h"
 #include "ash/shell_observer.h"
 #include "base/macros.h"
 #include "third_party/skia/include/core/SkColor.h"
@@ -69,7 +70,8 @@
   // ShellObserver:
   void OnAppListVisibilityChanged(bool shown,
                                   aura::Window* root_window) override;
-  void OnVoiceInteractionStatusChanged(bool running) override;
+  void OnVoiceInteractionStatusChanged(
+      ash::VoiceInteractionState state) override;
 
   void StartVoiceInteractionAnimation();
 
@@ -98,7 +100,8 @@
   std::unique_ptr<base::OneShotTimer>
       voice_interaction_animation_hide_delay_timer_;
 
-  bool voice_interaction_running_ = false;
+  ash::VoiceInteractionState voice_interaction_state_ =
+      ash::VoiceInteractionState::STOPPED;
 
   // Flag that gets set each time we receive a mouse or gesture event. It is
   // then used to render the ink drop in the right location.
diff --git a/ash/shelf/voice_interaction_overlay.cc b/ash/shelf/voice_interaction_overlay.cc
index 97b934a..2495e28 100644
--- a/ash/shelf/voice_interaction_overlay.cc
+++ b/ash/shelf/voice_interaction_overlay.cc
@@ -288,6 +288,22 @@
         gfx::Tween::LINEAR_OUT_SLOW_IN, animation_observer);
   }
 
+  void SetToLarge(const gfx::PointF& new_center) {
+    PaintedShapeTransforms transforms;
+    SetPaintedLayersVisible(true);
+    // Hide the foreground layers and only show the background layers.
+    for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i)
+      painted_layers_[i]->SetVisible(false);
+    // Hide the shadow layer
+    shadow_layer_->SetVisible(false);
+
+    center_point_ = new_center;
+    // Set the painted layers to the large rectangle size
+    CalculateRectTransforms(large_size_, kBackgroundCornerRadiusDip,
+                            &transforms);
+    SetTransforms(transforms);
+  }
+
   void ResetShape() {
     // This reverts to the original small round shape.
     shadow_layer_->SetVisible(true);
@@ -581,9 +597,6 @@
       icon_layer_(base::MakeUnique<VoiceInteractionIcon>()),
       background_layer_(base::MakeUnique<VoiceInteractionIconBackground>()),
       host_view_(host_view),
-      is_bursting_(false),
-      show_icon_(false),
-      should_hide_animation_(false),
       circle_layer_delegate_(kRippleColor, kRippleCircleInitRadiusDip) {
   SetPaintToLayer(ui::LAYER_NOT_DRAWN);
   layer()->set_name("VoiceInteractionOverlay:ROOT_LAYER");
@@ -605,7 +618,7 @@
 VoiceInteractionOverlay::~VoiceInteractionOverlay() {}
 
 void VoiceInteractionOverlay::StartAnimation(bool show_icon) {
-  is_bursting_ = false;
+  animation_state_ = AnimationState::STARTING;
   show_icon_ = show_icon;
   SetVisible(true);
 
@@ -715,8 +728,7 @@
 }
 
 void VoiceInteractionOverlay::BurstAnimation() {
-  is_bursting_ = true;
-  should_hide_animation_ = false;
+  animation_state_ = AnimationState::BURSTING;
 
   gfx::Point center = host_view_->GetAppListButtonCenterPoint();
   gfx::Transform transform;
@@ -766,10 +778,6 @@
   }
 
   // Setup background animation.
-  ui::CallbackLayerAnimationObserver* observer =
-      new ui::CallbackLayerAnimationObserver(
-          base::Bind(&VoiceInteractionOverlay::AnimationEndedCallback,
-                     base::Unretained(this)));
   // Transform to new shape.
   // We want to animate from the background's current position into a larger
   // size. The animation moves the background's center point while morphing from
@@ -785,12 +793,70 @@
       gfx::PointF(
           kBackgroundLargeWidthDip / 2 + kBackgroundPaddingDip - x_offset,
           -kBackgroundLargeHeightDip / 2 - kBackgroundPaddingDip - y_offset),
-      observer);
-  observer->SetActive();
+      nullptr);
+}
+
+void VoiceInteractionOverlay::WaitingAnimation() {
+  // If we are already playing burst animation, it will end up at waiting state
+  // anyway.  No need to do anything.
+  if (IsBursting())
+    return;
+
+  animation_state_ = AnimationState::WAITING;
+
+  gfx::Point center = host_view_->GetAppListButtonCenterPoint();
+  gfx::Transform transform;
+
+  ripple_layer_->SetOpacity(0);
+  icon_layer_->SetOpacity(0);
+  background_layer_->SetOpacity(0);
+  SetVisible(true);
+
+  // Setup icon layer.
+  {
+    transform.Translate(kBackgroundLargeWidthDip / 2 + kBackgroundPaddingDip -
+                            kIconEndSizeDip / 2,
+                        -kBackgroundLargeHeightDip / 2 - kBackgroundPaddingDip -
+                            kIconEndSizeDip / 2);
+    SkMScalar scale_factor = kIconEndSizeDip / kIconInitSizeDip;
+    transform.Scale(scale_factor, scale_factor);
+    icon_layer_->SetTransform(transform);
+
+    ui::ScopedLayerAnimationSettings settings(icon_layer_->GetAnimator());
+    settings.SetTransitionDuration(
+        base::TimeDelta::FromMilliseconds(kBackgroundMorphDurationMs));
+    settings.SetPreemptionStrategy(
+        ui::LayerAnimator::PreemptionStrategy::ENQUEUE_NEW_ANIMATION);
+    settings.SetTweenType(gfx::Tween::LINEAR_OUT_SLOW_IN);
+
+    icon_layer_->SetOpacity(1);
+    icon_layer_->StartAnimation();
+  }
+
+  // Setup background layer.
+  {
+    float x_offset = center.x() - kBackgroundSizeDip / 2;
+    float y_offset = center.y() - kBackgroundSizeDip / 2;
+
+    transform.MakeIdentity();
+    background_layer_->SetTransform(transform);
+    background_layer_->SetToLarge(gfx::PointF(
+        kBackgroundLargeWidthDip / 2 + kBackgroundPaddingDip - x_offset,
+        -kBackgroundLargeHeightDip / 2 - kBackgroundPaddingDip - y_offset));
+
+    ui::ScopedLayerAnimationSettings settings(background_layer_->GetAnimator());
+    settings.SetTransitionDuration(
+        base::TimeDelta::FromMilliseconds(kBackgroundMorphDurationMs));
+    settings.SetPreemptionStrategy(
+        ui::LayerAnimator::PreemptionStrategy::ENQUEUE_NEW_ANIMATION);
+    settings.SetTweenType(gfx::Tween::LINEAR_OUT_SLOW_IN);
+
+    background_layer_->SetOpacity(1);
+  }
 }
 
 void VoiceInteractionOverlay::EndAnimation() {
-  if (is_bursting_) {
+  if (IsBursting()) {
     // Too late, user action already fired, we have to finish what's started.
     return;
   }
@@ -868,14 +934,7 @@
 }
 
 void VoiceInteractionOverlay::HideAnimation() {
-  is_bursting_ = false;
-
-  if (background_layer_->GetAnimator()->is_animating()) {
-    // Wait for current animation to finish
-    should_hide_animation_ = true;
-    return;
-  }
-  should_hide_animation_ = false;
+  animation_state_ = AnimationState::HIDDEN;
 
   // Setup ripple animations.
   {
@@ -915,12 +974,4 @@
   }
 }
 
-bool VoiceInteractionOverlay::AnimationEndedCallback(
-    const ui::CallbackLayerAnimationObserver& observer) {
-  if (should_hide_animation_)
-    HideAnimation();
-
-  return true;
-}
-
 }  // namespace ash
diff --git a/ash/shelf/voice_interaction_overlay.h b/ash/shelf/voice_interaction_overlay.h
index f126751c..4f89c08 100644
--- a/ash/shelf/voice_interaction_overlay.h
+++ b/ash/shelf/voice_interaction_overlay.h
@@ -13,10 +13,6 @@
 #include "ui/views/animation/ink_drop_painted_layer_delegates.h"
 #include "ui/views/view.h"
 
-namespace ui {
-class CallbackLayerAnimationObserver;
-}  // namespace ui
-
 namespace ash {
 
 class AppListButton;
@@ -31,12 +27,25 @@
   void StartAnimation(bool show_icon);
   void EndAnimation();
   void BurstAnimation();
+  void WaitingAnimation();
   void HideAnimation();
-  bool IsBursting() const { return is_bursting_; }
+  bool IsBursting() const {
+    return AnimationState::BURSTING == animation_state_;
+  }
+  bool IsWaiting() const { return AnimationState::WAITING == animation_state_; }
 
  private:
-  bool AnimationEndedCallback(
-      const ui::CallbackLayerAnimationObserver& observer);
+  enum class AnimationState {
+    // Indicates no animation is playing.
+    HIDDEN = 0,
+    // Indicates currently playing the starting animation.
+    STARTING,
+    // Indiates the current animation is in the bursting phase, which means no
+    // turning back.
+    BURSTING,
+    // Indicates currently playing the waiting animation.
+    WAITING
+  };
 
   std::unique_ptr<ui::Layer> ripple_layer_;
   std::unique_ptr<VoiceInteractionIcon> icon_layer_;
@@ -44,16 +53,10 @@
 
   AppListButton* host_view_;
 
-  // Indiates the current animation is in the bursting phase, which means no
-  // turning back.
-  bool is_bursting_;
+  AnimationState animation_state_ = AnimationState::HIDDEN;
 
   // Whether showing the icon animation or not.
-  bool show_icon_;
-
-  // Whether we should hide the burst animation when the animation ends. This is
-  // used to synchronize the animation and the underlying window's appearance.
-  bool should_hide_animation_;
+  bool show_icon_ = false;
 
   views::CircleLayerDelegate circle_layer_delegate_;
 
diff --git a/ash/shell.cc b/ash/shell.cc
index b656fd50..b2f7edf4 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -617,9 +617,9 @@
     observer.OnAppListVisibilityChanged(visible, root_window);
 }
 
-void Shell::NotifyVoiceInteractionStatusChanged(bool running) {
+void Shell::NotifyVoiceInteractionStatusChanged(VoiceInteractionState state) {
   for (auto& observer : shell_observers_)
-    observer.OnVoiceInteractionStatusChanged(running);
+    observer.OnVoiceInteractionStatusChanged(state);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/ash/shell.h b/ash/shell.h
index 1a34aebd..5518b0361 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -173,6 +173,7 @@
 
 enum class Config;
 enum class LoginStatus;
+enum class VoiceInteractionState;
 
 // Shell is a singleton object that presents the Shell API and implements the
 // RootWindow's delegate interface.
@@ -617,7 +618,7 @@
 
   void NotifyAppListVisibilityChanged(bool visible, aura::Window* root_window);
 
-  void NotifyVoiceInteractionStatusChanged(bool running);
+  void NotifyVoiceInteractionStatusChanged(VoiceInteractionState state);
 
  private:
   FRIEND_TEST_ALL_PREFIXES(ExtendedDesktopTest, TestCursor);
diff --git a/ash/shell_observer.h b/ash/shell_observer.h
index fbf20b4..5e4f2561 100644
--- a/ash/shell_observer.h
+++ b/ash/shell_observer.h
@@ -16,6 +16,8 @@
 
 namespace ash {
 
+enum class VoiceInteractionState;
+
 class ASH_EXPORT ShellObserver {
  public:
   // Called when the AppList is shown or dismissed.
@@ -68,8 +70,8 @@
   // Called when a new KeyboardController is created.
   virtual void OnKeyboardControllerCreated() {}
 
-  // Called when voice interaction session starts / finishes.
-  virtual void OnVoiceInteractionStatusChanged(bool running) {}
+  // Called when voice interaction session state changes.
+  virtual void OnVoiceInteractionStatusChanged(VoiceInteractionState state) {}
 
   // Called at the end of Shell::Init.
   virtual void OnShellInitialized() {}
diff --git a/ash/shell_unittest.cc b/ash/shell_unittest.cc
index 21b6f487..367974a 100644
--- a/ash/shell_unittest.cc
+++ b/ash/shell_unittest.cc
@@ -100,6 +100,10 @@
                                   kShellWindowId_ImeWindowParentContainer));
   EXPECT_TRUE(
       Shell::GetContainer(root_window, kShellWindowId_MouseCursorContainer));
+
+  // Phantom window is not a container.
+  EXPECT_EQ(0u, container_ids.count(kShellWindowId_PhantomWindow));
+  EXPECT_FALSE(Shell::GetContainer(root_window, kShellWindowId_PhantomWindow));
 }
 
 class ModalWindow : public views::WidgetDelegateView {
diff --git a/ash/system/supervised/tray_supervised_user_unittest.cc b/ash/system/supervised/tray_supervised_user_unittest.cc
index d1ce6dc..cad315a 100644
--- a/ash/system/supervised/tray_supervised_user_unittest.cc
+++ b/ash/system/supervised/tray_supervised_user_unittest.cc
@@ -20,6 +20,7 @@
 #include "ui/message_center/notification_types.h"
 #include "ui/views/view.h"
 
+using base::UTF16ToUTF8;
 using message_center::NotificationList;
 
 namespace ash {
diff --git a/ash/wallpaper/wallpaper_controller.cc b/ash/wallpaper/wallpaper_controller.cc
index 39c54bc..4aa97499 100644
--- a/ash/wallpaper/wallpaper_controller.cc
+++ b/ash/wallpaper/wallpaper_controller.cc
@@ -9,6 +9,7 @@
 
 #include "ash/ash_switches.h"
 #include "ash/display/window_tree_host_manager.h"
+#include "ash/login/ui/login_constants.h"
 #include "ash/public/cpp/ash_pref_names.h"
 #include "ash/public/cpp/config.h"
 #include "ash/public/cpp/shell_window_ids.h"
@@ -425,6 +426,9 @@
       return;
   }
 
+  if (Shell::Get()->session_controller()->IsUserSessionBlocked())
+    component->SetWallpaperBlur(login_constants::kBlurSigma);
+
   RootWindowController* controller =
       RootWindowController::ForWindow(root_window);
   controller->SetAnimatingWallpaperWidgetController(
diff --git a/ash/wallpaper/wallpaper_view.cc b/ash/wallpaper/wallpaper_view.cc
index ec74bc7..bb7f32c 100644
--- a/ash/wallpaper/wallpaper_view.cc
+++ b/ash/wallpaper/wallpaper_view.cc
@@ -263,8 +263,6 @@
 
   aura::Window* container = root_window->GetChildById(container_id);
   wallpaper_widget->SetBounds(container->bounds());
-  if (Shell::Get()->session_controller()->IsUserSessionBlocked())
-    wallpaper_widget->GetLayer()->SetLayerBlur(login_constants::kBlurSigma);
 
   return wallpaper_widget;
 }
diff --git a/ash/wallpaper/wallpaper_widget_controller.cc b/ash/wallpaper/wallpaper_widget_controller.cc
index ecedde7..db2883c 100644
--- a/ash/wallpaper/wallpaper_widget_controller.cc
+++ b/ash/wallpaper/wallpaper_widget_controller.cc
@@ -70,6 +70,8 @@
 
 WallpaperWidgetController::~WallpaperWidgetController() {
   if (widget_) {
+    if (widget_->GetLayer()->layer_blur() > 0.0f)
+      widget_parent_->layer()->SetCacheRenderSurface(false);
     views::Widget* widget = widget_;
     RemoveObservers();
     widget->CloseNow();
@@ -88,11 +90,15 @@
 bool WallpaperWidgetController::Reparent(aura::Window* root_window,
                                          int container) {
   if (widget_) {
+    // Ensures the cache render surface of the old parent is unset.
+    widget_parent_->layer()->SetCacheRenderSurface(false);
     widget_parent_->RemoveObserver(this);
     aura::Window* window = widget_->GetNativeWindow();
     root_window->GetChildById(container)->AddChild(window);
     widget_parent_ = widget_->GetNativeWindow()->parent();
     widget_parent_->AddObserver(this);
+    if (widget_->GetLayer()->layer_blur() > 0.0f)
+      widget_parent_->layer()->SetCacheRenderSurface(true);
     return true;
   }
   // Nothing to reparent.
@@ -128,6 +134,12 @@
   }
 }
 
+void WallpaperWidgetController::SetWallpaperBlur(float blur_sigma) {
+  widget_->GetLayer()->SetLayerBlur(blur_sigma);
+  // Force the use of cache render surface to make blur more efficient.
+  widget_parent_->layer()->SetCacheRenderSurface(blur_sigma > 0.0f);
+}
+
 AnimatingWallpaperWidgetController::AnimatingWallpaperWidgetController(
     WallpaperWidgetController* controller)
     : controller_(controller) {}
diff --git a/ash/wallpaper/wallpaper_widget_controller.h b/ash/wallpaper/wallpaper_widget_controller.h
index 1c379ee9..99363043b 100644
--- a/ash/wallpaper/wallpaper_widget_controller.h
+++ b/ash/wallpaper/wallpaper_widget_controller.h
@@ -42,6 +42,9 @@
   // necessary this as |layer_| doesn't have access to the root window).
   void StartAnimating(RootWindowController* root_window_controller);
 
+  // Blur pixels of the wallpaper layer by 3 * the given amount.
+  void SetWallpaperBlur(float blur_sigma);
+
   views::Widget* widget() { return widget_; }
 
  private:
diff --git a/ash/wm/wm_snap_to_pixel_layout_manager.cc b/ash/wm/wm_snap_to_pixel_layout_manager.cc
index a28d268..a1968ee 100644
--- a/ash/wm/wm_snap_to_pixel_layout_manager.cc
+++ b/ash/wm/wm_snap_to_pixel_layout_manager.cc
@@ -19,8 +19,8 @@
 // static
 void WmSnapToPixelLayoutManager::InstallOnContainers(aura::Window* window) {
   for (aura::Window* child : window->children()) {
-    if (child->id() < kShellWindowId_Min ||
-        child->id() > kShellWindowId_Max)  // not a container
+    if (child->id() < kShellWindowId_MinContainer ||
+        child->id() > kShellWindowId_MaxContainer)  // not a container
       continue;
     if (child->GetProperty(kSnapChildrenToPixelBoundary)) {
       if (!child->layout_manager())
diff --git a/base/BUILD.gn b/base/BUILD.gn
index ca2e3b5..29b25e24 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -2449,6 +2449,7 @@
       "memory/ref_counted_unittest.nc",
       "memory/weak_ptr_unittest.nc",
       "metrics/histogram_unittest.nc",
+      "strings/string16_unittest.nc",
       "task_scheduler/task_traits_unittest.nc",
     ]
 
diff --git a/base/android/java/src/org/chromium/base/ContentUriUtils.java b/base/android/java/src/org/chromium/base/ContentUriUtils.java
index a239fd4..ba92a56c 100644
--- a/base/android/java/src/org/chromium/base/ContentUriUtils.java
+++ b/base/android/java/src/org/chromium/base/ContentUriUtils.java
@@ -176,10 +176,7 @@
     public static String getDisplayName(Uri uri, Context context, String columnField) {
         if (uri == null) return "";
         ContentResolver contentResolver = context.getContentResolver();
-        Cursor cursor = null;
-        try {
-            cursor = contentResolver.query(uri, null, null, null, null);
-
+        try (Cursor cursor = contentResolver.query(uri, null, null, null, null)) {
             if (cursor != null && cursor.getCount() >= 1) {
                 cursor.moveToFirst();
                 int displayNameIndex = cursor.getColumnIndex(columnField);
@@ -207,8 +204,6 @@
             // Some android models don't handle the provider call correctly.
             // see crbug.com/345393
             return "";
-        } finally {
-            StreamUtil.closeQuietly(cursor);
         }
         return "";
     }
@@ -226,10 +221,7 @@
             return false;
         }
         ContentResolver contentResolver = ContextUtils.getApplicationContext().getContentResolver();
-        Cursor cursor = null;
-        try {
-            cursor = contentResolver.query(uri, null, null, null, null);
-
+        try (Cursor cursor = contentResolver.query(uri, null, null, null, null)) {
             if (cursor != null && cursor.getCount() >= 1) {
                 cursor.moveToFirst();
                 return hasVirtualFlag(cursor);
@@ -238,8 +230,6 @@
             // Some android models don't handle the provider call correctly.
             // see crbug.com/345393
             return false;
-        } finally {
-            StreamUtil.closeQuietly(cursor);
         }
         return false;
     }
diff --git a/base/android/java/src/org/chromium/base/SecureRandomInitializer.java b/base/android/java/src/org/chromium/base/SecureRandomInitializer.java
index 294b1e6..bfd7b49 100644
--- a/base/android/java/src/org/chromium/base/SecureRandomInitializer.java
+++ b/base/android/java/src/org/chromium/base/SecureRandomInitializer.java
@@ -24,16 +24,12 @@
      * Safely initializes the random number generator, by seeding it with data from /dev/urandom.
      */
     public static void initialize(SecureRandom generator) throws IOException {
-        FileInputStream fis = null;
-        try {
+        try (FileInputStream fis = new FileInputStream("/dev/urandom")) {
             byte[] seedBytes = new byte[NUM_RANDOM_BYTES];
-            fis = new FileInputStream("/dev/urandom");
             if (fis.read(seedBytes) != seedBytes.length) {
                 throw new IOException("Failed to get enough random data.");
             }
             generator.setSeed(seedBytes);
-        } finally {
-            StreamUtil.closeQuietly(fis);
         }
     }
 }
diff --git a/base/message_loop/message_loop_io_posix_unittest.cc b/base/message_loop/message_loop_io_posix_unittest.cc
index 75d25ad..4a6d103 100644
--- a/base/message_loop/message_loop_io_posix_unittest.cc
+++ b/base/message_loop/message_loop_io_posix_unittest.cc
@@ -36,26 +36,10 @@
     int err = pipe(pipefds);
     ASSERT_EQ(0, err);
     read_fd_ = ScopedFD(pipefds[0]);
-    ASSERT_TRUE(SetNonBlocking(read_fd_.get()));
     write_fd_ = ScopedFD(pipefds[1]);
   }
 
   void TriggerReadEvent() {
-    // First empty the pipe buffer.
-    while (true) {
-      char c;
-      int result = HANDLE_EINTR(read(read_fd_.get(), &c, 1));
-      if (result == -1) {
-        if (errno != EWOULDBLOCK) {
-          PLOG(ERROR) << "read";
-          FAIL();
-        }
-        break;
-      }
-
-      EXPECT_GT(result, 0);
-    };
-
     // Write from the other end of the pipe to trigger the event.
     char c = '\0';
     EXPECT_EQ(1, HANDLE_EINTR(write(write_fd_.get(), &c, 1)));
@@ -87,20 +71,49 @@
   std::unique_ptr<MessageLoopForIO::FileDescriptorWatcher> watcher_to_delete_;
 };
 
-// Watcher that calls specified closures when read/write events occur.
+// Watcher that calls specified closures when read/write events occur. Verifies
+// that each non-null closure passed to this class is called once and only once.
+// Also resets the read event by reading from the FD.
 class CallClosureHandler : public MessageLoopForIO::Watcher {
  public:
   CallClosureHandler(OnceClosure read_closure, OnceClosure write_closure)
       : read_closure_(std::move(read_closure)),
         write_closure_(std::move(write_closure)) {}
 
-  ~CallClosureHandler() override {}
+  ~CallClosureHandler() override {
+    EXPECT_TRUE(read_closure_.is_null());
+    EXPECT_TRUE(write_closure_.is_null());
+  }
 
-  // base:MessagePumpFuchsia::Watcher interface
+  void SetReadClosure(OnceClosure read_closure) {
+    EXPECT_TRUE(read_closure_.is_null());
+    read_closure_ = std::move(read_closure);
+  }
+
+  void SetWriteClosure(OnceClosure write_closure) {
+    EXPECT_TRUE(write_closure_.is_null());
+    write_closure_ = std::move(write_closure);
+  }
+
+  // base:MessagePumpFuchsia::Watcher interface.
   void OnFileCanReadWithoutBlocking(int fd) override {
+    // Empty the pipe buffer to reset the event. Otherwise libevent
+    // implementation of MessageLoop may call the event handler again even if
+    // |read_closure_| below quits the RunLoop.
+    char c;
+    int result = HANDLE_EINTR(read(fd, &c, 1));
+    if (result == -1) {
+      PLOG(ERROR) << "read";
+      FAIL();
+    }
+    EXPECT_EQ(result, 1);
+
+    ASSERT_FALSE(read_closure_.is_null());
     std::move(read_closure_).Run();
   }
+
   void OnFileCanWriteWithoutBlocking(int fd) override {
+    ASSERT_FALSE(write_closure_.is_null());
     std::move(write_closure_).Run();
   }
 
@@ -238,6 +251,92 @@
   RunLoop().RunUntilIdle();
 }
 
+// Verify that non-persistent watcher is called only once.
+TEST_F(MessageLoopForIoPosixTest, NonPersistentWatcher) {
+  MessageLoopForIO message_loop;
+  MessageLoopForIO::FileDescriptorWatcher watcher(FROM_HERE);
+
+  RunLoop run_loop;
+  CallClosureHandler handler(run_loop.QuitClosure(), OnceClosure());
+
+  // Create a non-persistent watcher.
+  ASSERT_TRUE(MessageLoopForIO::current()->WatchFileDescriptor(
+      read_fd_.get(), /* persistent= */ false, MessageLoopForIO::WATCH_READ,
+      &watcher, &handler));
+
+  TriggerReadEvent();
+  run_loop.Run();
+
+  // Trigger the event again. handler should not be called again.
+  TriggerReadEvent();
+  RunLoop().RunUntilIdle();
+}
+
+// Verify that persistent watcher is called every time the event is triggered.
+TEST_F(MessageLoopForIoPosixTest, PersistentWatcher) {
+  MessageLoopForIO message_loop;
+  MessageLoopForIO::FileDescriptorWatcher watcher(FROM_HERE);
+
+  RunLoop run_loop1;
+  CallClosureHandler handler(run_loop1.QuitClosure(), OnceClosure());
+
+  // Create persistent watcher.
+  ASSERT_TRUE(MessageLoopForIO::current()->WatchFileDescriptor(
+      read_fd_.get(), /* persistent= */ true, MessageLoopForIO::WATCH_READ,
+      &watcher, &handler));
+
+  TriggerReadEvent();
+  run_loop1.Run();
+
+  RunLoop run_loop2;
+  handler.SetReadClosure(run_loop2.QuitClosure());
+
+  // Trigger the event again. handler should be called now, which will quit
+  // run_loop2.
+  TriggerReadEvent();
+  run_loop2.Run();
+}
+
+void StopWatchingAndWatchAgain(
+    MessageLoopForIO::FileDescriptorWatcher* controller,
+    int fd,
+    MessageLoopForIO::Watcher* new_handler,
+    RunLoop* run_loop) {
+  controller->StopWatchingFileDescriptor();
+
+  ASSERT_TRUE(MessageLoopForIO::current()->WatchFileDescriptor(
+      fd, /* persistent= */ true, MessageLoopForIO::WATCH_READ, controller,
+      new_handler));
+
+  run_loop->Quit();
+}
+
+// Verify that a watcher can be stopped and reused from an event handler.
+TEST_F(MessageLoopForIoPosixTest, StopAndRestartFromHandler) {
+  MessageLoopForIO message_loop;
+  MessageLoopForIO::FileDescriptorWatcher watcher(FROM_HERE);
+
+  RunLoop run_loop1;
+  RunLoop run_loop2;
+  CallClosureHandler handler2(run_loop2.QuitClosure(), OnceClosure());
+  CallClosureHandler handler1(BindOnce(&StopWatchingAndWatchAgain, &watcher,
+                                       read_fd_.get(), &handler2, &run_loop1),
+                              OnceClosure());
+
+  // Create persistent watcher.
+  ASSERT_TRUE(MessageLoopForIO::current()->WatchFileDescriptor(
+      read_fd_.get(), /* persistent= */ true, MessageLoopForIO::WATCH_READ,
+      &watcher, &handler1));
+
+  TriggerReadEvent();
+  run_loop1.Run();
+
+  // Trigger the event again. handler2 should be called now, which will quit
+  // run_loop2
+  TriggerReadEvent();
+  run_loop2.Run();
+}
+
 }  // namespace
 
 #endif  // !defined(OS_NACL)
diff --git a/base/message_loop/message_pump_fuchsia.cc b/base/message_loop/message_pump_fuchsia.cc
index ab1fab1..4199ffc 100644
--- a/base/message_loop/message_pump_fuchsia.cc
+++ b/base/message_loop/message_pump_fuchsia.cc
@@ -18,16 +18,19 @@
 MessagePumpFuchsia::MxHandleWatchController::~MxHandleWatchController() {
   if (!StopWatchingMxHandle())
     NOTREACHED();
-  if (was_destroyed_) {
-    DCHECK(!*was_destroyed_);
-    *was_destroyed_ = true;
-  }
 }
 
 bool MessagePumpFuchsia::MxHandleWatchController::StopWatchingMxHandle() {
-  // Clear |persistent_| flag, so that if we are stopped mid-callback, we
-  // won't re-instate the wait operation.
-  persistent_ = false;
+  if (was_stopped_) {
+    DCHECK(!*was_stopped_);
+    *was_stopped_ = true;
+
+    // |was_stopped_| points at a value stored on the stack, which will go out
+    // of scope. MessagePumpFuchsia::Run() will reset it only if the value is
+    // false. So we need to reset this pointer here as well, to make sure it's
+    // not used again.
+    was_stopped_ = nullptr;
+  }
 
   // If the pump is gone, or we haven't begun waiting, then there is nothing
   // to cancel.
@@ -50,17 +53,17 @@
   uint32_t events;
   __mxio_wait_end(io_, signals, &events);
 
-  // Each |watcher_| callback we invoke may delete |this| from under us. The
-  // pump has set |was_destroyed_| to point to a safe location on the calling
-  // stack, so we can use that to detect deletion mid-callback avoid doing
-  // further work that would touch |this|.
-  bool* was_destroyed = was_destroyed_;
+  // Each |watcher_| callback we invoke may stop or delete |this|. The pump has
+  // set |was_stopped_| to point to a safe location on the calling stack, so we
+  // can use that to detect being stopped mid-callback and avoid doing further
+  // work that would touch |this|.
+  bool* was_stopped = was_stopped_;
   if (events & MXIO_EVT_WRITABLE)
     watcher_->OnFileCanWriteWithoutBlocking(fd_);
-  if (!*was_destroyed && (events & MXIO_EVT_READABLE))
+  if (!*was_stopped && (events & MXIO_EVT_READABLE))
     watcher_->OnFileCanReadWithoutBlocking(fd_);
 
-  // Don't add additional work here without checking |*was_destroyed_| again.
+  // Don't add additional work here without checking |*was_stopped_| again.
 }
 
 MessagePumpFuchsia::FdWatchController::FdWatchController(
@@ -247,18 +250,18 @@
 
       mx_signals_t signals = controller->WaitEnd(packet.signal.observed);
 
-      // In the case of a persistent Watch, the Watch may be deleted by the
-      // caller within the callback, in which case |controller| is no longer
-      // valid, and we mustn't continue the watch. We check for this with a bool
-      // on the stack, which the Watch receives a pointer to, to set it so we
-      // can detect destruction.
-      bool controller_was_destroyed = false;
-      controller->was_destroyed_ = &controller_was_destroyed;
+      // In the case of a persistent Watch, the Watch may be stopped and
+      // potentially deleted by the caller within the callback, in which case
+      // |controller| should not be accessed again, and we mustn't continue the
+      // watch. We check for this with a bool on the stack, which the Watch
+      // receives a pointer to.
+      bool controller_was_stopped = false;
+      controller->was_stopped_ = &controller_was_stopped;
 
       controller->watcher_->OnMxHandleSignalled(controller->handle_, signals);
 
-      if (!controller_was_destroyed) {
-        controller->was_destroyed_ = nullptr;
+      if (!controller_was_stopped) {
+        controller->was_stopped_ = nullptr;
         if (controller->persistent_)
           controller->WaitBegin();
       }
diff --git a/base/message_loop/message_pump_fuchsia.h b/base/message_loop/message_pump_fuchsia.h
index 1aad9f79..41b4904 100644
--- a/base/message_loop/message_pump_fuchsia.h
+++ b/base/message_loop/message_pump_fuchsia.h
@@ -58,10 +58,10 @@
     // This bool is used by the pump when invoking the MxHandleWatcher callback,
     // and by the FdHandleWatchController when invoking read & write callbacks,
     // to cope with the possibility of the caller deleting the *Watcher within
-    // the callback. The pump sets |was_destroyed_| to a location on the stack,
+    // the callback. The pump sets |was_stopped_| to a location on the stack,
     // and the Watcher writes to it, if set, when deleted, allowing the pump
     // to check the value on the stack to short-cut any post-callback work.
-    bool* was_destroyed_ = nullptr;
+    bool* was_stopped_ = nullptr;
 
    protected:
     friend class MessagePumpFuchsia;
diff --git a/base/message_loop/message_pump_perftest.cc b/base/message_loop/message_pump_perftest.cc
index f5bd0dd..55b06e4c 100644
--- a/base/message_loop/message_pump_perftest.cc
+++ b/base/message_loop/message_pump_perftest.cc
@@ -285,6 +285,7 @@
         (now - start).InMicroseconds() / static_cast<double>(num_posted),
         "us/task",
         true);
+    queue->WillDestroyCurrentMessageLoop();
   }
 };
 
diff --git a/base/metrics/histogram.cc b/base/metrics/histogram.cc
index 7c2a6c2..7cdddcd 100644
--- a/base/metrics/histogram.cc
+++ b/base/metrics/histogram.cc
@@ -48,9 +48,6 @@
 constexpr uintptr_t kDummyValue = 0xDEADBEEF;
 #endif
 
-// TODO(asvitkine): Remove this after crbug/736675.
-char g_last_logged_histogram_name[256] = {0};
-
 bool ReadHistogramArguments(PickleIterator* iter,
                             std::string* histogram_name,
                             int* flags,
@@ -478,9 +475,6 @@
   DCHECK_EQ(0, ranges(0));
   DCHECK_EQ(kSampleType_MAX, ranges(bucket_count()));
 
-  strlcpy(g_last_logged_histogram_name, histogram_name().c_str(),
-          sizeof(g_last_logged_histogram_name));
-
   if (value > kSampleType_MAX - 1)
     value = kSampleType_MAX - 1;
   if (value < 0)
@@ -584,9 +578,9 @@
     return is_valid;
 
   // Abort if a problem is found (except "flags", which could legally be zero).
-  const std::string debug_string = base::StringPrintf(
-      "%s/%" PRIu32 "/%d/%s", histogram_name().c_str(), bad_fields,
-      corrupted_count, g_last_logged_histogram_name);
+  const std::string debug_string =
+      base::StringPrintf("%s/%" PRIu32 "/%d", histogram_name().c_str(),
+                         bad_fields, corrupted_count);
 #if !defined(OS_NACL)
   // Temporary for https://crbug.com/736675.
   base::debug::ScopedCrashKey crash_key("bad_histogram", debug_string);
diff --git a/base/process/memory_fuchsia.cc b/base/process/memory_fuchsia.cc
index 7ddaeb5..6f559a43 100644
--- a/base/process/memory_fuchsia.cc
+++ b/base/process/memory_fuchsia.cc
@@ -8,6 +8,10 @@
 
 namespace base {
 
+void EnableTerminationOnOutOfMemory() {
+  // Nothing to be done here.
+}
+
 void EnableTerminationOnHeapCorruption() {
   // Nothing to be done here.
 }
diff --git a/base/strings/string16.cc b/base/strings/string16.cc
index cea1932..d85859a 100644
--- a/base/strings/string16.cc
+++ b/base/strings/string16.cc
@@ -67,6 +67,8 @@
   return s_orig;
 }
 
+namespace string16_internals {
+
 std::ostream& operator<<(std::ostream& out, const string16& str) {
   return out << UTF16ToUTF8(str);
 }
@@ -75,8 +77,11 @@
   *out << str;
 }
 
+}  // namespace string16_internals
+
 }  // namespace base
 
-template class std::basic_string<base::char16, base::string16_char_traits>;
+template class std::
+    basic_string<base::char16, base::string16_internals::string16_char_traits>;
 
 #endif  // WCHAR_T_IS_UTF32
diff --git a/base/strings/string16.h b/base/strings/string16.h
index 30f4e3ee..a86baa2 100644
--- a/base/strings/string16.h
+++ b/base/strings/string16.h
@@ -42,7 +42,6 @@
 
 typedef wchar_t char16;
 typedef std::wstring string16;
-typedef std::char_traits<wchar_t> string16_char_traits;
 
 }  // namespace base
 
@@ -64,6 +63,11 @@
 BASE_EXPORT char16* c16memcpy(char16* s1, const char16* s2, size_t n);
 BASE_EXPORT char16* c16memset(char16* s, char16 c, size_t n);
 
+// This namespace contains the implementation of base::string16 along with
+// things that need to be found via argument-dependent lookup from a
+// base::string16.
+namespace string16_internals {
+
 struct string16_char_traits {
   typedef char16 char_type;
   typedef int int_type;
@@ -134,7 +138,13 @@
   }
 };
 
-typedef std::basic_string<char16, base::string16_char_traits> string16;
+}  // namespace string16_internals
+
+typedef std::basic_string<char16,
+                          base::string16_internals::string16_char_traits>
+    string16;
+
+namespace string16_internals {
 
 BASE_EXPORT extern std::ostream& operator<<(std::ostream& out,
                                             const string16& str);
@@ -142,6 +152,8 @@
 // This is required by googletest to print a readable output on test failures.
 BASE_EXPORT extern void PrintTo(const string16& str, std::ostream* out);
 
+}  // namespace string16_internals
+
 }  // namespace base
 
 // The string class will be explicitly instantiated only once, in string16.cc.
@@ -183,8 +195,9 @@
 //
 // TODO(mark): File this bug with Apple and update this note with a bug number.
 
-extern template
-class BASE_EXPORT std::basic_string<base::char16, base::string16_char_traits>;
+extern template class BASE_EXPORT
+    std::basic_string<base::char16,
+                      base::string16_internals::string16_char_traits>;
 
 // Specialize std::hash for base::string16. Although the style guide forbids
 // this in general, it is necessary for consistency with WCHAR_T_IS_UTF16
diff --git a/base/strings/string16_unittest.nc b/base/strings/string16_unittest.nc
new file mode 100644
index 0000000..5186a45
--- /dev/null
+++ b/base/strings/string16_unittest.nc
@@ -0,0 +1,25 @@
+// 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.
+
+// This is a "No Compile Test".
+// http://dev.chromium.org/developers/testing/no-compile-tests
+
+#include "base/strings/string16.h"
+
+#if defined(NCTEST_NO_KOENIG_LOOKUP_FOR_STRING16)  // [r"use of undeclared identifier 'ShouldNotBeFound'"]
+
+// base::string16 is declared as a typedef. It should not cause other functions
+// in base to be found via Argument-dependent lookup.
+
+namespace base {
+void ShouldNotBeFound(const base::string16& arg) {}
+}
+
+// Intentionally not in base:: namespace.
+void WontCompile() {
+  base::string16 s;
+  ShouldNotBeFound(s);
+}
+
+#endif
diff --git a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java b/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java
index 7d7d99c..8a23048 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java
+++ b/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java
@@ -9,6 +9,7 @@
 import android.app.Instrumentation;
 import android.content.Context;
 import android.os.Bundle;
+import android.support.test.InstrumentationRegistry;
 import android.support.test.internal.runner.RunnerArgs;
 import android.support.test.internal.runner.TestExecutor;
 import android.support.test.internal.runner.TestRequest;
@@ -46,8 +47,6 @@
 
     private static final String TAG = "BaseJUnitRunner";
 
-    private Bundle mArguments;
-
     @Override
     public Application newApplication(ClassLoader cl, String className, Context context)
             throws ClassNotFoundException, IllegalAccessException, InstantiationException {
@@ -57,12 +56,6 @@
         return super.newApplication(cl, className, context);
     }
 
-    @Override
-    public void onCreate(Bundle arguments) {
-        super.onCreate(arguments);
-        mArguments = arguments;
-    }
-
     /**
      * Add TestListInstrumentationRunListener when argument ask the runner to list tests info.
      *
@@ -72,10 +65,21 @@
      */
     @Override
     public void onStart() {
-        if (mArguments != null && mArguments.getString(LIST_ALL_TESTS_FLAG) != null) {
-            Log.w(TAG, "Runner will list out tests info in JSON without running tests");
+        Bundle arguments = InstrumentationRegistry.getArguments();
+        if (arguments != null && arguments.getString(LIST_ALL_TESTS_FLAG) != null) {
+            Log.w(TAG,
+                    String.format("Runner will list out tests info in JSON without running tests. "
+                                    + "Arguments: %s",
+                            arguments.toString()));
             listTests(); // Intentionally not calling super.onStart() to avoid additional work.
         } else {
+            if (arguments != null && arguments.getString(ARGUMENT_LOG_ONLY) != null) {
+                Log.e(TAG,
+                        String.format("Runner will log the tests without running tests."
+                                        + " If this cause a test run to fail, please report to"
+                                        + " crbug.com/754015. Arguments: %s",
+                                arguments.toString()));
+            }
             super.onStart();
         }
     }
@@ -86,12 +90,12 @@
         try {
             TestExecutor.Builder executorBuilder = new TestExecutor.Builder(this);
             executorBuilder.addRunListener(listener);
-            Bundle junit3Arguments = new Bundle(mArguments);
+            Bundle junit3Arguments = new Bundle(InstrumentationRegistry.getArguments());
             junit3Arguments.putString(ARGUMENT_NOT_ANNOTATION, "org.junit.runner.RunWith");
             TestRequest listJUnit3TestRequest = createListTestRequest(junit3Arguments);
             results = executorBuilder.build().execute(listJUnit3TestRequest);
 
-            Bundle junit4Arguments = new Bundle(mArguments);
+            Bundle junit4Arguments = new Bundle(InstrumentationRegistry.getArguments());
             junit4Arguments.putString(ARGUMENT_ANNOTATION, "org.junit.runner.RunWith");
 
             // Do not use Log runner from android test support.
@@ -103,7 +107,8 @@
 
             TestRequest listJUnit4TestRequest = createListTestRequest(junit4Arguments);
             results.putAll(executorBuilder.build().execute(listJUnit4TestRequest));
-            listener.saveTestsToJson(mArguments.getString(LIST_ALL_TESTS_FLAG));
+            listener.saveTestsToJson(
+                    InstrumentationRegistry.getArguments().getString(LIST_ALL_TESTS_FLAG));
         } catch (IOException | RuntimeException e) {
             String msg = "Fatal exception when running tests";
             Log.e(TAG, msg, e);
diff --git a/base/test/launcher/test_launcher.cc b/base/test/launcher/test_launcher.cc
index 0223991..a610b22 100644
--- a/base/test/launcher/test_launcher.cc
+++ b/base/test/launcher/test_launcher.cc
@@ -62,6 +62,12 @@
 #include "base/win/windows_version.h"
 #endif
 
+#if defined(OS_FUCHSIA)
+// TODO(scottmg): For temporary code in OnOutputTimeout().
+#include <magenta/syscalls.h>
+#include <magenta/syscalls/object.h>
+#endif
+
 namespace base {
 
 // See https://groups.google.com/a/chromium.org/d/msg/chromium-dev/nkdTP7sstSc/uT3FaE_sgkAJ .
@@ -1169,6 +1175,26 @@
 #else
     fprintf(stdout, "\t%s\n", pair.second.GetCommandLineString().c_str());
 #endif
+
+#if defined(OS_FUCHSIA)
+    // TODO(scottmg): Temporary code to try to identify why child processes
+    // appear to not be terminated after a timeout correctly.
+    // https://crbug.com/750370 and https://crbug.com/738275.
+
+    mx_info_process_t proc_info = {};
+    mx_status_t status =
+        mx_object_get_info(pair.first, MX_INFO_PROCESS, &proc_info,
+                           sizeof(proc_info), nullptr, nullptr);
+    if (status != MX_OK) {
+      fprintf(stdout, "mx_object_get_info failed for '%s', status=%d\n",
+              pair.second.GetCommandLineString().c_str(), status);
+    } else {
+      fprintf(stdout, "  return_code=%d\n", proc_info.return_code);
+      fprintf(stdout, "  started=%d\n", proc_info.started);
+      fprintf(stdout, "  exited=%d\n", proc_info.exited);
+      fprintf(stdout, "  debugger_attached=%d\n", proc_info.debugger_attached);
+    }
+#endif  // OS_FUCHSIA
   }
 
   fflush(stdout);
diff --git a/base/threading/platform_thread.h b/base/threading/platform_thread.h
index ad1b7d4..0fb7073 100644
--- a/base/threading/platform_thread.h
+++ b/base/threading/platform_thread.h
@@ -20,6 +20,8 @@
 #include <windows.h>
 #elif defined(OS_MACOSX)
 #include <mach/mach_types.h>
+#elif defined(OS_FUCHSIA)
+#include <magenta/types.h>
 #elif defined(OS_POSIX)
 #include <pthread.h>
 #include <unistd.h>
@@ -32,6 +34,8 @@
 typedef DWORD PlatformThreadId;
 #elif defined(OS_MACOSX)
 typedef mach_port_t PlatformThreadId;
+#elif defined(OS_FUCHSIA)
+typedef mx_handle_t PlatformThreadId;
 #elif defined(OS_POSIX)
 typedef pid_t PlatformThreadId;
 #endif
diff --git a/base/threading/platform_thread_fuchsia.cc b/base/threading/platform_thread_fuchsia.cc
index 6a9ed18..aea9551 100644
--- a/base/threading/platform_thread_fuchsia.cc
+++ b/base/threading/platform_thread_fuchsia.cc
@@ -52,7 +52,8 @@
 void PlatformThread::SetName(const std::string& name) {
   // TODO(fuchsia): There's no system-level API to communicate a thread name
   // (for the debugger, etc.), so for now only set to our internal mechanisms.
-  ThreadIdNameManager::GetInstance()->SetName(pthread_self(), name);
+  ThreadIdNameManager::GetInstance()->SetName(PlatformThread::CurrentId(),
+                                              name);
   tracked_objects::ThreadData::InitializeThreadContext(name);
 }
 
diff --git a/base/threading/platform_thread_posix.cc b/base/threading/platform_thread_posix.cc
index e049a54..d1e6e675 100644
--- a/base/threading/platform_thread_posix.cc
+++ b/base/threading/platform_thread_posix.cc
@@ -28,6 +28,10 @@
 #include <sys/syscall.h>
 #endif
 
+#if defined(OS_FUCHSIA)
+#include <magenta/process.h>
+#endif
+
 namespace base {
 
 void InitThreading();
@@ -137,7 +141,9 @@
   return syscall(__NR_gettid);
 #elif defined(OS_ANDROID)
   return gettid();
-#elif defined(OS_SOLARIS) || defined(OS_QNX) || defined(OS_FUCHSIA)
+#elif defined(OS_FUCHSIA)
+  return mx_thread_self();
+#elif defined(OS_SOLARIS) || defined(OS_QNX)
   return pthread_self();
 #elif defined(OS_NACL) && defined(__GLIBC__)
   return pthread_self();
diff --git a/base/trace_event/memory_dump_scheduler_unittest.cc b/base/trace_event/memory_dump_scheduler_unittest.cc
index 676be989..18c9a34 100644
--- a/base/trace_event/memory_dump_scheduler_unittest.cc
+++ b/base/trace_event/memory_dump_scheduler_unittest.cc
@@ -42,8 +42,8 @@
  protected:
   MemoryDumpScheduler scheduler_;
   WaitableEvent evt_;
-  Thread bg_thread_;
   CallbackWrapper on_tick_;
+  Thread bg_thread_;
 };
 
 TEST_F(MemoryDumpSchedulerTest, SingleTrigger) {
diff --git a/build/android/BUILD.gn b/build/android/BUILD.gn
index f00a35c..80c21c1 100644
--- a/build/android/BUILD.gn
+++ b/build/android/BUILD.gn
@@ -11,6 +11,13 @@
       "buildhooks/java/org/chromium/build/BuildHooks.java",
       "buildhooks/java/org/chromium/build/Callback.java",
     ]
+
+    # Make all targets pull in the try-with-resources support files.
+    # If an apk ends up not using any such statements, ProGuard will remove
+    # them.
+    deps = [
+      "//third_party/bazel/desugar:desugar_runtime_java",
+    ]
     no_build_hooks = true
     supports_android = true
   }
diff --git a/build/android/apk_operations.py b/build/android/apk_operations.py
index 2f695f4..d38ffb5d 100644
--- a/build/android/apk_operations.py
+++ b/build/android/apk_operations.py
@@ -40,9 +40,14 @@
   devices_obj.pMap(uninstall)
 
 
-def _LaunchUrl(devices_obj, input_args, device_args_file, url, apk_package):
+def _LaunchUrl(devices_obj, input_args, device_args_file, url, apk):
   if input_args and device_args_file is None:
-    raise Exception("This apk does not support any flags.")
+    raise Exception('This apk does not support any flags.')
+  if url:
+    view_activity = apk.GetViewActivityName()
+    if not view_activity:
+      raise Exception('APK does not support launching with URLs.')
+
   def launch(device):
     # The flags are first updated with input args.
     changer = flag_changer.FlagChanger(device, device_args_file)
@@ -53,12 +58,13 @@
     # Then launch the apk.
     if url is None:
       # Simulate app icon click if no url is present.
-      cmd = ['monkey', '-p', apk_package, '-c',
+      cmd = ['monkey', '-p', apk.GetPackageName(), '-c',
              'android.intent.category.LAUNCHER', '1']
       device.RunShellCommand(cmd, check_return=True)
     else:
-      launch_intent = intent.Intent(
-          action='android.intent.action.VIEW', package=apk_package, data=url)
+      launch_intent = intent.Intent(action='android.intent.action.VIEW',
+                                    activity=view_activity, data=url,
+                                    package=apk.GetPackageName())
       device.StartActivity(launch_intent)
   devices_obj.pMap(launch)
 
@@ -287,11 +293,13 @@
     _UninstallApk(install_dict, devices_obj, apk_package)
   elif command == 'launch':
     _LaunchUrl(devices_obj, args.args, command_line_flags_file,
-               args.url, apk_package)
+               args.url, apk)
   elif command == 'run':
+    logging.warning('Installing...')
     _InstallApk(apk, install_dict, devices_obj)
+    logging.warning('Sending launch intent...')
     _LaunchUrl(devices_obj, args.args, command_line_flags_file,
-               args.url, apk_package)
+               args.url, apk)
   elif command == 'stop':
     devices_obj.ForceStop(apk_package)
   elif command == 'clear-data':
@@ -318,6 +326,7 @@
     if args.verbose_count > 0:
       flags.append('--verbose')
     logging.warning('Running: %s', ' '.join(pipes.quote(f) for f in flags))
+    logging.warning('All subsequent output is from adb_gdb script.')
     os.execv(gdb_script_path, flags)
   elif command == 'logcat':
     adb_path = adb_wrapper.AdbWrapper.GetAdbPath()
diff --git a/build/android/gradle/generate_gradle.py b/build/android/gradle/generate_gradle.py
index 30818293..a5e29ee 100755
--- a/build/android/gradle/generate_gradle.py
+++ b/build/android/gradle/generate_gradle.py
@@ -57,6 +57,12 @@
     '//content/shell/android:content_shell_apk',
 ]
 
+_EXCLUDED_PREBUILT_JARS = [
+    # Android Studio already provides Desugar runtime.
+    # Including it would cause linking error because of a duplicate class.
+    'lib.java/third_party/bazel/desugar/Desugar-runtime.jar'
+]
+
 
 def _TemplatePath(name):
   return os.path.join(_FILE_DIR, '{}.jinja'.format(name))
@@ -223,7 +229,8 @@
     return [p for p in self.JavaFiles() if not p.startswith('..')]
 
   def PrebuiltJars(self):
-    return self.Gradle().get('dependent_prebuilt_jars', [])
+    all_jars = self.Gradle().get('dependent_prebuilt_jars', [])
+    return [i for i in all_jars if i not in _EXCLUDED_PREBUILT_JARS]
 
   def AllEntries(self):
     """Returns a list of all entries that the current entry depends on.
diff --git a/build/android/gyp/create_test_runner_script.py b/build/android/gyp/create_test_runner_script.py
index f6a2c3d..a67da882 100755
--- a/build/android/gyp/create_test_runner_script.py
+++ b/build/android/gyp/create_test_runner_script.py
@@ -70,14 +70,14 @@
   group.add_argument('--additional-apk-incremental', action='append',
                      dest='additional_apks_incremental', default=[])
   group.add_argument('--apk-under-test')
-  group.add_argument('--apk-under-test-incremental-install-script')
+  group.add_argument('--apk-under-test-incremental-install-json')
   group.add_argument('--executable-dist-dir')
   group.add_argument('--isolate-file-path')
   group.add_argument('--output-directory')
   group.add_argument('--runtime-deps-path')
   group.add_argument('--test-apk')
   group.add_argument('--test-jar')
-  group.add_argument('--test-apk-incremental-install-script')
+  group.add_argument('--test-apk-incremental-install-json')
   group.add_argument('--coverage-dir')
   group.add_argument('--android-manifest-path')
   group.add_argument('--resource-zips')
@@ -112,11 +112,11 @@
   if args.apk_under_test:
     test_runner_path_args.append(
         ('--apk-under-test', RelativizePathToScript(args.apk_under_test)))
-  if args.apk_under_test_incremental_install_script:
+  if args.apk_under_test_incremental_install_json:
     test_runner_path_args.append(
-        ('--apk-under-test-incremental-install-script',
+        ('--apk-under-test-incremental-install-json',
          RelativizePathToScript(
-             args.apk_under_test_incremental_install_script)))
+             args.apk_under_test_incremental_install_json)))
   if args.executable_dist_dir:
     test_runner_path_args.append(
         ('--executable-dist-dir',
@@ -136,10 +136,10 @@
   if args.test_jar:
     test_runner_path_args.append(
         ('--test-jar', RelativizePathToScript(args.test_jar)))
-  if args.test_apk_incremental_install_script:
+  if args.test_apk_incremental_install_json:
     test_runner_path_args.append(
-        ('--test-apk-incremental-install-script',
-         RelativizePathToScript(args.test_apk_incremental_install_script)))
+        ('--test-apk-incremental-install-json',
+         RelativizePathToScript(args.test_apk_incremental_install_json)))
   if args.coverage_dir:
     test_runner_path_args.append(
         ('--coverage-dir', RelativizePathToScript(args.coverage_dir)))
diff --git a/build/android/gyp/desugar.py b/build/android/gyp/desugar.py
index 6455279..bf51b007 100755
--- a/build/android/gyp/desugar.py
+++ b/build/android/gyp/desugar.py
@@ -6,9 +6,7 @@
 
 import argparse
 import os
-import shutil
 import sys
-import tempfile
 
 from util import build_utils
 
@@ -30,10 +28,9 @@
       bootclasspath_entry,
       '--output',
       output_jar,
-      # Disable try-with-resources due to proguard duplicate zip entry error
-      # TODO(zpeng): Enable try-with-resources with
-      #    desugar_try_with_resources_omit_runtime_classes
-      '--desugar_try_with_resources_if_needed=false',
+      # Don't include try-with-resources files in every .jar. Instead, they
+      # are included via //third_party/bazel/desugar:desugar_runtime_java.
+      '--desugar_try_with_resources_omit_runtime_classes',
   ]
   for path in classpath:
     cmd += ['--classpath_entry', path]
diff --git a/build/android/gyp/javac.py b/build/android/gyp/javac.py
index adeed36..3ca6bd5 100755
--- a/build/android/gyp/javac.py
+++ b/build/android/gyp/javac.py
@@ -371,8 +371,11 @@
   if options.java_version == '1.8' and options.bootclasspath:
     # Android's boot jar doesn't contain all java 8 classes.
     # See: https://github.com/evant/gradle-retrolambda/issues/23.
-    javac_path = os.path.realpath(distutils.spawn.find_executable('javac'))
-    jdk_dir = os.path.dirname(os.path.dirname(javac_path))
+    # Get the path of the jdk folder by searching for the 'jar' executable. We
+    # cannot search for the 'javac' executable because goma provides a custom
+    # version of 'javac'.
+    jar_path = os.path.realpath(distutils.spawn.find_executable('jar'))
+    jdk_dir = os.path.dirname(os.path.dirname(jar_path))
     rt_jar = os.path.join(jdk_dir, 'jre', 'lib', 'rt.jar')
     options.bootclasspath.append(rt_jar)
 
diff --git a/build/android/lint/suppressions.xml b/build/android/lint/suppressions.xml
index 7ad4dde..faf554e 100644
--- a/build/android/lint/suppressions.xml
+++ b/build/android/lint/suppressions.xml
@@ -143,6 +143,7 @@
     <ignore regexp="chrome/android/webapk/shell_apk/res"/>
     <ignore regexp="chromecast/internal"/>
     <ignore regexp="tools/android/push_apps_to_background/res"/>
+    <ignore regexp="ui/android/java/res"/>
   </issue>
   <issue id="ImpliedQuantity" severity="Error">
     <ignore regexp="chrome/android/chrome_strings_grd"/>
@@ -193,6 +194,8 @@
   <issue id="NewApi" severity="ignore"/>
   <issue id="NewApi">
     <ignore regexp="Attribute `paddingStart` referenced here can result in a crash on some specific devices older than API 17"/>
+    <!-- We support try-with-resources via desugar. -->
+    <ignore regexp="Try-with-resources requires API level 19"/>
     <ignore regexp="chrome/android/java/res/values-v17/styles.xml"/>
     <ignore regexp="chromecast/internal"/>
     <ignore regexp="com/android/tv"/>
@@ -312,19 +315,16 @@
     <ignore regexp="chrome/android/java/res/layout/signin_promo_view.xml"/>
     <ignore regexp="R.dimen.signin_promo_account_image_size"/>
     <ignore regexp="R.dimen.signin_promo_cold_state_image_size"/>
+    <!-- Used by Android's policies system, pulled from app directly -->
+    <ignore regexp="restriction_values.xml"/>
     <!-- TODO(wnwen): Clean up the suppressions below this comment -->
     <ignore regexp="android_ui_strings.xml"/>
     <ignore regexp="android_webview/java/res/drawable-hdpi/ic_play_circle_outline_black_48dp.png"/>
     <ignore regexp="android_webview/test/shell/res/raw/resource_file.html"/>
     <ignore regexp="android_webview/test/shell/res/raw/resource_icon.png"/>
     <ignore regexp="android_webview/tools/automated_ui_tests/java/res/"/>
-    <ignore regexp="chrome/android/java/res/drawable-hdpi/*"/>
-    <ignore regexp="chrome/android/java/res/drawable-nodpi/missing.png"/>
-    <ignore regexp="chrome/android/java/res/values-v17/styles.xml"/>
     <ignore regexp="chromecast/browser/android/apk/res/values/strings.xml"/>
     <ignore regexp="chromecast/internal"/>
-    <ignore regexp="clank"/>
-    <ignore regexp="content/shell/android/java/res/mipmap-hdpi/app_icon.png"/>
     <ignore regexp="android_webview/locale_paks.resources.zip/*"/>
     <ignore regexp="android_webview/strings_grd.resources.zip/values/android_webview_strings.xml"/>
     <ignore regexp="components/strings/components_strings_grd.resources.zip/values.*/components_strings.xml"/>
@@ -336,87 +336,6 @@
     <ignore regexp="remoting/android/java/res/drawable-hdpi/ic_zoom_out.png"/>
     <ignore regexp="remoting/android/java/res/layout/navigation_list_item.xml"/>
     <ignore regexp="remoting/android/java/res/values-v17/styles.xml"/>
-    <!-- Used by Android's policies system -->
-    <ignore regexp="restriction_values.xml"/>
-    <ignore regexp="ui/android/java/res/drawable-hdpi/verify_checkmark.png"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="ui/android/java/res/values/dimens.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="components/autofill/android/java/res/values/dimens.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="components/autofill/android/java/res/drawable/autofill_chip_inset.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="components/autofill/android/java/res/layout/autofill_keyboard_accessory_icon.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="components/autofill/android/java/res/layout/autofill_keyboard_accessory_item.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="content/public/android/java/res/raw/empty.wav"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="content/public/android/java/res/drawable-hdpi/ic_menu_share_holo_light.png"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="content/public/android/java/res/drawable-hdpi/ic_search.png"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="content/public/android/java/res/menu/select_action_menu.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="remoting/android/java/res/menu/chromoting_actionbar.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="remoting/android/java/res/menu/desktop_actionbar.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="remoting/android/java/res/menu/host_context_menu.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="remoting/android/java/res/drawable-hdpi/*"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="content/public/android/java/res/values-v17/styles.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="content/public/android/content_strings_grd.resources.zip/values/android_content_strings.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="components/web_contents_delegate_android/android/java/res/drawable-hdpi/bubble.9.png"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="components/web_contents_delegate_android/android/java/res/drawable-hdpi/bubble_arrow_up.png"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="components/web_contents_delegate_android/android/java/res/drawable-hdpi/ic_warning.png"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="components/web_contents_delegate_android/android/java/res/layout/validation_message_bubble.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="content/shell/android/java/res/drawable/ic_refresh.png"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="content/shell/android/java/res/drawable/progress.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="content/shell/android/java/res/layout/shell_view.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="content/shell/android/java/res/values/strings.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="android_webview/test/shell/res/values/config.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="android_webview/test/shell/res/layout/testshell_activity.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="chrome/android/java/res/anim/accelerate_quart.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="chrome/android/java/res/layout/accessibility_tab_switcher.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="chrome/android/java/res/drawable/accessibility_tab_switcher_divider.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="chrome/android/java/res/layout/accessibility_tab_switcher_list_item.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="chrome/android/java/res/layout/account_chooser_dialog_item.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="chrome/android/java/res/layout/account_chooser_dialog_title.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="chrome/android/java/res/drawable-hdpi/account_management_no_picture.png"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="chrome/android/java/res/xml/account_management_preferences.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="chrome/android/java/res/anim/activity_close_exit.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="chrome/android/java/res/anim/activity_open_enter.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values/android_chrome_strings.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="content/shell/android/shell_apk/res/layout/content_shell_activity.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="content/shell/android/linker_test_apk/res/layout/test_activity.xml"/>
-    <!-- TODO(crbug.com/635567): Fix this properly. -->
-    <ignore regexp="content/shell/android/shell_apk/res/values/strings.xml"/>
   </issue>
   <issue id="UseCompoundDrawables">
     <!-- Upscaling 24dp to 48dp doesn't work as expected with a TextView compound drawable. -->
diff --git a/build/android/pylib/local/device/local_device_instrumentation_test_run.py b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
index 51611f2..9b8ef58 100644
--- a/build/android/pylib/local/device/local_device_instrumentation_test_run.py
+++ b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
@@ -597,7 +597,12 @@
         extras['package'] = '.'.join(test_package.split('.')[:2])
         extras[_EXTRA_TEST_LIST] = dev_test_list_json.name
         target = '%s/%s' % (test_package, junit4_runner_class)
-        dev.StartInstrumentation(target, extras=extras)
+        test_list_run_output = dev.StartInstrumentation(
+            target, extras=extras)
+        if any(test_list_run_output):
+          logging.error('Unexpected output while listing tests:')
+          for line in test_list_run_output:
+            logging.error('  %s', line)
         with tempfile_ext.NamedTemporaryDirectory() as host_dir:
           host_file = os.path.join(host_dir, 'list_tests.json')
           dev.PullFile(dev_test_list_json.name, host_file)
diff --git a/build/android/pylib/utils/instrumentation_tracing.py b/build/android/pylib/utils/instrumentation_tracing.py
index fe23894..7e00c58 100644
--- a/build/android/pylib/utils/instrumentation_tracing.py
+++ b/build/android/pylib/utils/instrumentation_tracing.py
@@ -4,7 +4,15 @@
 
 """Functions to instrument all Python function calls.
 
-Generates a JSON file readable by Chrome's about:tracing."""
+This generates a JSON file readable by Chrome's about:tracing. To use it,
+either call start_instrumenting and stop_instrumenting at the appropriate times,
+or use the Instrument context manager.
+
+A function is only traced if it is from a Python module that matches at least
+one regular expression object in to_include, and does not match any in
+to_exclude. In between the start and stop events, every function call of a
+function from such a module will be added to the trace.
+"""
 
 import contextlib
 import functools
diff --git a/build/android/test_runner.pydeps b/build/android/test_runner.pydeps
index 1d03946..573577e 100644
--- a/build/android/test_runner.pydeps
+++ b/build/android/test_runner.pydeps
@@ -71,6 +71,7 @@
 ../../third_party/catapult/devil/devil/utils/host_utils.py
 ../../third_party/catapult/devil/devil/utils/lazy/__init__.py
 ../../third_party/catapult/devil/devil/utils/lazy/weak_constant.py
+../../third_party/catapult/devil/devil/utils/logging_common.py
 ../../third_party/catapult/devil/devil/utils/lsusb.py
 ../../third_party/catapult/devil/devil/utils/parallelizer.py
 ../../third_party/catapult/devil/devil/utils/reraiser_thread.py
diff --git a/build/config/android/config.gni b/build/config/android/config.gni
index 1ff5744..8135f242 100644
--- a/build/config/android/config.gni
+++ b/build/config/android/config.gni
@@ -80,7 +80,7 @@
   }
 
   webview_public_framework_jar =
-      "//third_party/android_platform/webview/frameworks_7.1.1_r28.jar"
+      "//third_party/android_system_sdk/android_system.jar"
   if (!defined(webview_framework_jar)) {
     webview_framework_jar = webview_public_framework_jar
   }
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index a5fb140..8202c1d 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -2926,7 +2926,6 @@
   #     any apk that depends on this library.
   #   ignore_aidl: Whether to ignore .aidl files found with the .aar.
   #   ignore_assets: Whether to ignore assets found in the .aar.
-  #   ignore_manifest: Whether to ignore merging of AndroidManifest.xml.
   #   ignore_native_libraries: Whether to ignore .so files found in the .aar.
   #   create_srcjar: If false, does not create an R.java file.
   #   TODO(jbudorick@): remove this arguments after crbug.com/522043 is fixed.
@@ -2941,8 +2940,6 @@
     _unpack_target_name = "${target_name}__unpack_aar"
     _ignore_aidl = defined(invoker.ignore_aidl) && invoker.ignore_aidl
     _ignore_assets = defined(invoker.ignore_assets) && invoker.ignore_assets
-    _ignore_manifest =
-        defined(invoker.ignore_manifest) && invoker.ignore_manifest
     _ignore_native_libraries = defined(invoker.ignore_native_libraries) &&
                                invoker.ignore_native_libraries
 
@@ -2968,11 +2965,6 @@
     assert(_ignore_native_libraries || !_scanned_files.has_native_libraries,
            "android_aar_prebuilt() with .so files is not supported." +
                " Use ignore_native_libraries = true to silence this error.")
-    assert(_ignore_manifest || _scanned_files.is_manifest_empty,
-           "android_aar_prebuilt() manifest merging not yet supported and" +
-               " non-trivial AndroidManifest.xml detected." +
-               " Implement or use ignore_manifest = true." +
-               " http://crbug.com/643967")
     assert(_scanned_files.has_classes_jar || _scanned_files.subjars == [])
 
     action(_unpack_target_name) {
@@ -3015,7 +3007,8 @@
     }
 
     # Create the android_resources target for resources.
-    if (_scanned_files.resources != [] || _scanned_files.has_r_text_file) {
+    if (_scanned_files.resources != [] || _scanned_files.has_r_text_file ||
+        !_scanned_files.is_manifest_empty) {
       _res_target_name = "${target_name}__res"
       android_resources(_res_target_name) {
         forward_variables_from(invoker,
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 971edb0d..e2f4211 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -1204,12 +1204,10 @@
 
         # TODO(thakis ): https://crbug.com/683349
         "-Wno-user-defined-warnings",
-      ]
 
-      if (llvm_force_head_revision) {
         # TODO(thakis): https://crbug.com/753973
-        cflags += [ "-Wno-enum-compare-switch" ]
-      }
+        "-Wno-enum-compare-switch",
+      ]
     } else if (use_xcode_clang && xcode_version_int >= 830) {
       # This is necessary to allow a progressive transition from using xcode 8.0
       # to 8.3 or more recent. Remove when all bots are migrated to 8.3.
diff --git a/build/config/sanitizers/BUILD.gn b/build/config/sanitizers/BUILD.gn
index 541952e4..65966cf1 100644
--- a/build/config/sanitizers/BUILD.gn
+++ b/build/config/sanitizers/BUILD.gn
@@ -200,7 +200,7 @@
       ldflags += [ "-fsanitize=vptr" ]
     }
 
-    if (use_sanitizer_coverage && current_toolchain != "//build/toolchain/mac:clang_x64") {
+    if (use_sanitizer_coverage) {
       ldflags += [ "-fsanitize-coverage=$sanitizer_coverage_flags" ]
     }
 
@@ -380,7 +380,7 @@
 config("coverage_flags") {
   cflags = []
 
-  if (use_sanitizer_coverage  && current_toolchain != "//build/toolchain/mac:clang_x64") {
+  if (use_sanitizer_coverage) {
     cflags += [
       "-fsanitize-coverage=$sanitizer_coverage_flags",
       "-mllvm",
diff --git a/build/config/sanitizers/sanitizers.gni b/build/config/sanitizers/sanitizers.gni
index fb2a83c..3b2ed9b 100644
--- a/build/config/sanitizers/sanitizers.gni
+++ b/build/config/sanitizers/sanitizers.gni
@@ -206,3 +206,11 @@
 # printed.
 assert(!use_cfi_recover || use_cfi_diag,
        "Only use CFI recovery together with diagnostics.")
+
+# TODO(crbug.com/753445): the use_sanitizer_coverage arg is currently
+# not supported by the Chromium mac_clang_x64 toolchain.
+assert(
+    !(use_sanitizer_coverage && is_mac),
+    "crbug.com/753445: use_sanitizer_coverage=true is not supported by the " +
+        "Chromium mac_clang_x64 toolchain. Please set the argument value to " +
+        "false.")
diff --git a/build/mac_toolchain.py b/build/mac_toolchain.py
index 3852dba..50f2ef6f 100755
--- a/build/mac_toolchain.py
+++ b/build/mac_toolchain.py
@@ -13,6 +13,7 @@
       user interaction.
 """
 
+from distutils.version import LooseVersion
 import os
 import platform
 import plistlib
@@ -132,10 +133,11 @@
     os.unlink(name)
 
 
-def AcceptLicense(target_os):
-  """Use xcodebuild to accept new toolchain license if necessary.  Don't accept
-  the license if a newer license has already been accepted. This only works if
-  xcodebuild and xcode-select are passwordless in sudoers."""
+def FinalizeUnpack(target_os):
+  """Use xcodebuild to accept new toolchain license and run first launch
+  installers if necessary.  Don't accept the license if a newer license has
+  already been accepted. This only works if xcodebuild and xcode-select are
+  passwordless in sudoers."""
 
   # Check old license
   try:
@@ -164,6 +166,11 @@
     pass
 
   print "Accepting license."
+  target_version_plist_path = \
+      os.path.join(TOOLCHAIN_BUILD_DIR % target_os,
+                   *['Contents','version.plist'])
+  target_version_plist = LoadPlist(target_version_plist_path)
+  short_version_string = target_version_plist['CFBundleShortVersionString']
   old_path = subprocess.Popen(['/usr/bin/xcode-select', '-p'],
                                stdout=subprocess.PIPE).communicate()[0].strip()
   try:
@@ -171,6 +178,11 @@
         TOOLCHAIN_BUILD_DIR % target_os, 'Contents/Developer')
     subprocess.check_call(['sudo', '/usr/bin/xcode-select', '-s', build_dir])
     subprocess.check_call(['sudo', '/usr/bin/xcodebuild', '-license', 'accept'])
+
+    if target_os == 'ios' and \
+        LooseVersion(short_version_string) >= LooseVersion("9.0"):
+      print "Installing packages."
+      subprocess.check_call(['sudo', '/usr/bin/xcodebuild', '-runFirstLaunch'])
   finally:
     subprocess.check_call(['sudo', '/usr/bin/xcode-select', '-s', old_path])
 
@@ -216,7 +228,7 @@
 
   if ReadStampFile(target_os) == toolchain_version:
     print 'Toolchain (%s) is already up to date.' % toolchain_version
-    AcceptLicense(target_os)
+    FinalizeUnpack(target_os)
     return 0
 
   if not CanAccessToolchainBucket():
@@ -234,7 +246,7 @@
     toolchain_file = toolchain_filename % toolchain_version
     toolchain_full_url = TOOLCHAIN_URL + toolchain_file
     DownloadAndUnpack(toolchain_full_url, TOOLCHAIN_BUILD_DIR % target_os)
-    AcceptLicense(target_os)
+    FinalizeUnpack(target_os)
 
     print 'Toolchain %s unpacked.' % toolchain_version
     WriteStampFile(target_os, toolchain_version)
diff --git a/build/sanitizers/tsan_suppressions.cc b/build/sanitizers/tsan_suppressions.cc
index cbeeee4..182b8c21 100644
--- a/build/sanitizers/tsan_suppressions.cc
+++ b/build/sanitizers/tsan_suppressions.cc
@@ -265,10 +265,6 @@
     //
     "race:third_party/harfbuzz-ng/src/*\n"
 
-    // TODO(asvitkine): Remove these after crbug/736675.
-    "race:base::Histogram::AddCount\n"
-    "race:AddCount\n"
-
     // End of suppressions.
     ;  // Please keep this semicolon.
 
diff --git a/build/secondary/third_party/android_tools/BUILD.gn b/build/secondary/third_party/android_tools/BUILD.gn
index 17b27f3..fe5ee4c4 100644
--- a/build/secondary/third_party/android_tools/BUILD.gn
+++ b/build/secondary/third_party/android_tools/BUILD.gn
@@ -56,7 +56,6 @@
   ]
   _lib_name = "design"
   aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("android_support_transition_java") {
@@ -65,7 +64,6 @@
   ]
   _lib_name = "transition"
   aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("android_support_multidex_java") {
@@ -91,32 +89,27 @@
   _lib_name = "support-compat"
   aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar"
   ignore_aidl = true  # We don't appear to need these currently.
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("android_support_core_ui_java") {
   _lib_name = "support-core-ui"
   aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("android_support_core_utils_java") {
   _lib_name = "support-core-utils"
   aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("android_support_fragment_java") {
   _lib_name = "support-fragment"
   aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("android_support_media_compat_java") {
   _lib_name = "support-media-compat"
   aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar"
   ignore_aidl = true  # We don't appear to need these currently.
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("android_support_v13_java") {
@@ -126,19 +119,16 @@
   ]
   _lib_name = "support-v13"
   aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("android_support_vector_drawable_java") {
   _lib_name = "support-vector-drawable"
   aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("android_support_v7_appcompat_java_internal") {
   _lib_name = "appcompat-v7"
   aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar"
-  ignore_manifest = true
 }
 
 java_group("android_support_v7_appcompat_java") {
@@ -155,7 +145,6 @@
   ]
   _lib_name = "gridlayout-v7"
   aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("android_support_v7_mediarouter_java") {
@@ -164,7 +153,6 @@
   ]
   _lib_name = "mediarouter-v7"
   aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("android_support_v7_recyclerview_java") {
@@ -173,7 +161,6 @@
   ]
   _lib_name = "recyclerview-v7"
   aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("android_support_v7_preference_java") {
@@ -182,7 +169,6 @@
   ]
   _lib_name = "preference-v7"
   aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("android_support_v14_preference_java") {
@@ -191,7 +177,6 @@
   ]
   _lib_name = "preference-v14"
   aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("android_support_v17_leanback_java") {
@@ -201,7 +186,6 @@
   ]
   _lib_name = "leanback-v17"
   aar_path = "$lib_path/$_lib_name/$lib_version/$_lib_name-$lib_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("android_support_v17_preference_java") {
@@ -255,7 +239,6 @@
   _lib_name = "play-services-basement"
   aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar"
   input_jars_paths = [ "$android_sdk/optional/org.apache.http.legacy.jar" ]
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("google_play_services_tasks_java") {
@@ -264,7 +247,6 @@
   ]
   _lib_name = "play-services-tasks"
   aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("google_play_services_base_java") {
@@ -274,7 +256,6 @@
   ]
   _lib_name = "play-services-base"
   aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("google_play_services_auth_base_java") {
@@ -284,7 +265,6 @@
   ]
   _lib_name = "play-services-auth-base"
   aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("google_play_services_auth_java") {
@@ -295,7 +275,6 @@
   ]
   _lib_name = "play-services-auth"
   aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("google_play_services_cast_java") {
@@ -306,7 +285,6 @@
   ]
   _lib_name = "play-services-cast"
   aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("google_play_services_iid_java") {
@@ -316,7 +294,6 @@
   ]
   _lib_name = "play-services-iid"
   aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("google_play_services_gcm_java") {
@@ -327,7 +304,6 @@
   ]
   _lib_name = "play-services-gcm"
   aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("google_play_services_location_java") {
@@ -337,7 +313,6 @@
   ]
   _lib_name = "play-services-location"
   aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("google_play_services_nearby_java") {
@@ -347,7 +322,6 @@
   ]
   _lib_name = "play-services-nearby"
   aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar"
-  ignore_manifest = true
 }
 
 android_aar_prebuilt("google_play_services_vision_java") {
@@ -357,7 +331,6 @@
   ]
   _lib_name = "play-services-vision"
   aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar"
-  ignore_manifest = true
 }
 
 # TODO(paulmiller): Replace this with a proper target after rolling to a GMS
diff --git a/build/toolchain/mac/BUILD.gn b/build/toolchain/mac/BUILD.gn
index 5310a61..85aa44f7 100644
--- a/build/toolchain/mac/BUILD.gn
+++ b/build/toolchain/mac/BUILD.gn
@@ -460,6 +460,10 @@
   toolchain_args = {
     current_cpu = "x64"
     current_os = "mac"
+
+    # TODO(crbug.com/753445): the use_sanitizer_coverage arg is currently
+    # not supported by the Chromium mac_clang_x64 toolchain.
+    use_sanitizer_coverage = false
   }
 }
 
diff --git a/build/vs_toolchain.py b/build/vs_toolchain.py
index 6555127..88dda3b 100755
--- a/build/vs_toolchain.py
+++ b/build/vs_toolchain.py
@@ -328,13 +328,18 @@
   if not win_sdk_dir:
     return
 
-  debug_files = ['dbghelp.dll', 'dbgcore.dll']
-  for debug_file in debug_files:
+  # List of debug files that should be copied, the first element of the tuple is
+  # the name of the file and the second indicates if it's optional.
+  debug_files = [('dbghelp.dll', False), ('dbgcore.dll', True)]
+  for debug_file, is_optional in debug_files:
     full_path = os.path.join(win_sdk_dir, 'Debuggers', target_cpu, debug_file)
     if not os.path.exists(full_path):
-      raise Exception('%s not found in "%s"\r\nYou must install the '
-                      '"Debugging Tools for Windows" feature from the Windows '
-                      '10 SDK.' % (debug_file, full_path))
+      if is_optional:
+        continue
+      else:
+        raise Exception('%s not found in "%s"\r\nYou must install the '
+                        '"Debugging Tools for Windows" feature from the Windows'
+                        ' 10 SDK.' % (debug_file, full_path))
     target_path = os.path.join(target_dir, debug_file)
     _CopyRuntimeImpl(target_path, full_path)
 
diff --git a/cc/base/synced_property.h b/cc/base/synced_property.h
index f0ff329..6b8b91eb 100644
--- a/cc/base/synced_property.h
+++ b/cc/base/synced_property.h
@@ -62,31 +62,39 @@
   }
 
   // Push the latest value from the main thread onto pending tree-associated
-  // state.  Returns true if this had any effect.
-  bool PushFromMainThread(typename T::ValueType main_thread_value) {
-    bool changed = pending_base_.get() != main_thread_value;
-
+  // state. Returns true if pushing the value results in different values
+  // between the main layer tree and the pending tree.
+  bool PushMainToPending(typename T::ValueType main_thread_value) {
     reflected_delta_in_pending_tree_ = reflected_delta_in_main_tree_;
     reflected_delta_in_main_tree_ = T::Identity();
     pending_base_ = T(main_thread_value);
 
-    return changed;
+    return Current(false) != main_thread_value;
   }
 
   // Push the value associated with the pending tree to be the active base
-  // value.  As part of this, subtract the delta reflected in the pending tree
+  // value. As part of this, subtract the delta reflected in the pending tree
   // from the active tree delta (which will make the delta zero at steady state,
   // or make it contain only the difference since the last send).
+  // Returns true if pushing the update results in:
+  // 1) Different values on the pending tree and the active tree.
+  // 2) An update to the current value on the active tree.
+  // The reason for considering the second case only when pushing to the active
+  // tree, as opposed to when pushing to the pending tree, is that only the
+  // active tree computes state using this value which is not computed on the
+  // pending tree and not pushed during activation (aka scrollbar geometries).
   bool PushPendingToActive() {
-    bool changed = active_base_.get() != pending_base_.get() ||
-                   active_delta_.get() != PendingDelta().get();
+    typename T::ValueType pending_value_before_push = Current(false);
+    typename T::ValueType active_value_before_push = Current(true);
 
     active_base_ = pending_base_;
     active_delta_ = PendingDelta();
     reflected_delta_in_pending_tree_ = T::Identity();
     clobber_active_value_ = false;
 
-    return changed;
+    typename T::ValueType current_active_value = Current(true);
+    return pending_value_before_push != current_active_value ||
+           active_value_before_push != current_active_value;
   }
 
   // This simulates the consequences of the sent value getting committed and
diff --git a/cc/ipc/BUILD.gn b/cc/ipc/BUILD.gn
index 1f42567..4dfd33aa 100644
--- a/cc/ipc/BUILD.gn
+++ b/cc/ipc/BUILD.gn
@@ -48,7 +48,6 @@
     "local_surface_id.mojom",
     "quads.mojom",
     "selection.mojom",
-    "shared_bitmap_allocation_notifier.mojom",
     "shared_quad_state.mojom",
     "surface_id.mojom",
     "texture_mailbox.mojom",
diff --git a/cc/paint/paint_op_reader.cc b/cc/paint/paint_op_reader.cc
index 0ebedc1..cd1e43e 100644
--- a/cc/paint/paint_op_reader.cc
+++ b/cc/paint/paint_op_reader.cc
@@ -248,7 +248,11 @@
   }
   ref.positions_.resize(positions_size);
   ReadData(positions_size * sizeof(SkScalar), ref.positions_.data());
+
   // We don't write the cached shader, so don't attempt to read it either.
+
+  if (!(*shader)->IsValid())
+    valid_ = false;
 }
 
 bool PaintOpReader::AlignMemory(size_t alignment) {
diff --git a/cc/paint/paint_shader.cc b/cc/paint/paint_shader.cc
index c5138268..7d5d710 100644
--- a/cc/paint/paint_shader.cc
+++ b/cc/paint/paint_shader.cc
@@ -245,4 +245,28 @@
   return GetSkShader()->isOpaque();
 }
 
+bool PaintShader::IsValid() const {
+  // If we managed to create a shader already, then we should be valid.
+  if (cached_shader_)
+    return true;
+
+  switch (shader_type_) {
+    case Type::kColor:
+      return true;
+    case Type::kLinearGradient:
+    case Type::kRadialGradient:
+    case Type::kTwoPointConicalGradient:
+    case Type::kSweepGradient:
+      return colors_.size() >= 2 &&
+             (positions_.empty() || positions_.size() == colors_.size());
+    case Type::kImage:
+      return !!image_;
+    case Type::kPaintRecord:
+      return !!record_;
+    case Type::kShaderCount:
+      return false;
+  }
+  return false;
+}
+
 }  // namespace cc
diff --git a/cc/paint/paint_shader.h b/cc/paint/paint_shader.h
index 65ab74d..8a133709 100644
--- a/cc/paint/paint_shader.h
+++ b/cc/paint/paint_shader.h
@@ -116,6 +116,12 @@
 
   bool IsOpaque() const;
 
+  // Returns true if the shader looks like it is valid (ie the members required
+  // for this shader type all look reasonable. Returns false otherwise. Note
+  // that this is a best effort function since truly validating whether the
+  // shader is correct is hard.
+  bool IsValid() const;
+
  private:
   friend class PaintFlags;
   friend class PaintOpReader;
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index 10b3be3..f34b3a4 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -1256,7 +1256,7 @@
   tree_impl->set_top_controls_height(top_controls_height_);
   tree_impl->set_bottom_controls_height(bottom_controls_height_);
   tree_impl->PushBrowserControlsFromMainThread(top_controls_shown_ratio_);
-  tree_impl->elastic_overscroll()->PushFromMainThread(elastic_overscroll_);
+  tree_impl->elastic_overscroll()->PushMainToPending(elastic_overscroll_);
   if (tree_impl->IsActiveTree())
     tree_impl->elastic_overscroll()->PushPendingToActive();
 
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index 77e3137..eddb892b 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -4979,7 +4979,7 @@
   DrawFrame();
 
   host_impl_->active_tree()->SetCurrentBrowserControlsShownRatio(0.f);
-  host_impl_->active_tree()->top_controls_shown_ratio()->PushFromMainThread(
+  host_impl_->active_tree()->top_controls_shown_ratio()->PushMainToPending(
       30.f / top_controls_height_);
   host_impl_->active_tree()->top_controls_shown_ratio()->PushPendingToActive();
   EXPECT_FLOAT_EQ(30.f,
@@ -5013,7 +5013,7 @@
       layer_size_, layer_size_, layer_size_);
   DrawFrame();
 
-  host_impl_->active_tree()->top_controls_shown_ratio()->PushFromMainThread(
+  host_impl_->active_tree()->top_controls_shown_ratio()->PushMainToPending(
       20.f / top_controls_height_);
   host_impl_->active_tree()->top_controls_shown_ratio()->PushPendingToActive();
   host_impl_->active_tree()->SetCurrentBrowserControlsShownRatio(
@@ -5066,8 +5066,7 @@
   host_impl_->sync_tree()->PushBrowserControlsFromMainThread(1.f);
   host_impl_->sync_tree()->set_browser_controls_shrink_blink_size(true);
 
-  host_impl_->active_tree()->top_controls_shown_ratio()->PushFromMainThread(
-      1.f);
+  host_impl_->active_tree()->top_controls_shown_ratio()->PushMainToPending(1.f);
   host_impl_->active_tree()->top_controls_shown_ratio()->PushPendingToActive();
   host_impl_->active_tree()->SetCurrentBrowserControlsShownRatio(0.f);
 
@@ -5432,7 +5431,7 @@
     host_impl_->active_tree()
         ->top_controls_shown_ratio()
         ->PullDeltaForMainThread();
-    host_impl_->active_tree()->top_controls_shown_ratio()->PushFromMainThread(
+    host_impl_->active_tree()->top_controls_shown_ratio()->PushMainToPending(
         delta);
   }
 
@@ -12392,7 +12391,7 @@
 
     // When building property trees from impl side, the builder uses the scroll
     // offset of layer_impl to initialize the scroll offset in scroll tree:
-    //  scroll_tree.synced_scroll_offset.PushFromMainThread(
+    //  scroll_tree.synced_scroll_offset.PushMainToPending(
     //                                   layer->CurrentScrollOffset()).
     // However, layer_impl does not store scroll_offset, so it is using scroll
     // tree's scroll offset to initialize itself. Usually this approach works
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index ad5557d..2bc0189 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -755,26 +755,14 @@
 
   if (page_scale_factor) {
     DCHECK(!IsActiveTree() || !layer_tree_host_impl_->pending_tree());
-    changed_page_scale |= page_scale_factor_->Delta() != 1.f;
-    // TODO(enne): Once CDP goes away, ignore this call below.  The only time
-    // the property trees will differ is if there's been a page scale on the
-    // compositor thread after the begin frame, which is the delta check above.
     changed_page_scale |=
-        page_scale_factor_->PushFromMainThread(*page_scale_factor);
+        page_scale_factor_->PushMainToPending(*page_scale_factor);
   }
 
   if (IsActiveTree()) {
-    // TODO(enne): Pushing from pending to active should never require
-    // DidUpdatePageScale.  The values should already be set by the fully
-    // computed property trees being synced from one tree to another.  Remove
-    // this once CDP goes away.
     changed_page_scale |= page_scale_factor_->PushPendingToActive();
   }
 
-  // TODO(pdr): Simplify the logic here and the equivalent logic in
-  // ScrollTree::PushScrollUpdatesFromMainThread where two types of changes
-  // are detected: whether the current value changed, and whether the pushes
-  // have any effect.
   if (changed_page_scale)
     DidUpdatePageScale();
 
@@ -840,7 +828,7 @@
 
   if (top_controls_shown_ratio) {
     DCHECK(!IsActiveTree() || !layer_tree_host_impl_->pending_tree());
-    top_controls_shown_ratio_->PushFromMainThread(*top_controls_shown_ratio);
+    top_controls_shown_ratio_->PushMainToPending(*top_controls_shown_ratio);
   }
   if (IsActiveTree()) {
     bool changed_active = top_controls_shown_ratio_->PushPendingToActive();
diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc
index 88492b90..e3096fb7 100644
--- a/cc/trees/property_tree.cc
+++ b/cc/trees/property_tree.cc
@@ -1413,21 +1413,22 @@
     SyncedScrollOffset* synced_scroll_offset =
         GetOrCreateSyncedScrollOffset(id);
 
-    bool changed = synced_scroll_offset->PushFromMainThread(map_entry.second);
+    // If the value on the main thread differs from the value on the pending
+    // tree after state sync, we need to update the scroll state on the newly
+    // committed PropertyTrees.
+    bool needs_scroll_update =
+        synced_scroll_offset->PushMainToPending(map_entry.second);
 
     // If we are committing directly to the active tree, push pending to active
-    // here.
+    // here. If the value differs between the pending and active trees, we need
+    // to update the scroll state on the newly activated PropertyTrees.
+    // In the case of pushing to the active tree, even if the pending and active
+    // tree state match but the value on the active tree changed, we need to
+    // update the scrollbar geometries.
     if (property_trees()->is_active)
-      changed |= synced_scroll_offset->PushPendingToActive();
+      needs_scroll_update |= synced_scroll_offset->PushPendingToActive();
 
-    // If the pushed main thread scroll offset differs from the current scroll
-    // offset (accounting for delta), ensure DidUpdateScrollOffset is called to
-    // update the TransformNode's scroll offset. We also need to ensure
-    // scrollbar geometries are updated if the underlying scroll offset changes.
-    // TODO(pdr): This is confusing because we need to account for multiple
-    // cases where the value is dirty.
-    if (changed || map_entry.second != synced_scroll_offset->Current(
-                                           property_trees()->is_active))
+    if (needs_scroll_update)
       sync_tree->DidUpdateScrollOffset(id);
   }
 }
@@ -1457,17 +1458,17 @@
     map_entry.second->AbortCommit();
 }
 
-bool ScrollTree::SetBaseScrollOffset(ElementId id,
+void ScrollTree::SetBaseScrollOffset(ElementId id,
                                      const gfx::ScrollOffset& scroll_offset) {
   if (property_trees()->is_main_thread) {
     scroll_offset_map_[id] = scroll_offset;
-    return true;
+    return;
   }
 
   // Scroll offset updates on the impl thread should only be for layers which
   // were created on the main thread. But this method is called when we build
   // PropertyTrees on the impl thread from LayerTreeImpl.
-  return GetOrCreateSyncedScrollOffset(id)->PushFromMainThread(scroll_offset);
+  GetOrCreateSyncedScrollOffset(id)->PushMainToPending(scroll_offset);
 }
 
 bool ScrollTree::SetScrollOffset(ElementId id,
@@ -1491,7 +1492,7 @@
     const gfx::ScrollOffset& offset) {
   DCHECK(!property_trees()->is_main_thread);
   SyncedScrollOffset* synced_scroll_offset = GetOrCreateSyncedScrollOffset(id);
-  bool changed = synced_scroll_offset->PushFromMainThread(offset);
+  bool changed = synced_scroll_offset->PushMainToPending(offset);
   if (property_trees()->is_active)
     changed |= synced_scroll_offset->PushPendingToActive();
   return changed;
diff --git a/cc/trees/property_tree.h b/cc/trees/property_tree.h
index 60f88e4..22ac11c4 100644
--- a/cc/trees/property_tree.h
+++ b/cc/trees/property_tree.h
@@ -429,7 +429,7 @@
   void PushScrollUpdatesFromPendingTree(PropertyTrees* pending_property_trees,
                                         LayerTreeImpl* active_tree);
 
-  bool SetBaseScrollOffset(ElementId id,
+  void SetBaseScrollOffset(ElementId id,
                            const gfx::ScrollOffset& scroll_offset);
   bool SetScrollOffset(ElementId id, const gfx::ScrollOffset& scroll_offset);
   void SetScrollOffsetClobberActiveValue(ElementId id) {
diff --git a/cc/trees/tree_synchronizer_unittest.cc b/cc/trees/tree_synchronizer_unittest.cc
index daf58880..6753d9e 100644
--- a/cc/trees/tree_synchronizer_unittest.cc
+++ b/cc/trees/tree_synchronizer_unittest.cc
@@ -572,7 +572,7 @@
   // the pending base and active base must be the same at this stage.
   scoped_refptr<SyncedScrollOffset> scroll_layer_offset =
       new SyncedScrollOffset;
-  scroll_layer_offset->PushFromMainThread(scroll_layer->scroll_offset());
+  scroll_layer_offset->PushMainToPending(scroll_layer->scroll_offset());
   scroll_layer_offset->PushPendingToActive();
   EXPECT_TRUE(AreScrollOffsetsEqual(
       scroll_layer_offset.get(),
@@ -582,7 +582,7 @@
 
   scoped_refptr<SyncedScrollOffset> transient_scroll_layer_offset =
       new SyncedScrollOffset;
-  transient_scroll_layer_offset->PushFromMainThread(
+  transient_scroll_layer_offset->PushMainToPending(
       transient_scroll_layer->scroll_offset());
   transient_scroll_layer_offset->PushPendingToActive();
   EXPECT_TRUE(
@@ -628,7 +628,7 @@
   scroll_layer_offset->SetCurrent(gfx::ScrollOffset(20, 30));
   scroll_layer_offset->PullDeltaForMainThread();
   scroll_layer_offset->SetCurrent(gfx::ScrollOffset(40, 50));
-  scroll_layer_offset->PushFromMainThread(gfx::ScrollOffset(100, 100));
+  scroll_layer_offset->PushMainToPending(gfx::ScrollOffset(100, 100));
   scroll_layer_offset->PushPendingToActive();
   EXPECT_TRUE(AreScrollOffsetsEqual(
       scroll_layer_offset.get(),
diff --git a/chrome/VERSION b/chrome/VERSION
index d326ec9..def4114 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=62
 MINOR=0
-BUILD=3183
+BUILD=3186
 PATCH=0
diff --git a/chrome/android/java/res/drawable-hdpi/account_management_no_picture.png b/chrome/android/java/res/drawable-hdpi/account_management_no_picture.png
deleted file mode 100644
index 78a7013..0000000
--- a/chrome/android/java/res/drawable-hdpi/account_management_no_picture.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-hdpi/fre_placeholder.png b/chrome/android/java/res/drawable-hdpi/fre_placeholder.png
deleted file mode 100644
index adee808..0000000
--- a/chrome/android/java/res/drawable-hdpi/fre_placeholder.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-hdpi/ic_folder_white_24dp.png b/chrome/android/java/res/drawable-hdpi/ic_folder_white_24dp.png
deleted file mode 100644
index 941893d..0000000
--- a/chrome/android/java/res/drawable-hdpi/ic_folder_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-hdpi/ic_lock.png b/chrome/android/java/res/drawable-hdpi/ic_lock.png
deleted file mode 100644
index dbae4756..0000000
--- a/chrome/android/java/res/drawable-hdpi/ic_lock.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-hdpi/signin_promo_illustration.png b/chrome/android/java/res/drawable-hdpi/signin_promo_illustration.png
deleted file mode 100644
index 7881de4..0000000
--- a/chrome/android/java/res/drawable-hdpi/signin_promo_illustration.png
+++ /dev/null
Binary files differ
diff --git a/ui/android/java/res/drawable-hdpi/verify_checkmark.png b/chrome/android/java/res/drawable-hdpi/verify_checkmark.png
similarity index 100%
rename from ui/android/java/res/drawable-hdpi/verify_checkmark.png
rename to chrome/android/java/res/drawable-hdpi/verify_checkmark.png
Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/account_management_no_picture.png b/chrome/android/java/res/drawable-mdpi/account_management_no_picture.png
deleted file mode 100644
index 317ac26..0000000
--- a/chrome/android/java/res/drawable-mdpi/account_management_no_picture.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/fre_placeholder.png b/chrome/android/java/res/drawable-mdpi/fre_placeholder.png
deleted file mode 100644
index 9b09d87..0000000
--- a/chrome/android/java/res/drawable-mdpi/fre_placeholder.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/ic_folder_white_24dp.png b/chrome/android/java/res/drawable-mdpi/ic_folder_white_24dp.png
deleted file mode 100644
index 44fa61ea..0000000
--- a/chrome/android/java/res/drawable-mdpi/ic_folder_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/ic_lock.png b/chrome/android/java/res/drawable-mdpi/ic_lock.png
deleted file mode 100644
index 362e74e..0000000
--- a/chrome/android/java/res/drawable-mdpi/ic_lock.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/signin_promo_illustration.png b/chrome/android/java/res/drawable-mdpi/signin_promo_illustration.png
deleted file mode 100644
index 5a480c0..0000000
--- a/chrome/android/java/res/drawable-mdpi/signin_promo_illustration.png
+++ /dev/null
Binary files differ
diff --git a/ui/android/java/res/drawable-mdpi/verify_checkmark.png b/chrome/android/java/res/drawable-mdpi/verify_checkmark.png
similarity index 100%
rename from ui/android/java/res/drawable-mdpi/verify_checkmark.png
rename to chrome/android/java/res/drawable-mdpi/verify_checkmark.png
Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/account_management_no_picture.png b/chrome/android/java/res/drawable-xhdpi/account_management_no_picture.png
deleted file mode 100644
index 958eb300..0000000
--- a/chrome/android/java/res/drawable-xhdpi/account_management_no_picture.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/fre_placeholder.png b/chrome/android/java/res/drawable-xhdpi/fre_placeholder.png
deleted file mode 100644
index 24a53e19..0000000
--- a/chrome/android/java/res/drawable-xhdpi/fre_placeholder.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/ic_folder_white_24dp.png b/chrome/android/java/res/drawable-xhdpi/ic_folder_white_24dp.png
deleted file mode 100644
index 058314d9..0000000
--- a/chrome/android/java/res/drawable-xhdpi/ic_folder_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/ic_lock.png b/chrome/android/java/res/drawable-xhdpi/ic_lock.png
deleted file mode 100644
index 39af9c78..0000000
--- a/chrome/android/java/res/drawable-xhdpi/ic_lock.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/signin_promo_illustration.png b/chrome/android/java/res/drawable-xhdpi/signin_promo_illustration.png
deleted file mode 100644
index e97d0cc..0000000
--- a/chrome/android/java/res/drawable-xhdpi/signin_promo_illustration.png
+++ /dev/null
Binary files differ
diff --git a/ui/android/java/res/drawable-xhdpi/verify_checkmark.png b/chrome/android/java/res/drawable-xhdpi/verify_checkmark.png
similarity index 100%
rename from ui/android/java/res/drawable-xhdpi/verify_checkmark.png
rename to chrome/android/java/res/drawable-xhdpi/verify_checkmark.png
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/account_management_no_picture.png b/chrome/android/java/res/drawable-xxhdpi/account_management_no_picture.png
deleted file mode 100644
index b3c7a32..0000000
--- a/chrome/android/java/res/drawable-xxhdpi/account_management_no_picture.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/fre_placeholder.png b/chrome/android/java/res/drawable-xxhdpi/fre_placeholder.png
deleted file mode 100644
index 6467308..0000000
--- a/chrome/android/java/res/drawable-xxhdpi/fre_placeholder.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/ic_folder_white_24dp.png b/chrome/android/java/res/drawable-xxhdpi/ic_folder_white_24dp.png
deleted file mode 100644
index c0824e2..0000000
--- a/chrome/android/java/res/drawable-xxhdpi/ic_folder_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/ic_lock.png b/chrome/android/java/res/drawable-xxhdpi/ic_lock.png
deleted file mode 100644
index 512c912..0000000
--- a/chrome/android/java/res/drawable-xxhdpi/ic_lock.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/signin_promo_illustration.png b/chrome/android/java/res/drawable-xxhdpi/signin_promo_illustration.png
deleted file mode 100644
index 07527d8..0000000
--- a/chrome/android/java/res/drawable-xxhdpi/signin_promo_illustration.png
+++ /dev/null
Binary files differ
diff --git a/ui/android/java/res/drawable-xxhdpi/verify_checkmark.png b/chrome/android/java/res/drawable-xxhdpi/verify_checkmark.png
similarity index 100%
rename from ui/android/java/res/drawable-xxhdpi/verify_checkmark.png
rename to chrome/android/java/res/drawable-xxhdpi/verify_checkmark.png
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/account_management_no_picture.png b/chrome/android/java/res/drawable-xxxhdpi/account_management_no_picture.png
deleted file mode 100644
index a5ac5be0..0000000
--- a/chrome/android/java/res/drawable-xxxhdpi/account_management_no_picture.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/ic_folder_white_24dp.png b/chrome/android/java/res/drawable-xxxhdpi/ic_folder_white_24dp.png
deleted file mode 100644
index cd28801e..0000000
--- a/chrome/android/java/res/drawable-xxxhdpi/ic_folder_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/ic_lock.png b/chrome/android/java/res/drawable-xxxhdpi/ic_lock.png
deleted file mode 100644
index 88c4828..0000000
--- a/chrome/android/java/res/drawable-xxxhdpi/ic_lock.png
+++ /dev/null
Binary files differ
diff --git a/ui/android/java/res/drawable-xxxhdpi/verify_checkmark.png b/chrome/android/java/res/drawable-xxxhdpi/verify_checkmark.png
similarity index 100%
rename from ui/android/java/res/drawable-xxxhdpi/verify_checkmark.png
rename to chrome/android/java/res/drawable-xxxhdpi/verify_checkmark.png
Binary files differ
diff --git a/chrome/android/java/res/drawable/checkmark_blue.xml b/chrome/android/java/res/drawable/checkmark_blue.xml
index 2f74dcf..fc7cebc 100644
--- a/chrome/android/java/res/drawable/checkmark_blue.xml
+++ b/chrome/android/java/res/drawable/checkmark_blue.xml
@@ -9,7 +9,7 @@
 
     <path
         android:fillColor="@color/black_alpha_20"
-        android:pathData="M13,13m-10,0a10,10 0,1 1,20 0a10,10 0,1 1,-20 0"/>
+        android:pathData="M12,14m-10,0a10,10 0,1 1,20 0a10,10 0,1 1,-20 0"/>
     <path
         android:fillColor="@android:color/white"
         android:pathData="M4 6H20v12H4z" />
diff --git a/chrome/android/java/res/layout/main.xml b/chrome/android/java/res/layout/main.xml
index 95f0598e..7100531 100644
--- a/chrome/android/java/res/layout/main.xml
+++ b/chrome/android/java/res/layout/main.xml
@@ -9,7 +9,7 @@
         android:layout_height="match_parent"
         android:orientation="vertical">
 
-        <android.support.design.widget.CoordinatorLayout
+        <org.chromium.chrome.browser.coordinator.CoordinatorLayoutForPointer
             android:id="@+id/coordinator"
             android:layout_width="match_parent"
             android:layout_height="0dp"
@@ -23,7 +23,8 @@
            <FrameLayout
                 android:id="@+id/overview_list_layout_holder"
                 android:layout_width="match_parent"
-                android:layout_height="match_parent" />
+                android:layout_height="match_parent"
+                android:visibility="gone" />
 
             <org.chromium.chrome.browser.snackbar.BottomContainer
                 android:id="@+id/bottom_container"
@@ -92,7 +93,7 @@
            <FrameLayout
                 android:id="@+id/bottom_sheet_snackbar_container"
                 android:layout_width="match_parent"
-                android:layout_height="match_parent"
+                android:layout_height="wrap_content"
                 android:layout_gravity="start|bottom"
                 android:layout_marginTop="@dimen/bottom_nav_height_inverse" />
 
@@ -102,8 +103,7 @@
                 android:layout="@layout/empty_background_view_tablet"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent" />
-
-        </android.support.design.widget.CoordinatorLayout>
+        </org.chromium.chrome.browser.coordinator.CoordinatorLayoutForPointer>
 
     </LinearLayout>
 
diff --git a/chrome/android/java/res/layout/photo_picker_toolbar.xml b/chrome/android/java/res/layout/photo_picker_toolbar.xml
index 9211226..e51ee2cb0 100644
--- a/chrome/android/java/res/layout/photo_picker_toolbar.xml
+++ b/chrome/android/java/res/layout/photo_picker_toolbar.xml
@@ -21,7 +21,8 @@
         android:enabled="false"
         android:text="@string/done"
         android:textColor="@color/blue_when_enabled"
-        android:textSize="16sp"
-        app:textAllCaps="true" />
+        android:textSize="14sp"
+        app:textAllCaps="true"
+        style="@style/RobotoMediumStyle" />
 </org.chromium.chrome.browser.photo_picker.PhotoPickerToolbar>
 
diff --git a/chrome/android/java/res/values-v17/styles.xml b/chrome/android/java/res/values-v17/styles.xml
index fae6f063..eddb59b 100644
--- a/chrome/android/java/res/values-v17/styles.xml
+++ b/chrome/android/java/res/values-v17/styles.xml
@@ -435,12 +435,6 @@
     </style>
 
     <!-- Bookmarks -->
-    <style name="BookmarkTitleBarButton">
-        <item name="android:layout_width">wrap_content</item>
-        <item name="android:layout_height">wrap_content</item>
-        <item name="android:background">@null</item>
-        <item name="android:padding">15dp</item>
-    </style>
     <style name="BookmarkMenuStyle" parent="Widget.AppCompat.ListPopupWindow">
         <item name="android:popupBackground">@drawable/menu_bg</item>
     </style>
@@ -571,14 +565,6 @@
         <item name="android:paddingEnd">16dp</item>
         <item name="android:background">?attr/listChoiceBackgroundIndicator</item>
     </style>
-    <style name="NumberRollTextViewStyle">
-        <item name="android:layout_width">wrap_content</item>
-        <item name="android:layout_height">wrap_content</item>
-        <item name="android:layout_gravity">center_vertical</item>
-        <item name="android:singleLine">true</item>
-        <item name="android:textColor">@android:color/white</item>
-        <item name="android:textSize">20sp</item>
-    </style>
     <style name="BottomSheetContentTitle" parent="TextAppearance.Widget.AppCompat.Toolbar.Title">
         <item name="android:textSize">20sp</item>
     </style>
@@ -742,10 +728,4 @@
         <item name="android:windowEnterAnimation">@anim/design_bottom_sheet_slide_in</item>
         <item name="android:windowExitAnimation">@null</item>
     </style>
-
-    <!-- VR animations -->
-    <style name="VrEntryAnimation">
-        <item name="android:windowEnterAnimation">@anim/stay_hidden</item>
-        <item name="android:windowExitAnimation">@null</item>
-    </style>
 </resources>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu.java
index faba0f76..a31031c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu.java
@@ -33,7 +33,6 @@
 import android.widget.ImageButton;
 import android.widget.ListView;
 import android.widget.PopupWindow;
-import android.widget.PopupWindow.OnDismissListener;
 
 import org.chromium.base.AnimationFrameTimeHistogram;
 import org.chromium.base.ApiCompatibilityUtils;
@@ -177,18 +176,15 @@
 
         boolean anchorAtBottom = isAnchorAtBottom(anchorView, visibleDisplayFrame);
         int footerHeight = 0;
-        mPopup.setOnDismissListener(new OnDismissListener() {
-            @Override
-            public void onDismiss() {
-                if (anchorView instanceof ImageButton) {
-                    ((ImageButton) anchorView).setSelected(false);
-                }
-
-                if (mMenuItemEnterAnimator != null) mMenuItemEnterAnimator.cancel();
-
-                mHandler.appMenuDismissed();
-                mHandler.onMenuVisibilityChanged(false);
+        mPopup.setOnDismissListener(() -> {
+            if (anchorView instanceof ImageButton) {
+                ((ImageButton) anchorView).setSelected(false);
             }
+
+            if (mMenuItemEnterAnimator != null) mMenuItemEnterAnimator.cancel();
+
+            mHandler.appMenuDismissed();
+            mHandler.onMenuVisibilityChanged(false);
         });
 
         // Some OEMs don't actually let us change the background... but they still return the
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
index b3e00aed..7d26ac85 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
@@ -15,7 +15,6 @@
 import android.view.LayoutInflater;
 import android.view.MenuItem;
 import android.view.View;
-import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
 import android.widget.ImageView;
@@ -258,12 +257,7 @@
                 holder.title.setText(titleItem.getTitle());
                 holder.title.setEnabled(titleItem.isEnabled());
                 holder.title.setFocusable(titleItem.isEnabled());
-                holder.title.setOnClickListener(new OnClickListener() {
-                    @Override
-                    public void onClick(View v) {
-                        mAppMenu.onItemClick(titleItem);
-                    }
-                });
+                holder.title.setOnClickListener(v -> mAppMenu.onItemClick(titleItem));
 
                 if (subItem.isCheckable()) {
                     // Display a checkbox for the MenuItem.
@@ -330,19 +324,9 @@
             button.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO);
         }
 
-        button.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                mAppMenu.onItemClick(item);
-            }
-        });
+        button.setOnClickListener(v -> mAppMenu.onItemClick(item));
 
-        button.setOnLongClickListener(new View.OnLongClickListener() {
-            @Override
-            public boolean onLongClick(View v) {
-                return mAppMenu.onItemLongClick(item, v);
-            }
-        });
+        button.setOnLongClickListener(v -> mAppMenu.onItemLongClick(item, v));
 
         highlightItemIfNecessary(button, true, item.getItemId());
 
@@ -366,12 +350,7 @@
         // This will ensure that the item is not highlighted when selected.
         convertView.setEnabled(isEnabled);
 
-        convertView.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                mAppMenu.onItemClick(item);
-            }
-        });
+        convertView.setOnClickListener(v -> mAppMenu.onItemClick(item));
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuDragHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuDragHelper.java
index 1f87c978..9fdbad7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuDragHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuDragHelper.java
@@ -68,24 +68,21 @@
         // If user is dragging and the popup ListView is too big to display at once,
         // mDragScrolling animator scrolls mPopup.getListView() automatically depending on
         // the user's touch position.
-        mDragScrolling.setTimeListener(new TimeAnimator.TimeListener() {
-            @Override
-            public void onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime) {
-                if (mAppMenu.getListView() == null) return;
+        mDragScrolling.setTimeListener((animation, totalTime, deltaTime) -> {
+            if (mAppMenu.getListView() == null) return;
 
-                // We keep both mDragScrollOffset and mDragScrollOffsetRounded because
-                // the actual scrolling is by the rounded value but at the same time we also
-                // want to keep the precise scroll value in float.
-                mDragScrollOffset += (deltaTime * 0.001f) * mDragScrollingVelocity;
-                int diff = Math.round(mDragScrollOffset - mDragScrollOffsetRounded);
-                mDragScrollOffsetRounded += diff;
-                mAppMenu.getListView().smoothScrollBy(diff, 0);
+            // We keep both mDragScrollOffset and mDragScrollOffsetRounded because
+            // the actual scrolling is by the rounded value but at the same time we also
+            // want to keep the precise scroll value in float.
+            mDragScrollOffset += (deltaTime * 0.001f) * mDragScrollingVelocity;
+            int diff = Math.round(mDragScrollOffset - mDragScrollOffsetRounded);
+            mDragScrollOffsetRounded += diff;
+            mAppMenu.getListView().smoothScrollBy(diff, 0);
 
-                // Force touch move event to highlight items correctly for the scrolled position.
-                if (!Float.isNaN(mLastTouchX) && !Float.isNaN(mLastTouchY)) {
-                    menuItemAction(Math.round(mLastTouchX), Math.round(mLastTouchY),
-                            ITEM_ACTION_HIGHLIGHT);
-                }
+            // Force touch move event to highlight items correctly for the scrolled position.
+            if (!Float.isNaN(mLastTouchX) && !Float.isNaN(mLastTouchY)) {
+                menuItemAction(Math.round(mLastTouchX), Math.round(mLastTouchY),
+                        ITEM_ACTION_HIGHLIGHT);
             }
         });
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java
index 60ea19a2..92fe2be 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java
@@ -43,12 +43,7 @@
             mContext = null;
             // Clean up the native counterpart.  This is posted to allow the native counterpart
             // to fully finish the construction of this glue object before we attempt to delete it.
-            new Handler().post(new Runnable() {
-                @Override
-                public void run() {
-                    dismissed();
-                }
-            });
+            new Handler().post(() -> dismissed());
         } else {
             mAutofillPopup = new AutofillPopup(activity, anchorView, this);
             mContext = activity;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskBridge.java
index 73d1e979..774eca29 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskBridge.java
@@ -32,12 +32,7 @@
             mCardUnmaskPrompt = null;
             // Clean up the native counterpart.  This is posted to allow the native counterpart
             // to fully finish the construction of this glue object before we attempt to delete it.
-            new Handler().post(new Runnable() {
-                @Override
-                public void run() {
-                    dismissed();
-                }
-            });
+            new Handler().post(() -> dismissed());
         } else {
             mCardUnmaskPrompt = new CardUnmaskPrompt(activity, this, title, instructions,
                     confirmButtonLabel, ResourceId.mapToDrawableId(iconId),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskPrompt.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskPrompt.java
index 0212c7d..c712cfbd 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskPrompt.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskPrompt.java
@@ -21,11 +21,9 @@
 import android.text.Editable;
 import android.text.InputFilter;
 import android.text.TextWatcher;
-import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.View.OnClickListener;
-import android.view.View.OnFocusChangeListener;
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.inputmethod.EditorInfo;
@@ -213,39 +211,27 @@
                 new InputFilter[] {new InputFilter.LengthFilter(mDelegate.getExpectedCvcLength())});
 
         // Hitting the "submit" button on the software keyboard should submit the form if valid.
-        mCardUnmaskInput.setOnEditorActionListener(new TextView.OnEditorActionListener() {
-            @Override
-            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
-                if (actionId == EditorInfo.IME_ACTION_DONE) {
-                    Button positiveButton = mDialog.getButton(AlertDialog.BUTTON_POSITIVE);
-                    if (positiveButton.isEnabled()) positiveButton.performClick();
-                    return true;
-                }
-                return false;
+        mCardUnmaskInput.setOnEditorActionListener((v14, actionId, event) -> {
+            if (actionId == EditorInfo.IME_ACTION_DONE) {
+                Button positiveButton = mDialog.getButton(AlertDialog.BUTTON_POSITIVE);
+                if (positiveButton.isEnabled()) positiveButton.performClick();
+                return true;
             }
+            return false;
         });
 
         // Create the listeners to be notified when the user focuses out the input fields.
-        mCardUnmaskInput.setOnFocusChangeListener(new OnFocusChangeListener() {
-            @Override
-            public void onFocusChange(View v, boolean hasFocus) {
-                mDidFocusOnCvc = true;
-                validate();
-            }
+        mCardUnmaskInput.setOnFocusChangeListener((v13, hasFocus) -> {
+            mDidFocusOnCvc = true;
+            validate();
         });
-        mMonthInput.setOnFocusChangeListener(new OnFocusChangeListener() {
-            @Override
-            public void onFocusChange(View v, boolean hasFocus) {
-                mDidFocusOnMonth = true;
-                validate();
-            }
+        mMonthInput.setOnFocusChangeListener((v12, hasFocus) -> {
+            mDidFocusOnMonth = true;
+            validate();
         });
-        mYearInput.setOnFocusChangeListener(new OnFocusChangeListener() {
-            @Override
-            public void onFocusChange(View v, boolean hasFocus) {
-                mDidFocusOnYear = true;
-                validate();
-            }
+        mYearInput.setOnFocusChangeListener((v1, hasFocus) -> {
+            mDidFocusOnYear = true;
+            validate();
         });
 
         // Load the error messages to show to the user.
@@ -288,23 +274,14 @@
         // the dialog.
         Button verifyButton = mDialog.getButton(AlertDialog.BUTTON_POSITIVE);
         verifyButton.setEnabled(false);
-        verifyButton.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                mDelegate.onUserInput(mCardUnmaskInput.getText().toString(),
+        verifyButton.setOnClickListener(
+                view -> mDelegate.onUserInput(mCardUnmaskInput.getText().toString(),
                         mMonthInput.getText().toString(),
                         Integer.toString(getFourDigitYear()),
-                        mStoreLocallyCheckbox != null && mStoreLocallyCheckbox.isChecked());
-            }
-        });
+                        mStoreLocallyCheckbox != null && mStoreLocallyCheckbox.isChecked()));
 
         mCardUnmaskInput.addTextChangedListener(this);
-        mCardUnmaskInput.post(new Runnable() {
-            @Override
-            public void run() {
-                setInitialFocus();
-            }
-        });
+        mCardUnmaskInput.post(() -> setInitialFocus());
     }
 
     public void update(String title, String instructions, boolean shouldRequestExpirationDate) {
@@ -345,12 +322,7 @@
                 setNoRetryError(errorMessage);
             }
         } else {
-            Runnable dismissRunnable = new Runnable() {
-                @Override
-                public void run() {
-                    dismiss();
-                }
-            };
+            Runnable dismissRunnable = () -> dismiss();
             if (mSuccessMessageDurationMilliseconds > 0) {
                 mVerificationProgressBar.setVisibility(View.GONE);
                 mDialog.findViewById(R.id.verification_success).setVisibility(View.VISIBLE);
@@ -453,17 +425,9 @@
         mStoreLocallyTooltipPopup.setOutsideTouchable(true);
         mStoreLocallyTooltipPopup.setBackgroundDrawable(ApiCompatibilityUtils.getDrawable(
                 resources, R.drawable.store_locally_tooltip_background));
-        mStoreLocallyTooltipPopup.setOnDismissListener(new PopupWindow.OnDismissListener() {
-            @Override
-            public void onDismiss() {
-                Handler h = new Handler();
-                h.postDelayed(new Runnable() {
-                    @Override
-                    public void run() {
-                        mStoreLocallyTooltipPopup = null;
-                    }
-                }, 200);
-            }
+        mStoreLocallyTooltipPopup.setOnDismissListener(() -> {
+            Handler h = new Handler();
+            h.postDelayed(() -> mStoreLocallyTooltipPopup = null, 200);
         });
         mStoreLocallyTooltipPopup.showAsDropDown(mStoreLocallyCheckbox,
                 ViewCompat.getPaddingStart(mStoreLocallyCheckbox), 0);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/PasswordGenerationPopupBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/PasswordGenerationPopupBridge.java
index 2c3654cd2..85b976c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/PasswordGenerationPopupBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/PasswordGenerationPopupBridge.java
@@ -54,12 +54,7 @@
             mPopup = null;
             // Prevent destroying the native counterpart when it's about to derefence its own
             // members in UpdateBoundsAndRedrawPopup().
-            new Handler().post(new Runnable() {
-                @Override
-                public void run() {
-                    onDismiss();
-                }
-            });
+            new Handler().post(() -> onDismiss());
         } else {
             mPopup = new DropdownPopupWindow(mContext, anchorView);
             mPopup.setOnItemClickListener(this);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
index 822280d82..6ade3dce 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
@@ -10,6 +10,7 @@
 import android.graphics.Paint;
 import android.graphics.Rect;
 import android.graphics.RectF;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
 import android.support.v4.view.ViewCompat;
@@ -20,6 +21,7 @@
 import android.util.Pair;
 import android.view.DragEvent;
 import android.view.MotionEvent;
+import android.view.PointerIcon;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityEvent;
@@ -181,6 +183,14 @@
         internalInit();
     }
 
+    @Override
+    public PointerIcon onResolvePointerIcon(MotionEvent event, int pointerIndex) {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return null;
+        View activeView = getActiveView();
+        if (activeView == null || !ViewCompat.isAttachedToWindow(activeView)) return null;
+        return activeView.onResolvePointerIcon(event, pointerIndex);
+    }
+
     /**
      * Creates a {@link CompositorView}.
      * @param c     The Context to create this {@link CompositorView} in.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/coordinator/CoordinatorLayoutForPointer.java b/chrome/android/java/src/org/chromium/chrome/browser/coordinator/CoordinatorLayoutForPointer.java
new file mode 100644
index 0000000..14b0de4
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/coordinator/CoordinatorLayoutForPointer.java
@@ -0,0 +1,45 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.coordinator;
+
+import android.content.Context;
+import android.os.Build;
+import android.support.design.widget.CoordinatorLayout;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.PointerIcon;
+import android.view.View;
+
+/**
+ * This class overrides {@link onResolvePointerIcon} method to correctly determine the pointer icon
+ * from a mouse motion event. This is needed because the default android impl does not consider
+ * view visibility.
+ */
+public class CoordinatorLayoutForPointer extends CoordinatorLayout {
+    public CoordinatorLayoutForPointer(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    private boolean isWithinBoundOfView(int x, int y, View view) {
+        return ((x >= view.getLeft() && x <= view.getRight())
+                && (y >= view.getTop() && y <= view.getBottom()));
+    }
+
+    @Override
+    public PointerIcon onResolvePointerIcon(MotionEvent event, int pointerIndex) {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return null;
+
+        final int x = (int) event.getX(pointerIndex);
+        final int y = (int) event.getY(pointerIndex);
+        final int childrenCount = getChildCount();
+        for (int i = childrenCount - 1; i >= 0; --i) {
+            if (getChildAt(i).getVisibility() != VISIBLE) continue;
+            if (isWithinBoundOfView(x, y, getChildAt(i))) {
+                return getChildAt(i).onResolvePointerIcon(event, pointerIndex);
+            }
+        }
+        return super.onResolvePointerIcon(event, pointerIndex);
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/favicon/FaviconHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/favicon/FaviconHelper.java
index 28057dacb..af42bead 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/favicon/FaviconHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/favicon/FaviconHelper.java
@@ -35,7 +35,7 @@
     public interface FaviconImageCallback {
         /**
          * This method will be called when the result favicon is ready.
-         * @param image   Favicon image.
+         * @param image Favicon image.
          * @param iconUrl Favicon image's icon url.
          */
         @CalledByNative("FaviconImageCallback")
@@ -48,8 +48,8 @@
     public interface IconAvailabilityCallback {
         /**
          * This method will be called when the availability of the icon has been checked.
-         * @param newlyAvailable true if the icon was downloaded and is now available,
-         *            false if the favicon was already there or the download failed.
+         * @param newlyAvailable true if the icon was downloaded and is now available, false if the
+         *         favicon was already there or the download failed.
          */
         @CalledByNative("IconAvailabilityCallback")
         public void onIconAvailabilityChecked(boolean newlyAvailable);
@@ -74,13 +74,12 @@
     /**
      * Get Favicon bitmap for the requested arguments. Retrieves favicons only for pages the user
      * has visited on the current device.
-     * @param profile               Profile used for the FaviconService construction.
-     * @param pageUrl               The target Page URL to get the favicon.
-     * @param desiredSizeInPixel    The size of the favicon in pixel we want to get.
-     * @param faviconImageCallback  A method to be called back when the result is available.
-     *                              Note that this callback is not called if this method returns
-     *                              false.
-     * @return                      True if GetLocalFaviconImageForURL is successfully called.
+     * @param profile Profile used for the FaviconService construction.
+     * @param pageUrl The target Page URL to get the favicon.
+     * @param desiredSizeInPixel The size of the favicon in pixel we want to get.
+     * @param faviconImageCallback A method to be called back when the result is available. Note
+     *         that this callback is not called if this method returns false.
+     * @return True if GetLocalFaviconImageForURL is successfully called.
      */
     public boolean getLocalFaviconImageForURL(
             Profile profile, String pageUrl, int desiredSizeInPixel,
@@ -95,32 +94,41 @@
      * Get 16x16 Favicon bitmap for the requested arguments. Only retrives favicons in synced
      * session storage. (e.g. favicons synced from other devices).
      * TODO(apiccion): provide a way to obtain higher resolution favicons.
-     * @param profile   Profile used for the FaviconService construction.
-     * @param pageUrl   The target Page URL to get the favicon.
-     *
-     * @return          16x16 favicon Bitmap corresponding to the pageUrl.
+     * @param profile Profile used for the FaviconService construction.
+     * @param pageUrl The target Page URL to get the favicon.
+     * @return 16x16 favicon Bitmap corresponding to the pageUrl.
      */
     public Bitmap getSyncedFaviconImageForURL(Profile profile, String pageUrl) {
         assert mNativeFaviconHelper != 0;
         return nativeGetSyncedFaviconImageForURL(mNativeFaviconHelper, profile, pageUrl);
     }
 
+    // TODO(jkrcal): Remove these two methods when FaviconHelper is not used any more by
+    // org.chromium.chrome.browser.suggestions.ImageFetcher. https://crbug.com/751628
     /**
      * Tries to make sure that the specified icon is available in the cache of the provided profile.
-     * @param profile       Profile used for the FaviconService construction.
-     * @param webContents   The object used to download the icon.
-     * @param pageUrl       The target Page URL to get the favicon for.
-     * @param iconUrl       The URL of the icon to retrieve.
-     * @param isLargeIcon   Specifies whether the type is TOUCH_ICON (true) or FAVICON (false).
-     * @param isTemporary   Specifies whether the icon at iconUrl is temporary and should be updated
-     *                      as soon as the page at pageUrl is revisited.
-     * @param callback      Called when completed (download not needed, finished or failed).
+     * The icon will we cached as an on-demand favicon.
+     * @param profile Profile used for the FaviconService construction.
+     * @param webContents The object used to download the icon.
+     * @param pageUrl The target Page URL to get the favicon for.
+     * @param iconUrl The URL of the icon to retrieve.
+     * @param isLargeIcon Specifies whether the type is TOUCH_ICON (true) or FAVICON (false).
+     * @param callback Called when completed (download not needed, finished or failed).
      */
     public void ensureIconIsAvailable(Profile profile, WebContents webContents, String pageUrl,
-            String iconUrl, boolean isLargeIcon, boolean isTemporary,
-            IconAvailabilityCallback callback) {
+            String iconUrl, boolean isLargeIcon, IconAvailabilityCallback callback) {
         nativeEnsureIconIsAvailable(mNativeFaviconHelper, profile, webContents, pageUrl, iconUrl,
-                isLargeIcon, isTemporary, callback);
+                isLargeIcon, callback);
+    }
+
+    /**
+     * Mark that the specified on-demand favicon was requested now. This postpones the automatic
+     * eviction of the favicon from the database.
+     * @param profile Profile used for the FaviconService construction.
+     * @param iconUrl The URL of the icon to touch.
+     */
+    public void touchOnDemandFavicon(Profile profile, String iconUrl) {
+        nativeTouchOnDemandFavicon(mNativeFaviconHelper, profile, iconUrl);
     }
 
     private static native long nativeInit();
@@ -132,5 +140,7 @@
             Profile profile, String pageUrl);
     private static native void nativeEnsureIconIsAvailable(long nativeFaviconHelper,
             Profile profile, WebContents webContents, String pageUrl, String iconUrl,
-            boolean isLargeIcon, boolean isTemporary, IconAvailabilityCallback callback);
+            boolean isLargeIcon, IconAvailabilityCallback callback);
+    private static native void nativeTouchOnDemandFavicon(
+            long nativeFaviconHelper, Profile profile, String iconUrl);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
index 261ef68..128c5df 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -28,6 +28,7 @@
 import android.os.SystemClock;
 import android.provider.Settings;
 import android.speech.RecognizerIntent;
+import android.support.annotation.DrawableRes;
 import android.support.annotation.IntDef;
 import android.text.InputType;
 import android.text.TextUtils;
@@ -164,6 +165,7 @@
     private NavigationButtonType mNavigationButtonType;
 
     // The type of the security icon currently active.
+    @DrawableRes
     private int mSecurityIconResource;
 
     private final OmniboxResultsAdapter mSuggestionListAdapter;
@@ -1306,6 +1308,7 @@
      * @param isOfflinePage Whether the page for which the icon is shown is an offline page.
      * @return The resource ID of the icon that should be displayed, 0 if no icon should show.
      */
+    @DrawableRes
     public static int getSecurityIconResource(
             int securityLevel, boolean isSmallDevice, boolean isOfflinePage) {
         if (isOfflinePage) {
@@ -1370,6 +1373,7 @@
     @Override
     public void updateSecurityIcon(int securityLevel) {
         boolean isSmallDevice = !DeviceFormFactor.isTablet();
+        @DrawableRes
         int id = getSecurityIconResource(
                 securityLevel, isSmallDevice, mToolbarDataProvider.isOfflinePage());
         if (id == 0) {
@@ -1422,6 +1426,15 @@
     }
 
     /**
+     * @return The ID of the drawable currently shown in the security icon.
+     */
+    @VisibleForTesting
+    @DrawableRes
+    int getSecurityIconResourceId() {
+        return mSecurityIconResource;
+    }
+
+    /**
      * Sets the type of the current navigation type and updates the UI to match it.
      * @param buttonType The type of navigation button to be shown.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AddressEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AddressEditor.java
index cec5022..57dc10e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/AddressEditor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/AddressEditor.java
@@ -189,28 +189,22 @@
 
         // If the user clicks [Cancel], send |toEdit| address back to the caller, which was the
         // original state (could be null, a complete address, a partial address).
-        mEditor.setCancelCallback(new Runnable() {
-            @Override
-            public void run() {
-                // This makes sure that onSubKeysReceived returns early if it's
-                // ever called when Cancel has already occurred.
-                mAdminAreasLoaded = true;
-                PersonalDataManager.getInstance().cancelPendingGetSubKeys();
-                callback.onResult(toEdit);
-            }
+        mEditor.setCancelCallback(() -> {
+            // This makes sure that onSubKeysReceived returns early if it's
+            // ever called when Cancel has already occurred.
+            mAdminAreasLoaded = true;
+            PersonalDataManager.getInstance().cancelPendingGetSubKeys();
+            callback.onResult(toEdit);
         });
 
         // If the user clicks [Done], save changes on disk, mark the address "complete," and send it
         // back to the caller.
-        mEditor.setDoneCallback(new Runnable() {
-            @Override
-            public void run() {
-                mAdminAreasLoaded = true;
-                PersonalDataManager.getInstance().cancelPendingGetSubKeys();
-                commitChanges(mProfile);
-                address.completeAddress(mProfile);
-                callback.onResult(address);
-            }
+        mEditor.setDoneCallback(() -> {
+            mAdminAreasLoaded = true;
+            PersonalDataManager.getInstance().cancelPendingGetSubKeys();
+            commitChanges(mProfile);
+            address.completeAddress(mProfile);
+            callback.onResult(address);
         });
 
         loadAdminAreasForCountry(mProfile.getCountryCode());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java
index 6f8bfbe3..0777a1a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java
@@ -7,8 +7,6 @@
 import android.app.Activity;
 import android.content.ComponentName;
 import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnCancelListener;
 import android.content.DialogInterface.OnClickListener;
 import android.content.Intent;
 import android.content.ServiceConnection;
@@ -183,11 +181,8 @@
             return;
         }
 
-        mHandler.postDelayed(new Runnable() {
-            @Override
-            public void run() {
-                if (!mIsReadyToPayQueried) respondToGetInstrumentsQuery(null);
-            }
+        mHandler.postDelayed(() -> {
+            if (!mIsReadyToPayQueried) respondToGetInstrumentsQuery(null);
         }, SERVICE_CONNECTION_TIMEOUT_MS);
     }
 
@@ -198,19 +193,16 @@
         }
 
         if (mInstrumentsCallback == null) return;
-        mHandler.post(new Runnable() {
-            @Override
-            public void run() {
-                ThreadUtils.assertOnUiThread();
-                if (mInstrumentsCallback == null) return;
-                List<PaymentInstrument> instruments = null;
-                if (instrument != null) {
-                    instruments = new ArrayList<>();
-                    instruments.add(instrument);
-                }
-                mInstrumentsCallback.onInstrumentsReady(AndroidPaymentApp.this, instruments);
-                mInstrumentsCallback = null;
+        mHandler.post(() -> {
+            ThreadUtils.assertOnUiThread();
+            if (mInstrumentsCallback == null) return;
+            List<PaymentInstrument> instruments = null;
+            if (instrument != null) {
+                instruments = new ArrayList<>();
+                instruments.add(instrument);
             }
+            mInstrumentsCallback.onInstrumentsReady(AndroidPaymentApp.this, instruments);
+            mInstrumentsCallback = null;
         });
     }
 
@@ -235,12 +227,7 @@
             respondToGetInstrumentsQuery(null);
             return;
         }
-        mHandler.postDelayed(new Runnable() {
-            @Override
-            public void run() {
-                respondToGetInstrumentsQuery(null);
-            }
-        }, READY_TO_PAY_TIMEOUT_MS);
+        mHandler.postDelayed(() -> respondToGetInstrumentsQuery(null), READY_TO_PAY_TIMEOUT_MS);
     }
 
     @Override
@@ -298,27 +285,13 @@
                 .setTitle(R.string.external_app_leave_incognito_warning_title)
                 .setMessage(R.string.external_payment_app_leave_incognito_warning)
                 .setPositiveButton(R.string.ok,
-                        new OnClickListener() {
-                            @Override
-                            public void onClick(DialogInterface dialog, int which) {
-                                launchPaymentApp(id, merchantName, schemelessOrigin,
-                                        schemelessIframeOrigin, certificateChain, methodDataMap,
-                                        total, displayItems, modifiers);
-                            }
-                        })
+                        (OnClickListener) (dialog, which) -> launchPaymentApp(id, merchantName,
+                                schemelessOrigin,
+                                schemelessIframeOrigin, certificateChain, methodDataMap,
+                                total, displayItems, modifiers))
                 .setNegativeButton(R.string.cancel,
-                        new OnClickListener() {
-                            @Override
-                            public void onClick(DialogInterface dialog, int which) {
-                                notifyErrorInvokingPaymentApp();
-                            }
-                        })
-                .setOnCancelListener(new OnCancelListener() {
-                    @Override
-                    public void onCancel(DialogInterface dialog) {
-                        notifyErrorInvokingPaymentApp();
-                    }
-                })
+                        (OnClickListener) (dialog, which) -> notifyErrorInvokingPaymentApp())
+                .setOnCancelListener(dialog -> notifyErrorInvokingPaymentApp())
                 .show();
     }
 
@@ -443,12 +416,7 @@
     }
 
     private void notifyErrorInvokingPaymentApp() {
-        mHandler.post(new Runnable() {
-            @Override
-            public void run() {
-                mInstrumentDetailsCallback.onInstrumentDetailsError();
-            }
-        });
+        mHandler.post(() -> mInstrumentDetailsCallback.onInstrumentDetailsError());
     }
 
     private static String serializeDetails(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentApp.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentApp.java
index 0c1514a..a3c6dce3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentApp.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentApp.java
@@ -96,12 +96,7 @@
             }
         }
 
-        new Handler().post(new Runnable() {
-            @Override
-            public void run() {
-                callback.onInstrumentsReady(AutofillPaymentApp.this, instruments);
-            }
-        });
+        new Handler().post(() -> callback.onInstrumentsReady(AutofillPaymentApp.this, instruments));
     }
 
     /** @return A set of card networks (e.g., "visa", "amex") accepted by "basic-card" method. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java
index c48b16b1..91c3f30 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java
@@ -33,7 +33,6 @@
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -202,17 +201,14 @@
         }
 
         // Sort profiles for billing address according to completeness.
-        Collections.sort(mProfilesForBillingAddress, new Comparator<AutofillProfile>() {
-            @Override
-            public int compare(AutofillProfile a, AutofillProfile b) {
-                boolean isAComplete = AutofillAddress.checkAddressCompletionStatus(
-                                              a, AutofillAddress.NORMAL_COMPLETENESS_CHECK)
-                        == AutofillAddress.COMPLETE;
-                boolean isBComplete = AutofillAddress.checkAddressCompletionStatus(
-                                              b, AutofillAddress.NORMAL_COMPLETENESS_CHECK)
-                        == AutofillAddress.COMPLETE;
-                return ApiCompatibilityUtils.compareBoolean(isBComplete, isAComplete);
-            }
+        Collections.sort(mProfilesForBillingAddress, (a, b) -> {
+            boolean isAComplete = AutofillAddress.checkAddressCompletionStatus(
+                    a, AutofillAddress.NORMAL_COMPLETENESS_CHECK)
+                    == AutofillAddress.COMPLETE;
+            boolean isBComplete = AutofillAddress.checkAddressCompletionStatus(
+                    b, AutofillAddress.NORMAL_COMPLETENESS_CHECK)
+                    == AutofillAddress.COMPLETE;
+            return ApiCompatibilityUtils.compareBoolean(isBComplete, isAComplete);
         });
 
         mCardIssuerNetworks = new HashMap<>();
@@ -254,16 +250,13 @@
             }
         };
 
-        mCardIconGenerator = new EditorValueIconGenerator() {
-            @Override
-            public int getIconResourceId(@Nullable CharSequence value) {
-                if (value == null) return 0;
-                CardIssuerNetwork cardTypeInfo = mCardIssuerNetworks.get(
-                        PersonalDataManager.getInstance().getBasicCardIssuerNetwork(
-                                value.toString(), false));
-                if (cardTypeInfo == null) return 0;
-                return cardTypeInfo.icon;
-            }
+        mCardIconGenerator = value -> {
+            if (value == null) return 0;
+            CardIssuerNetwork cardTypeInfo = mCardIssuerNetworks.get(
+                    PersonalDataManager.getInstance().getBasicCardIssuerNetwork(
+                            value.toString(), false));
+            if (cardTypeInfo == null) return 0;
+            return cardTypeInfo.icon;
         };
 
         mCalendar = new AsyncTask<Void, Void, Calendar>() {
@@ -378,12 +371,7 @@
             try {
                 calendar = mCalendar.get();
             } catch (InterruptedException | ExecutionException e) {
-                mHandler.post(new Runnable() {
-                    @Override
-                    public void run() {
-                        callback.onResult(null);
-                    }
-                });
+                mHandler.post(() -> callback.onResult(null));
                 return;
             }
             assert calendar != null;
@@ -406,33 +394,25 @@
 
         // If the user clicks [Cancel], send |toEdit| card back to the caller (will return original
         // state, which could be null, a full card, or a partial card).
-        editor.setCancelCallback(new Runnable() {
-            @Override
-            public void run() {
-                callback.onResult(toEdit);
-            }
-        });
+        editor.setCancelCallback(() -> callback.onResult(toEdit));
 
         // If the user clicks [Done], save changes on disk, mark the card "complete," and send it
         // back to the caller.
-        editor.setDoneCallback(new Runnable() {
-            @Override
-            public void run() {
-                commitChanges(card, isNewCard);
+        editor.setDoneCallback(() -> {
+            commitChanges(card, isNewCard);
 
-                String methodName = card.getBasicCardIssuerNetwork();
-                if (mAcceptedBasicCardIssuerNetworks.contains(methodName)) {
-                    methodName = AutofillPaymentApp.BASIC_CARD_METHOD_NAME;
-                }
-                assert methodName != null;
-
-                AutofillProfile billingAddress =
-                        findTargetProfile(mProfilesForBillingAddress, card.getBillingAddressId());
-                assert billingAddress != null;
-
-                instrument.completeInstrument(card, methodName, billingAddress);
-                callback.onResult(instrument);
+            String methodName = card.getBasicCardIssuerNetwork();
+            if (mAcceptedBasicCardIssuerNetworks.contains(methodName)) {
+                methodName = AutofillPaymentApp.BASIC_CARD_METHOD_NAME;
             }
+            assert methodName != null;
+
+            AutofillProfile billingAddress =
+                    findTargetProfile(mProfilesForBillingAddress, card.getBillingAddressId());
+            assert billingAddress != null;
+
+            instrument.completeInstrument(card, methodName, billingAddress);
+            callback.onResult(instrument);
         });
 
         mEditorDialog.show(editor);
@@ -502,13 +482,10 @@
                     null /* value */);
             if (mCanScan) {
                 mNumberField.addActionIcon(R.drawable.ic_photo_camera,
-                        R.string.autofill_scan_credit_card, new Runnable() {
-                            @Override
-                            public void run() {
-                                if (mIsScanning) return;
-                                mIsScanning = true;
-                                mCardScanner.scan();
-                            }
+                        R.string.autofill_scan_credit_card, (Runnable) () -> {
+                            if (mIsScanning) return;
+                            mIsScanning = true;
+                            mCardScanner.scan();
                         });
             }
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ContactEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ContactEditor.java
index 0ec3a51..8e98658 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ContactEditor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ContactEditor.java
@@ -188,41 +188,33 @@
 
         // If the user clicks [Cancel], send |toEdit| contact back to the caller, which was the
         // original state (could be null, a complete contact, a partial contact).
-        editor.setCancelCallback(new Runnable() {
-            @Override
-            public void run() {
-                callback.onResult(toEdit);
+        editor.setCancelCallback(() -> callback.onResult(toEdit));
+
+        editor.setDoneCallback(() -> {
+            String name = null;
+            String phone = null;
+            String email = null;
+            AutofillProfile profile = contact.getProfile();
+
+            if (nameField != null) {
+                name = nameField.getValue().toString();
+                profile.setFullName(name);
             }
-        });
 
-        editor.setDoneCallback(new Runnable() {
-            @Override
-            public void run() {
-                String name = null;
-                String phone = null;
-                String email = null;
-                AutofillProfile profile = contact.getProfile();
-
-                if (nameField != null) {
-                    name = nameField.getValue().toString();
-                    profile.setFullName(name);
-                }
-
-                if (phoneField != null) {
-                    phone = phoneField.getValue().toString();
-                    profile.setPhoneNumber(phone);
-                }
-
-                if (emailField != null) {
-                    email = emailField.getValue().toString();
-                    profile.setEmailAddress(email);
-                }
-
-                profile.setGUID(PersonalDataManager.getInstance().setProfileToLocal(profile));
-                profile.setIsLocal(true);
-                contact.completeContact(profile.getGUID(), name, phone, email);
-                callback.onResult(contact);
+            if (phoneField != null) {
+                phone = phoneField.getValue().toString();
+                profile.setPhoneNumber(phone);
             }
+
+            if (emailField != null) {
+                email = emailField.getValue().toString();
+                profile.setEmailAddress(email);
+            }
+
+            profile.setGUID(PersonalDataManager.getInstance().setProfileToLocal(profile));
+            profile.setIsLocal(true);
+            contact.completeContact(profile.getGUID(), name, phone, email);
+            callback.onResult(contact);
         });
 
         mEditorDialog.show(editor);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/JourneyLogger.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/JourneyLogger.java
index 249b9378..39f47c15 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/JourneyLogger.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/JourneyLogger.java
@@ -115,6 +115,20 @@
                 mJourneyLoggerAndroid, requestShipping, requestEmail, requestPhone, requestName);
     }
 
+    /*
+     * Records what types of payment methods were requested by the merchant in the Payment Request.
+     *
+     * @param requestedBasicCard    Whether the merchant requested basic-card.
+     * @param requestedMethodGoogle Whether the merchant requested a Google payment method.
+     * @param requestedMethodOther  Whether the merchant requested a non basic-card, non-Google
+     *                              payment method.
+     */
+    public void setRequestedPaymentMethodTypes(boolean requestedBasicCard,
+            boolean requestedMethodGoogle, boolean requestedMethodOther) {
+        nativeSetRequestedPaymentMethodTypes(mJourneyLoggerAndroid, requestedBasicCard,
+                requestedMethodGoogle, requestedMethodOther);
+    }
+
     /**
      * Records the payment method that was selected by the user.
      *
@@ -189,7 +203,10 @@
     private native void nativeSetRequestedInformation(long nativeJourneyLoggerAndroid,
             boolean requestShipping, boolean requestEmail, boolean requestPhone,
             boolean requestName);
+    private native void nativeSetRequestedPaymentMethodTypes(long nativeJourneyLoggerAndroid,
+            boolean requestedBasicCard, boolean requestedMethodGoogle,
+            boolean requestedMethodOther);
     private native void nativeSetCompleted(long nativeJourneyLoggerAndroid);
     private native void nativeSetAborted(long nativeJourneyLoggerAndroid, int reason);
     private native void nativeSetNotShown(long nativeJourneyLoggerAndroid, int reason);
-}
\ No newline at end of file
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
index c42f510..e218b43 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
@@ -7,7 +7,6 @@
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
-import android.graphics.Bitmap;
 import android.os.Handler;
 import android.support.v4.util.ArrayMap;
 import android.text.TextUtils;
@@ -30,7 +29,8 @@
 import org.chromium.chrome.browser.payments.ui.LineItem;
 import org.chromium.chrome.browser.payments.ui.PaymentInformation;
 import org.chromium.chrome.browser.payments.ui.PaymentOption;
-import org.chromium.chrome.browser.payments.ui.PaymentRequestSection.OptionSection.FocusChangedObserver;
+import org.chromium.chrome.browser.payments.ui.PaymentRequestSection.OptionSection
+        .FocusChangedObserver;
 import org.chromium.chrome.browser.payments.ui.PaymentRequestUI;
 import org.chromium.chrome.browser.payments.ui.SectionInformation;
 import org.chromium.chrome.browser.payments.ui.ShoppingCart;
@@ -190,12 +190,7 @@
     private static final String ANDROID_PAY_METHOD_NAME = "https://android.com/pay";
     private static final String PAY_WITH_GOOGLE_METHOD_NAME = "https://google.com/pay";
     private static final Comparator<Completable> COMPLETENESS_COMPARATOR =
-            new Comparator<Completable>() {
-                @Override
-                public int compare(Completable a, Completable b) {
-                    return (b.isComplete() ? 1 : 0) - (a.isComplete() ? 1 : 0);
-                }
-            };
+            (a, b) -> (b.isComplete() ? 1 : 0) - (a.isComplete() ? 1 : 0);
 
     /**
      * Sorts the payment instruments by several rules:
@@ -207,34 +202,31 @@
      *         instruments.
      */
     private static final Comparator<PaymentInstrument> PAYMENT_INSTRUMENT_COMPARATOR =
-            new Comparator<PaymentInstrument>() {
-                @Override
-                public int compare(PaymentInstrument a, PaymentInstrument b) {
-                    // Payment apps (not autofill) first.
-                    int autofill =
-                            (a.isAutofillInstrument() ? 1 : 0) - (b.isAutofillInstrument() ? 1 : 0);
-                    if (autofill != 0) return autofill;
+            (a, b) -> {
+                // Payment apps (not autofill) first.
+                int autofill =
+                        (a.isAutofillInstrument() ? 1 : 0) - (b.isAutofillInstrument() ? 1 : 0);
+                if (autofill != 0) return autofill;
 
-                    // Complete cards before cards with missing information.
-                    int completeness = (b.isComplete() ? 1 : 0) - (a.isComplete() ? 1 : 0);
-                    if (completeness != 0) return completeness;
+                // Complete cards before cards with missing information.
+                int completeness = (b.isComplete() ? 1 : 0) - (a.isComplete() ? 1 : 0);
+                if (completeness != 0) return completeness;
 
-                    // Cards with matching type before unknown type cards.
-                    int typeMatch = (b.isExactlyMatchingMerchantRequest() ? 1 : 0)
-                            - (a.isExactlyMatchingMerchantRequest() ? 1 : 0);
-                    if (typeMatch != 0) return typeMatch;
+                // Cards with matching type before unknown type cards.
+                int typeMatch = (b.isExactlyMatchingMerchantRequest() ? 1 : 0)
+                        - (a.isExactlyMatchingMerchantRequest() ? 1 : 0);
+                if (typeMatch != 0) return typeMatch;
 
-                    // Preselectable instruments before non-preselectable instruments.
-                    // Note that this only affects service worker payment apps' instruments for now
-                    // since autofill payment instruments have already been sorted by preselect
-                    // after sorting by completeness and typeMatch. And the other payment apps'
-                    // instruments can always be preselected.
-                    int canPreselect = (b.canPreselect() ? 1 : 0) - (a.canPreselect() ? 1 : 0);
-                    if (canPreselect != 0) return canPreselect;
+                // Preselectable instruments before non-preselectable instruments.
+                // Note that this only affects service worker payment apps' instruments for now
+                // since autofill payment instruments have already been sorted by preselect
+                // after sorting by completeness and typeMatch. And the other payment apps'
+                // instruments can always be preselected.
+                int canPreselect = (b.canPreselect() ? 1 : 0) - (a.canPreselect() ? 1 : 0);
+                if (canPreselect != 0) return canPreselect;
 
-                    // More frequently and recently used instruments first.
-                    return compareInstrumentsByFrecency(b, a);
-                }
+                // More frequently and recently used instruments first.
+                return compareInstrumentsByFrecency(b, a);
             };
 
     /** Every origin can call canMakePayment() every 30 minutes. */
@@ -497,6 +489,22 @@
         PaymentAppFactory.getInstance().create(mWebContents,
                 Collections.unmodifiableSet(mMethodData.keySet()), this /* callback */);
 
+        // Log the various types of payment methods that were requested by the merchant.
+        boolean requestedMethodGoogle = false;
+        boolean requestedMethodOther = false;
+        for (String methodName : mMethodData.keySet()) {
+            if (methodName.equals(ANDROID_PAY_METHOD_NAME)
+                    || methodName.equals(PAY_WITH_GOOGLE_METHOD_NAME)) {
+                requestedMethodGoogle = true;
+            } else if (methodName.startsWith(UrlConstants.HTTPS_URL_PREFIX)) {
+                // Any method that starts with https and is not Android pay or Google pay is in the
+                // "other" category.
+                requestedMethodOther = true;
+            }
+        }
+        mJourneyLogger.setRequestedPaymentMethodTypes(mMerchantSupportsAutofillPaymentInstruments,
+                requestedMethodGoogle, requestedMethodOther);
+
         // If there is a single payment method and the merchant has not requested any other
         // information, we can safely go directly to the payment app instead of showing
         // Payment Request UI.
@@ -544,13 +552,10 @@
         faviconHelper.getLocalFaviconImageForURL(Profile.getLastUsedProfile(),
                 mWebContents.getLastCommittedUrl(),
                 activity.getResources().getDimensionPixelSize(R.dimen.payments_favicon_size),
-                new FaviconHelper.FaviconImageCallback() {
-                    @Override
-                    public void onFaviconAvailable(Bitmap bitmap, String iconUrl) {
-                        if (mClient != null && bitmap == null) mClient.warnNoFavicon();
-                        if (mUI != null && bitmap != null) mUI.setTitleBitmap(bitmap);
-                        faviconHelper.destroy();
-                    }
+                (bitmap, iconUrl) -> {
+                    if (mClient != null && bitmap == null) mClient.warnNoFavicon();
+                    if (mUI != null && bitmap != null) mUI.setTitleBitmap(bitmap);
+                    faviconHelper.destroy();
                 });
 
         // Add the callback to change the label of shipping addresses depending on the focus.
@@ -1054,11 +1059,8 @@
 
         if (mPaymentMethodsSection == null) return;
 
-        mHandler.post(new Runnable() {
-            @Override
-            public void run() {
-                if (mUI != null) providePaymentInformation();
-            }
+        mHandler.post(() -> {
+            if (mUI != null) providePaymentInformation();
         });
     }
 
@@ -1077,30 +1079,22 @@
 
     @Override
     public void getShoppingCart(final Callback<ShoppingCart> callback) {
-        mHandler.post(new Runnable() {
-            @Override
-            public void run() {
-                callback.onResult(mUiShoppingCart);
-            }
-        });
+        mHandler.post(() -> callback.onResult(mUiShoppingCart));
     }
 
     @Override
     public void getSectionInformation(@PaymentRequestUI.DataType final int optionType,
             final Callback<SectionInformation> callback) {
-        mHandler.post(new Runnable() {
-            @Override
-            public void run() {
-                if (optionType == PaymentRequestUI.TYPE_SHIPPING_ADDRESSES) {
-                    callback.onResult(mShippingAddressesSection);
-                } else if (optionType == PaymentRequestUI.TYPE_SHIPPING_OPTIONS) {
-                    callback.onResult(mUiShippingOptions);
-                } else if (optionType == PaymentRequestUI.TYPE_CONTACT_DETAILS) {
-                    callback.onResult(mContactSection);
-                } else if (optionType == PaymentRequestUI.TYPE_PAYMENT_METHODS) {
-                    assert mPaymentMethodsSection != null;
-                    callback.onResult(mPaymentMethodsSection);
-                }
+        mHandler.post(() -> {
+            if (optionType == PaymentRequestUI.TYPE_SHIPPING_ADDRESSES) {
+                callback.onResult(mShippingAddressesSection);
+            } else if (optionType == PaymentRequestUI.TYPE_SHIPPING_OPTIONS) {
+                callback.onResult(mUiShippingOptions);
+            } else if (optionType == PaymentRequestUI.TYPE_CONTACT_DETAILS) {
+                callback.onResult(mContactSection);
+            } else if (optionType == PaymentRequestUI.TYPE_PAYMENT_METHODS) {
+                assert mPaymentMethodsSection != null;
+                callback.onResult(mPaymentMethodsSection);
             }
         });
     }
@@ -1462,12 +1456,8 @@
             // period expires.
             query = new CanMakePaymentQuery(Collections.unmodifiableMap(mMethodData));
             sCanMakePaymentQueries.put(canMakePaymentId, query);
-            mHandler.postDelayed(new Runnable() {
-                @Override
-                public void run() {
-                    sCanMakePaymentQueries.remove(canMakePaymentId);
-                }
-            }, CAN_MAKE_PAYMENT_QUERY_PERIOD_MS);
+            mHandler.postDelayed(() -> sCanMakePaymentQueries.remove(canMakePaymentId),
+                    CAN_MAKE_PAYMENT_QUERY_PERIOD_MS);
         } else if (shouldEnforceCanMakePaymentQueryQuota()
                 && !query.matchesPaymentMethods(Collections.unmodifiableMap(mMethodData))) {
             // If there has been a canMakePayment() query in the last 30 minutes, but the previous
@@ -1810,12 +1800,9 @@
      */
     private void closeUI(boolean immediateClose) {
         if (mUI != null) {
-            mUI.close(immediateClose, new Runnable() {
-                @Override
-                public void run() {
-                    if (mClient != null) mClient.onComplete();
-                    closeClient();
-                }
+            mUI.close(immediateClose, () -> {
+                if (mClient != null) mClient.onComplete();
+                closeClient();
             });
             mUI = null;
             mIsCurrentPaymentRequestShowing = false;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentApp.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentApp.java
index 8dac78e..2d36d86 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentApp.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentApp.java
@@ -78,13 +78,10 @@
     public void getInstruments(Map<String, PaymentMethodData> unusedMethodDataMap,
             String unusedOrigin, String unusedIFrameOrigin, byte[][] unusedCertificateChain,
             final InstrumentsCallback callback) {
-        new Handler().post(new Runnable() {
-            @Override
-            public void run() {
-                List<PaymentInstrument> instruments = new ArrayList();
-                instruments.add(ServiceWorkerPaymentApp.this);
-                callback.onInstrumentsReady(ServiceWorkerPaymentApp.this, instruments);
-            }
+        new Handler().post(() -> {
+            List<PaymentInstrument> instruments = new ArrayList();
+            instruments.add(ServiceWorkerPaymentApp.this);
+            callback.onInstrumentsReady(ServiceWorkerPaymentApp.this, instruments);
         });
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java
index 2a792d5..b50945d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java
@@ -76,6 +76,9 @@
         mSuggestionsPref.setChecked(
                 suggestionsEnabled && SnippetsBridge.areContentSuggestionsNotificationsEnabled());
         mSuggestionsPref.setEnabled(suggestionsEnabled);
+        mSuggestionsPref.setSummary(suggestionsEnabled
+                        ? R.string.notifications_content_suggestions_summary
+                        : R.string.notifications_content_suggestions_summary_disabled);
 
         mFromWebsitesPref.setSummary(ContentSettingsResources.getCategorySummary(
                 ContentSettingsType.CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/ImageFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/ImageFetcher.java
index d6925e71..d407dabf 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/ImageFetcher.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/ImageFetcher.java
@@ -129,8 +129,9 @@
         }
 
         if (!suggestion.isArticle() || !SnippetsConfig.isFaviconsFromNewServerEnabled()) {
-            // The old code path. Remove when the experiment is successful.
-            // Currently, we have to use this for non-articles, due to privacy.
+            // The old code path. Currently, we have to use this for non-articles, due to privacy.
+            // TODO(jkrcal): Remove this path when we completely switch to the new code on Stable.
+            // https://crbug.com/751628
             fetchFaviconFromLocalCache(pageUrl, true, faviconFetchStartTimeMs, faviconSizePx,
                     suggestion, faviconCallback);
         } else {
@@ -194,6 +195,10 @@
                                     fallbackToService ? FaviconFetchResult.SUCCESS_CACHED
                                                       : FaviconFetchResult.SUCCESS_FETCHED,
                                     SystemClock.elapsedRealtime() - faviconFetchStartTimeMs);
+
+                            // Update the time when the icon was last requested therefore postponing
+                            // the automatic eviction of the favicon from the favicon database.
+                            getFaviconHelper().touchOnDemandFavicon(mProfile, iconUrl);
                         } else if (fallbackToService) {
                             if (!fetchFaviconFromService(suggestion, snippetUri,
                                         faviconFetchStartTimeMs, faviconSizePx, faviconCallback)) {
@@ -234,8 +239,7 @@
         ensureIconIsAvailable(
                 getSnippetDomain(snippetUri), // Store to the cache for the whole domain.
                 String.format(FAVICON_SERVICE_FORMAT, snippetUri.getHost(), sizePx),
-                /* useLargeIcon = */ false, /* isTemporary = */ true,
-                new FaviconHelper.IconAvailabilityCallback() {
+                /* useLargeIcon = */ false, new FaviconHelper.IconAvailabilityCallback() {
                     @Override
                     public void onIconAvailabilityChecked(boolean newlyAvailable) {
                         if (!newlyAvailable) {
@@ -261,11 +265,10 @@
      * @param callback The callback to be notified when the favicon has been checked.
      */
     private void ensureIconIsAvailable(String pageUrl, String iconUrl, boolean isLargeIcon,
-            boolean isTemporary, FaviconHelper.IconAvailabilityCallback callback) {
+            FaviconHelper.IconAvailabilityCallback callback) {
         if (mHost.getActiveTab() != null && mHost.getActiveTab().getWebContents() != null) {
             getFaviconHelper().ensureIconIsAvailable(mProfile,
-                    mHost.getActiveTab().getWebContents(), pageUrl, iconUrl, isLargeIcon,
-                    isTemporary, callback);
+                    mHost.getActiveTab().getWebContents(), pageUrl, iconUrl, isLargeIcon, callback);
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcher.java
index 3f77d190..d87061b8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcher.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcher.java
@@ -22,12 +22,6 @@
     /** Observes fetching of the Web Manifest. */
     public interface Observer {
         /**
-         * Called when the initial URL load has completed and the page has no Web Manifest or the
-         * Web Manifest is not WebAPK compatible.
-         */
-        void onWebManifestForInitialUrlNotWebApkCompatible();
-
-        /**
          * Called when the Web Manifest has been successfully fetched (including on the initial URL
          * load).
          * @param fetchedInfo    The fetched Web Manifest data.
@@ -124,15 +118,6 @@
         mObserver.onGotManifestData(info, primaryIconUrl, badgeIconUrl);
     }
 
-    /**
-     * Called when the initial URL load has completed and the page has no Web Manifest or the
-     * Web Manifest is not WebAPK compatible.
-     */
-    @CalledByNative
-    private void onWebManifestForInitialUrlNotWebApkCompatible() {
-        mObserver.onWebManifestForInitialUrlNotWebApkCompatible();
-    }
-
     private native long nativeInitialize(String scope, String webManifestUrl);
     private native void nativeReplaceWebContents(
             long nativeWebApkUpdateDataFetcher, WebContents webContents);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java
index 1632c42..51d30178 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java
@@ -9,6 +9,7 @@
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.graphics.Bitmap;
+import android.os.Handler;
 import android.text.TextUtils;
 
 import org.chromium.base.ActivityState;
@@ -25,6 +26,7 @@
 import org.chromium.webapk.lib.client.WebApkVersion;
 
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * WebApkUpdateManager manages when to check for updates to the WebAPK's Web Manifest, and sends
@@ -33,6 +35,9 @@
 public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer {
     private static final String TAG = "WebApkUpdateManager";
 
+    // Maximum wait time for WebAPK update to be scheduled.
+    private static final long UPDATE_TIMEOUT_MILLISECONDS = TimeUnit.SECONDS.toMillis(30);
+
     /**
      * Number of times to wait for updating the WebAPK after it is moved to the background prior
      * to doing the update while the WebAPK is in the foreground.
@@ -59,6 +64,9 @@
 
     private WebApkUpdateDataFetcher mFetcher;
 
+    /** Runs failure callback if WebAPK update is not scheduled within deadline. */
+    private Handler mUpdateFailureHandler;
+
     /**
      * Contains all the data which is cached for a pending update request once the WebAPK is no
      * longer running foreground.
@@ -97,6 +105,13 @@
 
         mFetcher = buildFetcher();
         mFetcher.start(tab, mInfo, this);
+        mUpdateFailureHandler = new Handler();
+        mUpdateFailureHandler.postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                onGotManifestData(null, null, null);
+            }
+        }, UPDATE_TIMEOUT_MILLISECONDS);
     }
 
     /**
@@ -124,14 +139,12 @@
     }
 
     @Override
-    public void onWebManifestForInitialUrlNotWebApkCompatible() {
-        onGotManifestData(null, null, null);
-    }
-
-    @Override
     public void onGotManifestData(WebApkInfo fetchedInfo, String primaryIconUrl,
             String badgeIconUrl) {
         mStorage.updateTimeOfLastCheckForUpdatedWebManifest();
+        if (mUpdateFailureHandler != null) {
+            mUpdateFailureHandler.removeCallbacksAndMessages(null);
+        }
 
         boolean gotManifest = (fetchedInfo != null);
         boolean needsUpgrade = isShellApkVersionOutOfDate(mInfo)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
index c9f6a4b..92dce66 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
@@ -156,8 +156,23 @@
     public void preInflationStartup() {
         Intent intent = getIntent();
         WebappInfo info = popWebappInfo(WebappInfo.idFromIntent(intent));
+        // When WebappActivity is killed by the Android OS, and an entry stays in "Android Recents"
+        // (The user does not swipe it away), when WebappActivity is relaunched it is relaunched
+        // with the intent stored in WebappActivity#getIntent() at the time that the WebappActivity
+        // was killed. WebappActivity may be relaunched from:
+
+        // (A) An intent from WebappLauncherActivity (e.g. as a result of a notification or a deep
+        // link). Android drops the intent from WebappLauncherActivity in favor of
+        // WebappActivity#getIntent() at the time that the WebappActivity was killed.
+
+        // (B) The user selecting the WebappActivity in recents. In case (A) we want to use the
+        // intent sent to WebappLauncherActivity and ignore WebappActivity#getSavedInstanceState().
+        // In case (B) we want to restore to saved tab state.
         if (info == null) {
             info = createWebappInfo(intent);
+        } else if (info.shouldForceNavigation()) {
+            // Don't restore to previous page, navigate using WebappInfo retrieved from cache.
+            resetSavedInstanceState();
         }
 
         mWebappInfo = info;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/OverviewListLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/OverviewListLayout.java
index 7a9177e..1ea62a1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/OverviewListLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/OverviewListLayout.java
@@ -6,6 +6,7 @@
 
 import android.content.Context;
 import android.view.LayoutInflater;
+import android.view.View;
 import android.view.ViewGroup;
 import android.widget.FrameLayout;
 import android.widget.ListView;
@@ -57,8 +58,10 @@
 
         if (container == null || mTabModelWrapper.getParent() != null) return;
 
-        ((ViewGroup) container.findViewById(R.id.overview_list_layout_holder))
-                .addView(mTabModelWrapper);
+        ViewGroup overviewList =
+                (ViewGroup) container.findViewById(R.id.overview_list_layout_holder);
+        overviewList.setVisibility(View.VISIBLE);
+        overviewList.addView(mTabModelWrapper);
     }
 
     @Override
@@ -152,7 +155,10 @@
         if (mTabModelSelector != null) mTabModelSelector.commitAllTabClosures();
         if (mTabModelWrapper != null) {
             ViewGroup parent = (ViewGroup) mTabModelWrapper.getParent();
-            if (parent != null) parent.removeView(mTabModelWrapper);
+            if (parent != null) {
+                parent.setVisibility(View.GONE);
+                parent.removeView(mTabModelWrapper);
+            }
         }
     }
 
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
index 5c458328..371da18 100644
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -413,12 +413,6 @@
       <message name="IDS_MANAGE_PASSWORDS_TEXT" desc="Text for link to manage passwords on Account Central.">
         View and manage saved passwords at <ph name="BEGIN_LINK">&lt;link&gt;</ph>passwords.google.com<ph name="END_LINK">&lt;/link&gt;</ph>
       </message>
-      <message name="IDS_REDIRECT_TO_PASSWORDS_TEXT" desc="Title of password settings entry in main Chrome preferences for users who will be redirected to passwords.google.com to manage their passwords.">
-        Saved passwords
-      </message>
-      <message name="IDS_REDIRECT_TO_PASSWORDS_LINK" desc="Hostname of the site where users will go if they tap the passwords settings in main Chrome preferences.">
-        passwords.google.com
-      </message>
       <message name="IDS_SAVED_PASSWORDS_NONE_TEXT" desc="Text when there are no saved passwords/exceptions.">
         Saved passwords will appear here.
       </message>
@@ -434,9 +428,6 @@
       <message name="IDS_PASSWORD_ENTRY_EDITOR_PASSWORD" desc='Title preceding password on password entry editor.'>
         Password
       </message>
-      <message name="IDS_PASSWORD_ENTRY_EDITOR_COPY_STORED_SITE" desc='Content description for the button that copies the stored site.'>
-        Copy site
-      </message>
       <message name="IDS_PASSWORD_ENTRY_EDITOR_COPY_STORED_USERNAME" desc='Content description for the button that copies the stored username.'>
         Copy username
       </message>
@@ -464,17 +455,8 @@
       <message name="IDS_PASSWORD_ENTRY_EDITOR_SET_LOCK_SCREEN" desc='Text prompting user to set device lock in order to view/copy passwords'>
         To view or copy your password here, set screen lock on this device.
       </message>
-      <message name="IDS_PASSWORD_ENTRY_EDITOR_NOT_AVAILABLE_ON_PRE_LOLLIPOP" desc='Text that announced user that password viewing is not possible on pre-Lollipop devices'>
-        Password viewing and copying are not available on your version of Android.
-      </message>
 
       <!-- Lock Screen Fragment -->
-      <message name="IDS_LOCKSCREEN_VERIFICATION_TITLE" desc='Customized title for lock screen prompting user to unlock their phone to continue with setup.'>
-        Confirm your screen lock
-      </message>
-      <message name="IDS_LOCKSCREEN_VERIFICATION_TEXT" desc='User needs to enter lock pattern to verify that they own this phone.'>
-        For security reasons, you need to confirm your screen lock in order to access your password.
-      </message>
       <message name="IDS_LOCKSCREEN_DESCRIPTION" desc='Text on lockscreen explaining to user that they need to unlock the device to continue setup.'>
         Unlock to continue setting up your phone
       </message>
@@ -500,6 +482,9 @@
       <message name="IDS_NOTIFICATIONS_FROM_WEBSITES_TITLE" desc="Summary for the preference to link to the per-website notification settings.">
         From websites
       </message>
+      <message name="IDS_NOTIFICATIONS_CONTENT_SUGGESTIONS_SUMMARY_DISABLED" desc="Summary for the disabled preference to turn on/off content suggestions notifications when search and site suggestions are disabled.">
+        Search and site suggestions disabled
+      </message>
 
       <!-- Privacy preferences -->
       <message name="IDS_PREFS_PRIVACY" desc="Title for the Privacy preferences. [CHAR-LIMIT=32]">
@@ -714,17 +699,6 @@
         Automatically send usage statistics and crash reports to Google
       </message>
 
-      <!-- Suggestions preferences -->
-      <message name="IDS_SUGGESTIONS_FEATURE_SWITCH_TITLE" desc="Title for switch used to toggle the Content Suggestions feature on or off." translateable="false">
-        Suggestions
-      </message>
-      <message name="IDS_SUGGESTIONS_FEATURE_SWITCH_ON_SUMMARY" desc="Description for the Suggestions switch when the feature is enabled." translateable="false">
-        Use Google servers to provide browsing suggestions.
-      </message>
-      <message name="IDS_SUGGESTIONS_CAVEATS_DESCRIPTION" desc="Description text for suggestions usage caveats" translateable="false">
-        When this feature is turned on, Chrome will use Google servers to provide browsing suggestions, e.g. when you open a new tab. This include popular websites, trending articles as well as personalized suggestions.
-      </message>
-
       <!-- Accessibility preferences -->
       <message name="IDS_PREFS_ACCESSIBILITY" desc="Title of Accessibility settings, which allows the user to change webpage font sizes. [CHAR-LIMIT=32]">
         Accessibility
@@ -2589,9 +2563,6 @@
       <message name="IDS_READER_VIEW_TEXT" desc="Message shown on the reader mode button bar, to invite the user to tap to open a reader mode. Reader mode extracts content and removes clutter from a web page and puts the result in a panel making it easier to read.">
         Make page mobile-friendly
       </message>
-      <message name="IDS_READER_MODE_MAXIMIZED_TITLE" desc="Message shown on the reader mode button bar when it is opened to show reader mode. Reader mode extracts content and removes clutter from a web page and puts the result in a panel making it easier to read.">
-        Mobile-friendly view
-      </message>
       <message name="IDS_CONTENT_PROVIDER_SEARCH_DESCRIPTION" desc="Description for Chrome's entry in QSB's list of search suggestion providers [CHAR-LIMIT=32]">
         Bookmarks and web history
       </message>
@@ -2951,10 +2922,6 @@
         <ph name="ITEM_NAME">%1$s<ex>item_name</ex></ph> (<ph name="ITEM_ID">%2$s<ex>item id</ex></ph>)
       </message>
 
-      <message name="IDS_INSTANT_APPS_OPEN_IN_APP" desc="Button label for the user action that will open an Instant App.">
-        Open app
-      </message>
-
       <!-- WebAPK related strings -->
       <message name="IDS_WEBAPK_RUNNING_IN_CHROME_DISCLOSURE" desc="Message on the notification that indicates a WebApk may use Chrome data.">
         This app is running in Chrome.
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index 7150fed..72258f7 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -272,6 +272,7 @@
   "java/src/org/chromium/chrome/browser/contextualsearch/TapWordLengthSuppression.java",
   "java/src/org/chromium/chrome/browser/cookies/CanonicalCookie.java",
   "java/src/org/chromium/chrome/browser/cookies/CookiesFetcher.java",
+  "java/src/org/chromium/chrome/browser/coordinator/CoordinatorLayoutForPointer.java",
   "java/src/org/chromium/chrome/browser/crash/ChromeMinidumpUploadJobService.java",
   "java/src/org/chromium/chrome/browser/crash/ChromeMinidumpUploaderDelegate.java",
   "java/src/org/chromium/chrome/browser/crash/LogcatExtractionRunnable.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility/FontSizePrefsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility/FontSizePrefsTest.java
index b4916d58..7cecc91d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility/FontSizePrefsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/accessibility/FontSizePrefsTest.java
@@ -22,8 +22,6 @@
 import org.chromium.chrome.browser.accessibility.FontSizePrefs.FontSizePrefsObserver;
 import org.chromium.chrome.browser.test.ChromeBrowserTestRule;
 
-import java.util.concurrent.Callable;
-
 /**
  * Tests for {@link FontSizePrefs}.
  */
@@ -175,89 +173,54 @@
         }
 
         private void assertConsistent() {
-            ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-                @Override
-                public void run() {
-                    Assert.assertEquals(getUserFontScaleFactor(), mUserFontScaleFactor, EPSILON);
-                    Assert.assertEquals(getFontScaleFactor(), mFontScaleFactor, EPSILON);
-                    Assert.assertEquals(getForceEnableZoom(), mForceEnableZoom);
-                }
+            ThreadUtils.runOnUiThreadBlocking(() -> {
+                Assert.assertEquals(getUserFontScaleFactor(), mUserFontScaleFactor, EPSILON);
+                Assert.assertEquals(getFontScaleFactor(), mFontScaleFactor, EPSILON);
+                Assert.assertEquals(getForceEnableZoom(), mForceEnableZoom);
             });
         }
     }
 
     private FontSizePrefs getFontSizePrefs(final Context context) {
-        return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<FontSizePrefs>() {
-            @Override
-            public FontSizePrefs call() {
-                return FontSizePrefs.getInstance(context);
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlockingNoException(
+                () -> FontSizePrefs.getInstance(context));
     }
 
     private TestingObserver createAndAddFontSizePrefsObserver() {
-        return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<TestingObserver>() {
-            @Override
-            public TestingObserver call() {
-                TestingObserver observer = new TestingObserver();
-                mFontSizePrefs.addObserver(observer);
-                return observer;
-            }
+        return ThreadUtils.runOnUiThreadBlockingNoException(() -> {
+            TestingObserver observer = new TestingObserver();
+            mFontSizePrefs.addObserver(observer);
+            return observer;
         });
     }
 
     private void setUserFontScaleFactor(final float fontsize) {
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mFontSizePrefs.setUserFontScaleFactor(fontsize);
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(() -> mFontSizePrefs.setUserFontScaleFactor(fontsize));
     }
 
     private float getUserFontScaleFactor() {
-        return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Float>() {
-            @Override
-            public Float call() {
-                return mFontSizePrefs.getUserFontScaleFactor();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlockingNoException(
+                () -> mFontSizePrefs.getUserFontScaleFactor());
     }
 
     private float getFontScaleFactor() {
-        return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Float>() {
-            @Override
-            public Float call() {
-                return mFontSizePrefs.getFontScaleFactor();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlockingNoException(
+                () -> mFontSizePrefs.getFontScaleFactor());
     }
 
     private void setForceEnableZoomFromUser(final boolean enabled) {
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mFontSizePrefs.setForceEnableZoomFromUser(enabled);
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(() -> mFontSizePrefs.setForceEnableZoomFromUser(enabled));
     }
 
     private boolean getForceEnableZoom() {
-        return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Boolean>() {
-            @Override
-            public Boolean call() {
-                return mFontSizePrefs.getForceEnableZoom();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlockingNoException(
+                () -> mFontSizePrefs.getForceEnableZoom());
     }
 
     private void setSystemFontScaleForTest(final float systemFontScale) {
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mFontSizePrefs.setSystemFontScaleForTest(systemFontScale);
-                mFontSizePrefs.onSystemFontScaleChanged();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mFontSizePrefs.setSystemFontScaleForTest(systemFontScale);
+            mFontSizePrefs.onSystemFontScaleChanged();
         });
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java
index fd791d0..37feb71 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java
@@ -35,8 +35,6 @@
 import org.chromium.content.browser.test.util.Criteria;
 import org.chromium.content.browser.test.util.CriteriaHelper;
 
-import java.util.concurrent.Callable;
-
 /**
  * Tests AppMenu popup
  */
@@ -81,32 +79,18 @@
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false);
 
         ChromeActivity.setAppMenuHandlerFactoryForTesting(
-                new ChromeActivity.AppMenuHandlerFactory() {
-                    @Override
-                    public AppMenuHandler get(Activity activity, AppMenuPropertiesDelegate delegate,
-                            int menuResourceId) {
-                        mAppMenuHandler =
-                                new AppMenuHandlerForTest(activity, delegate, menuResourceId);
-                        return mAppMenuHandler;
-                    }
+                (activity, delegate, menuResourceId) -> {
+                    mAppMenuHandler =
+                            new AppMenuHandlerForTest(activity, delegate, menuResourceId);
+                    return mAppMenuHandler;
                 });
 
         mActivityTestRule.startMainActivityWithURL(TEST_URL);
 
         showAppMenuAndAssertMenuShown();
         mAppMenu = mActivityTestRule.getActivity().getAppMenuHandler().getAppMenu();
-        ThreadUtils.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mAppMenu.getListView().setSelection(0);
-            }
-        });
-        CriteriaHelper.pollInstrumentationThread(Criteria.equals(0, new Callable<Integer>() {
-            @Override
-            public Integer call() {
-                return getCurrentFocusedRow();
-            }
-        }));
+        ThreadUtils.runOnUiThread(() -> mAppMenu.getListView().setSelection(0));
+        CriteriaHelper.pollInstrumentationThread(Criteria.equals(0, () -> getCurrentFocusedRow()));
         InstrumentationRegistry.getInstrumentation().waitForIdleSync();
     }
 
@@ -231,12 +215,7 @@
     }
 
     private void showAppMenuAndAssertMenuShown() {
-        ThreadUtils.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mAppMenuHandler.showAppMenu(null, false);
-            }
-        });
+        ThreadUtils.runOnUiThread((Runnable) () -> mAppMenuHandler.showAppMenu(null, false));
         CriteriaHelper.pollInstrumentationThread(new Criteria("AppMenu did not show") {
             @Override
             public boolean isSatisfied() {
@@ -264,23 +243,14 @@
             pressKey(towardsTop ? KeyEvent.KEYCODE_DPAD_UP : KeyEvent.KEYCODE_DPAD_DOWN);
             final int expectedPosition = index + increment;
             CriteriaHelper.pollInstrumentationThread(
-                    Criteria.equals(expectedPosition, new Callable<Integer>() {
-                        @Override
-                        public Integer call() {
-                            return getCurrentFocusedRow();
-                        }
-                    }));
+                    Criteria.equals(expectedPosition, () -> getCurrentFocusedRow()));
         }
 
         // Try moving past it by one.
         if (movePast) {
             pressKey(towardsTop ? KeyEvent.KEYCODE_DPAD_UP : KeyEvent.KEYCODE_DPAD_DOWN);
-            CriteriaHelper.pollInstrumentationThread(Criteria.equals(end, new Callable<Integer>() {
-                @Override
-                public Integer call() {
-                    return getCurrentFocusedRow();
-                }
-            }));
+            CriteriaHelper.pollInstrumentationThread(Criteria.equals(end,
+                    () -> getCurrentFocusedRow()));
         }
 
         // The menu should stay open.
@@ -289,12 +259,9 @@
 
     private void pressKey(final int keycode) {
         final View view = mAppMenu.getListView();
-        ThreadUtils.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, keycode));
-                view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, keycode));
-            }
+        ThreadUtils.runOnUiThread(() -> {
+            view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, keycode));
+            view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, keycode));
         });
         InstrumentationRegistry.getInstrumentation().waitForIdleSync();
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/ChromeHomeAppMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/ChromeHomeAppMenuTest.java
index ae62965..298000e1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/ChromeHomeAppMenuTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/ChromeHomeAppMenuTest.java
@@ -60,12 +60,9 @@
         assertTrue(iconRow.getReloadButtonForTests().isEnabled());
 
         // Navigate backward, open the menu and assert forward button is enabled.
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mAppMenuHandler.hideAppMenu();
-                mBottomSheetTestRule.getActivity().getActivityTab().goBack();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mAppMenuHandler.hideAppMenu();
+            mBottomSheetTestRule.getActivity().getActivityTab().goBack();
         });
 
         showAppMenuAndAssertMenuShown();
@@ -76,12 +73,8 @@
     @Test
     @SmallTest
     public void testTabSwitcherMenu() throws IllegalArgumentException {
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mBottomSheetTestRule.getActivity().getLayoutManager().showOverview(false);
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mBottomSheetTestRule.getActivity().getLayoutManager().showOverview(false));
 
         showAppMenuAndAssertMenuShown();
         AppMenu appMenu = mAppMenuHandler.getAppMenu();
@@ -90,12 +83,7 @@
     }
 
     private void showAppMenuAndAssertMenuShown() {
-        ThreadUtils.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mAppMenuHandler.showAppMenu(null, false);
-            }
-        });
+        ThreadUtils.runOnUiThread((Runnable) () -> mAppMenuHandler.showAppMenu(null, false));
         CriteriaHelper.pollUiThread(new Criteria("AppMenu did not show") {
             @Override
             public boolean isSatisfied() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java
index 69f05afe..5be8175 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java
@@ -62,14 +62,10 @@
     @Before
     public void setUp() throws Exception {
         ChromeTabbedActivity.setAppMenuHandlerFactoryForTesting(
-                new ChromeTabbedActivity.AppMenuHandlerFactory() {
-                    @Override
-                    public AppMenuHandler get(Activity activity, AppMenuPropertiesDelegate delegate,
-                            int menuResourceId) {
-                        mAppMenuHandler =
-                                new AppMenuHandlerForTest(activity, delegate, menuResourceId);
-                        return mAppMenuHandler;
-                    }
+                (activity, delegate, menuResourceId) -> {
+                    mAppMenuHandler =
+                            new AppMenuHandlerForTest(activity, delegate, menuResourceId);
+                    return mAppMenuHandler;
                 });
 
         mActivityTestRule.startMainActivityOnBlankPage();
@@ -83,15 +79,12 @@
     @CommandLineFlags.Add("disable-field-trial-config")
     @Feature({"Browser", "Main"})
     public void testMenuDataSaverNoFeature() throws Throwable {
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                ContextUtils.getAppSharedPreferences().edit().clear().apply();
-                Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId());
-                DataReductionProxySettings.getInstance().setDataReductionProxyEnabled(
-                        mActivityTestRule.getActivity().getApplicationContext(), true);
-                Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId());
-            }
+        mActivityTestRule.runOnUiThread((Runnable) () -> {
+            ContextUtils.getAppSharedPreferences().edit().clear().apply();
+            Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId());
+            DataReductionProxySettings.getInstance().setDataReductionProxyEnabled(
+                    mActivityTestRule.getActivity().getApplicationContext(), true);
+            Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId());
         });
     }
 
@@ -104,24 +97,21 @@
             "disable-field-trial-config"})
     @Feature({"Browser", "Main"})
     public void testMenuDataSaver() throws Throwable {
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                ContextUtils.getAppSharedPreferences().edit().clear().apply();
-                // Data Saver hasn't been turned on, the footer shouldn't show.
-                Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId());
+        mActivityTestRule.runOnUiThread((Runnable) () -> {
+            ContextUtils.getAppSharedPreferences().edit().clear().apply();
+            // Data Saver hasn't been turned on, the footer shouldn't show.
+            Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId());
 
-                // Turn Data Saver on, the footer should show.
-                DataReductionProxySettings.getInstance().setDataReductionProxyEnabled(
-                        mActivityTestRule.getActivity().getApplicationContext(), true);
-                Assert.assertEquals(R.layout.data_reduction_main_menu_footer,
-                        mAppMenuHandler.getDelegate().getFooterResourceId());
+            // Turn Data Saver on, the footer should show.
+            DataReductionProxySettings.getInstance().setDataReductionProxyEnabled(
+                    mActivityTestRule.getActivity().getApplicationContext(), true);
+            Assert.assertEquals(R.layout.data_reduction_main_menu_footer,
+                    mAppMenuHandler.getDelegate().getFooterResourceId());
 
-                // Ensure the footer is removed if the proxy is turned off.
-                DataReductionProxySettings.getInstance().setDataReductionProxyEnabled(
-                        mActivityTestRule.getActivity().getApplicationContext(), false);
-                Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId());
-            }
+            // Ensure the footer is removed if the proxy is turned off.
+            DataReductionProxySettings.getInstance().setDataReductionProxyEnabled(
+                    mActivityTestRule.getActivity().getApplicationContext(), false);
+            Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId());
         });
     }
 
@@ -138,25 +128,22 @@
             "disable-field-trial-config"})
     @Feature({"Browser", "Main"})
     public void testMenuDataSaverPersistent() throws Throwable {
-        mActivityTestRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                ContextUtils.getAppSharedPreferences().edit().clear().apply();
-                // Data Saver hasn't been turned on, the footer shouldn't show.
-                Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId());
+        mActivityTestRule.runOnUiThread((Runnable) () -> {
+            ContextUtils.getAppSharedPreferences().edit().clear().apply();
+            // Data Saver hasn't been turned on, the footer shouldn't show.
+            Assert.assertEquals(0, mAppMenuHandler.getDelegate().getFooterResourceId());
 
-                // Turn Data Saver on, the footer should show.
-                DataReductionProxySettings.getInstance().setDataReductionProxyEnabled(
-                        mActivityTestRule.getActivity().getApplicationContext(), true);
-                Assert.assertEquals(R.layout.data_reduction_main_menu_footer,
-                        mAppMenuHandler.getDelegate().getFooterResourceId());
+            // Turn Data Saver on, the footer should show.
+            DataReductionProxySettings.getInstance().setDataReductionProxyEnabled(
+                    mActivityTestRule.getActivity().getApplicationContext(), true);
+            Assert.assertEquals(R.layout.data_reduction_main_menu_footer,
+                    mAppMenuHandler.getDelegate().getFooterResourceId());
 
-                // Ensure the footer remains if the proxy is turned off.
-                DataReductionProxySettings.getInstance().setDataReductionProxyEnabled(
-                        mActivityTestRule.getActivity().getApplicationContext(), false);
-                Assert.assertEquals(R.layout.data_reduction_main_menu_footer,
-                        mAppMenuHandler.getDelegate().getFooterResourceId());
-            }
+            // Ensure the footer remains if the proxy is turned off.
+            DataReductionProxySettings.getInstance().setDataReductionProxyEnabled(
+                    mActivityTestRule.getActivity().getApplicationContext(), false);
+            Assert.assertEquals(R.layout.data_reduction_main_menu_footer,
+                    mAppMenuHandler.getDelegate().getFooterResourceId());
         });
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryTest.java
index 6895523e..08afdb01 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryTest.java
@@ -33,7 +33,6 @@
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.UiUtils;
 
-import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicReference;
@@ -91,16 +90,13 @@
                         + "Doooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooe",
                 "Acme Inc", "1 Main\nApt A", "CA", "San Francisco", "", "94102", "", "US",
                 "(415) 999-0000", "jane@acme.inc", "en"));
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mViewCoreRef.set(mActivityTestRule.getActivity().getCurrentContentViewCore());
-                mWebContentsRef.set(mViewCoreRef.get().getWebContents());
-                mContainerRef.set(mViewCoreRef.get().getContainerView());
-                mKeyboardAccessoryRef.set(mActivityTestRule.getActivity()
-                                                  .getWindowAndroid()
-                                                  .getKeyboardAccessoryView());
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mViewCoreRef.set(mActivityTestRule.getActivity().getCurrentContentViewCore());
+            mWebContentsRef.set(mViewCoreRef.get().getWebContents());
+            mContainerRef.set(mViewCoreRef.get().getContainerView());
+            mKeyboardAccessoryRef.set(mActivityTestRule.getActivity()
+                    .getWindowAndroid()
+                    .getKeyboardAccessoryView());
         });
         DOMUtils.waitForNonZeroNodeBounds(mWebContentsRef.get(), "fn");
     }
@@ -116,12 +112,8 @@
         loadTestPage(false);
         Assert.assertTrue("Keyboard accessory should be hidden.",
                 ThreadUtils
-                        .runOnUiThreadBlocking(new Callable<Boolean>() {
-                            @Override
-                            public Boolean call() {
-                                return mKeyboardAccessoryRef.get().getVisibility() == View.GONE;
-                            }
-                        })
+                        .runOnUiThreadBlocking(
+                                () -> mKeyboardAccessoryRef.get().getVisibility() == View.GONE)
                         .booleanValue());
     }
 
@@ -144,12 +136,8 @@
         });
         Assert.assertTrue("Keyboard accessory should be showing.",
                 ThreadUtils
-                        .runOnUiThreadBlocking(new Callable<Boolean>() {
-                            @Override
-                            public Boolean call() {
-                                return mKeyboardAccessoryRef.get().getVisibility() == View.VISIBLE;
-                            }
-                        })
+                        .runOnUiThreadBlocking(
+                                () -> mKeyboardAccessoryRef.get().getVisibility() == View.VISIBLE)
                         .booleanValue());
     }
 
@@ -170,12 +158,8 @@
                         mActivityTestRule.getActivity(), mContainerRef.get());
             }
         });
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                ((HorizontalScrollView) mKeyboardAccessoryRef.get()).scrollTo(2000, 0);
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> ((HorizontalScrollView) mKeyboardAccessoryRef.get()).scrollTo(2000, 0));
         CriteriaHelper.pollUiThread(
                 new Criteria("First suggestion should be off the screen after manual scroll.") {
                     @Override
@@ -223,12 +207,8 @@
                         mActivityTestRule.getActivity(), mContainerRef.get());
             }
         });
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                ((HorizontalScrollView) mKeyboardAccessoryRef.get()).scrollTo(0, 0);
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> ((HorizontalScrollView) mKeyboardAccessoryRef.get()).scrollTo(0, 0));
         CriteriaHelper.pollUiThread(
                 new Criteria("Last suggestion should be on the screen after manual scroll.") {
                     @Override
@@ -278,13 +258,10 @@
                         mActivityTestRule.getActivity(), mContainerRef.get());
             }
         });
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                View suggestion = getSuggestionAt(0);
-                if (suggestion != null) {
-                    suggestion.performClick();
-                }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            View suggestion = getSuggestionAt(0);
+            if (suggestion != null) {
+                suggestion.performClick();
             }
         });
         CriteriaHelper.pollUiThread(new Criteria("Keyboard should be hidden.") {
@@ -296,12 +273,8 @@
         });
         Assert.assertTrue("Keyboard accessory should be hidden.",
                 ThreadUtils
-                        .runOnUiThreadBlocking(new Callable<Boolean>() {
-                            @Override
-                            public Boolean call() {
-                                return mKeyboardAccessoryRef.get().getVisibility() == View.GONE;
-                            }
-                        })
+                        .runOnUiThreadBlocking(
+                                () -> mKeyboardAccessoryRef.get().getVisibility() == View.GONE)
                         .booleanValue());
     }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupTest.java
index 9c4540d..a41275d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupTest.java
@@ -37,7 +37,6 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeoutException;
 
@@ -141,12 +140,7 @@
     public void setUp() throws Exception {
         mAutofillLoggedEntries = new ArrayList<AutofillLogger.LogEntry>();
         AutofillLogger.setLoggerForTesting(
-                new AutofillLogger.Logger() {
-                    @Override
-                    public void didFillField(AutofillLogger.LogEntry logEntry) {
-                        mAutofillLoggedEntries.add(logEntry);
-                    }
-                }
+                logEntry -> mAutofillLoggedEntries.add(logEntry)
         );
     }
 
@@ -184,12 +178,7 @@
 
         final ChromiumBaseInputConnection inputConnection =
                 viewCore.getImeAdapterForTest().getInputConnectionForTest();
-        inputConnection.getHandler().post(new Runnable() {
-            @Override
-            public void run() {
-                inputConnection.setComposingText(inputText, 1);
-            }
-        });
+        inputConnection.getHandler().post(() -> inputConnection.setComposingText(inputText, 1));
 
         waitForAnchorViewAdd(view);
         View anchorView = view.findViewById(R.id.dropdown_popup_window);
@@ -317,12 +306,7 @@
     private void waitForKeyboardShowRequest(final TestInputMethodManagerWrapper immw,
             final int count) {
         CriteriaHelper.pollUiThread(
-                Criteria.equals(count, new Callable<Integer>() {
-                    @Override
-                    public Integer call() {
-                        return immw.getShowSoftInputCounter();
-                    }
-                }));
+                Criteria.equals(count, () -> immw.getShowSoftInputCounter()));
     }
 
     private void waitForAnchorViewAdd(final ViewGroup view) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupWithKeyboardTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupWithKeyboardTest.java
index 448aa1cc..32ac0b8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupWithKeyboardTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillPopupWithKeyboardTest.java
@@ -31,7 +31,6 @@
 import org.chromium.ui.R;
 import org.chromium.ui.UiUtils;
 
-import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicReference;
@@ -82,13 +81,10 @@
         final AtomicReference<ContentViewCore> viewCoreRef = new AtomicReference<ContentViewCore>();
         final AtomicReference<WebContents> webContentsRef = new AtomicReference<WebContents>();
         final AtomicReference<ViewGroup> viewRef = new AtomicReference<ViewGroup>();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                viewCoreRef.set(mActivityTestRule.getActivity().getCurrentContentViewCore());
-                webContentsRef.set(viewCoreRef.get().getWebContents());
-                viewRef.set(viewCoreRef.get().getContainerView());
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            viewCoreRef.set(mActivityTestRule.getActivity().getCurrentContentViewCore());
+            webContentsRef.set(viewCoreRef.get().getWebContents());
+            viewRef.set(viewCoreRef.get().getContainerView());
         });
         DOMUtils.waitForNonZeroNodeBounds(webContentsRef.get(), "fn");
 
@@ -116,12 +112,8 @@
                         return viewRef.get().findViewById(R.id.dropdown_popup_window) != null;
                     }
                 });
-        Object popupObject = ThreadUtils.runOnUiThreadBlocking(new Callable<Object>() {
-            @Override
-            public Object call() {
-                return viewRef.get().findViewById(R.id.dropdown_popup_window).getTag();
-            }
-        });
+        Object popupObject = ThreadUtils.runOnUiThreadBlocking(
+                () -> viewRef.get().findViewById(R.id.dropdown_popup_window).getTag());
         Assert.assertTrue(popupObject instanceof AutofillPopup);
         final AutofillPopup popup = (AutofillPopup) popupObject;
         CriteriaHelper.pollUiThread(new Criteria("Autofill Popup was never shown.") {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java
index 8a7d9e17..f8a44bce 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java
@@ -66,19 +66,16 @@
                 ViewAndroidDelegate.createBasicDelegate(
                         activity.getCurrentContentViewCore().getContainerView());
 
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                View anchorView = viewDelegate.acquireView();
-                viewDelegate.setViewPosition(anchorView, 50f, 500f, 500f, 500f, 1f, 10, 10);
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            View anchorView = viewDelegate.acquireView();
+            viewDelegate.setViewPosition(anchorView, 50f, 500f, 500f, 500f, 1f, 10, 10);
 
-                mWindowAndroid = new ActivityWindowAndroid(activity);
-                mAutofillPopup = new AutofillPopup(activity, anchorView, mMockAutofillCallback);
-                mAutofillPopup.filterAndShow(new AutofillSuggestion[0], false /* isRtl */,
-                        Color.TRANSPARENT /* backgroundColor */,
-                        Color.TRANSPARENT /* dividerColor */, 0 /* dropdownItemHeight */,
-                        0 /* margin */);
-            }
+            mWindowAndroid = new ActivityWindowAndroid(activity);
+            mAutofillPopup = new AutofillPopup(activity, anchorView, mMockAutofillCallback);
+            mAutofillPopup.filterAndShow(new AutofillSuggestion[0], false /* isRtl */,
+                    Color.TRANSPARENT /* backgroundColor */,
+                    Color.TRANSPARENT /* dividerColor */, 0 /* dropdownItemHeight */,
+                    0 /* margin */);
         });
     }
 
@@ -143,15 +140,11 @@
     }
 
     public void openAutofillPopupAndWaitUntilReady(final AutofillSuggestion[] suggestions) {
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mAutofillPopup.filterAndShow(suggestions, false /* isRtl */,
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mAutofillPopup.filterAndShow(suggestions, false /* isRtl */,
                         Color.TRANSPARENT /* backgroundColor */,
                         Color.TRANSPARENT /* dividerColor */, 0 /* dropdownItemHeight */,
-                        0 /* margin */);
-            }
-        });
+                        0 /* margin */));
         CriteriaHelper.pollInstrumentationThread(new Criteria() {
             @Override
             public boolean isSatisfied() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java
index ef11eb9..ac32f3d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java
@@ -8,10 +8,8 @@
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
-import org.chromium.chrome.browser.autofill.PersonalDataManager.PersonalDataManagerObserver;
 
 import java.util.List;
-import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeoutException;
 
@@ -28,40 +26,24 @@
     }
 
     void setRequestTimeoutForTesting() {
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                PersonalDataManager.getInstance().setRequestTimeoutForTesting(0);
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().setRequestTimeoutForTesting(0));
     }
 
     AutofillProfile getProfile(final String guid) throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<AutofillProfile>() {
-            @Override
-            public AutofillProfile call() {
-                return PersonalDataManager.getInstance().getProfile(guid);
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().getProfile(guid));
     }
 
     List<AutofillProfile> getProfilesToSuggest(final boolean includeNameInLabel) throws
             ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<List<AutofillProfile>>() {
-            @Override
-            public List<AutofillProfile> call() {
-                return PersonalDataManager.getInstance().getProfilesToSuggest(includeNameInLabel);
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().getProfilesToSuggest(includeNameInLabel));
     }
 
     List<AutofillProfile> getProfilesForSettings() throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<List<AutofillProfile>>() {
-            @Override
-            public List<AutofillProfile> call() {
-                return PersonalDataManager.getInstance().getProfilesForSettings();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().getProfilesForSettings());
     }
 
     int getNumberOfProfilesToSuggest() throws ExecutionException {
@@ -75,52 +57,32 @@
     public String setProfile(final AutofillProfile profile) throws InterruptedException,
             ExecutionException, TimeoutException {
         int callCount = mOnPersonalDataChangedHelper.getCallCount();
-        String guid = ThreadUtils.runOnUiThreadBlocking(new Callable<String>() {
-            @Override
-            public String call() {
-                return PersonalDataManager.getInstance().setProfile(profile);
-            }
-        });
+        String guid = ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().setProfile(profile));
         mOnPersonalDataChangedHelper.waitForCallback(callCount);
         return guid;
     }
 
     public void deleteProfile(final String guid) throws InterruptedException, TimeoutException {
         int callCount = mOnPersonalDataChangedHelper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                PersonalDataManager.getInstance().deleteProfile(guid);
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().deleteProfile(guid));
         mOnPersonalDataChangedHelper.waitForCallback(callCount);
     }
 
     public CreditCard getCreditCard(final String guid) throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<CreditCard>() {
-            @Override
-            public CreditCard call() {
-                return PersonalDataManager.getInstance().getCreditCard(guid);
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().getCreditCard(guid));
     }
 
     List<CreditCard> getCreditCardsToSuggest() throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<List<CreditCard>>() {
-            @Override
-            public List<CreditCard> call() {
-                return PersonalDataManager.getInstance().getCreditCardsToSuggest();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().getCreditCardsToSuggest());
     }
 
     List<CreditCard> getCreditCardsForSettings() throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<List<CreditCard>>() {
-            @Override
-            public List<CreditCard> call() {
-                return PersonalDataManager.getInstance().getCreditCardsForSettings();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().getCreditCardsForSettings());
     }
 
     int getNumberOfCreditCardsToSuggest() throws ExecutionException {
@@ -134,12 +96,8 @@
     public String setCreditCard(final CreditCard card) throws InterruptedException,
             ExecutionException, TimeoutException {
         int callCount = mOnPersonalDataChangedHelper.getCallCount();
-        String guid = ThreadUtils.runOnUiThreadBlocking(new Callable<String>() {
-            @Override
-            public String call() {
-                return PersonalDataManager.getInstance().setCreditCard(card);
-            }
-        });
+        String guid = ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().setCreditCard(card));
         mOnPersonalDataChangedHelper.waitForCallback(callCount);
         return guid;
     }
@@ -147,23 +105,15 @@
     public void addServerCreditCard(final CreditCard card)
             throws InterruptedException, ExecutionException, TimeoutException {
         int callCount = mOnPersonalDataChangedHelper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                PersonalDataManager.getInstance().addServerCreditCardForTest(card);
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().addServerCreditCardForTest(card));
         mOnPersonalDataChangedHelper.waitForCallback(callCount);
     }
 
     void deleteCreditCard(final String guid) throws InterruptedException, TimeoutException {
         int callCount = mOnPersonalDataChangedHelper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                PersonalDataManager.getInstance().deleteCreditCard(guid);
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().deleteCreditCard(guid));
         mOnPersonalDataChangedHelper.waitForCallback(callCount);
     }
 
@@ -176,12 +126,8 @@
      */
     void recordAndLogProfileUse(final String guid) throws InterruptedException, TimeoutException {
         int callCount = mOnPersonalDataChangedHelper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                PersonalDataManager.getInstance().recordAndLogProfileUse(guid);
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().recordAndLogProfileUse(guid));
         mOnPersonalDataChangedHelper.waitForCallback(callCount);
     }
 
@@ -199,12 +145,9 @@
     public void setProfileUseStatsForTesting(final String guid, final int count, final long date)
             throws InterruptedException, TimeoutException {
         int callCount = mOnPersonalDataChangedHelper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                PersonalDataManager.getInstance().setProfileUseStatsForTesting(guid, count, date);
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().setProfileUseStatsForTesting(guid, count,
+                        date));
         mOnPersonalDataChangedHelper.waitForCallback(callCount);
     }
 
@@ -216,12 +159,8 @@
      */
     public int getProfileUseCountForTesting(final String guid) throws InterruptedException,
             ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<Integer>() {
-            @Override
-            public Integer call() {
-                return PersonalDataManager.getInstance().getProfileUseCountForTesting(guid);
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().getProfileUseCountForTesting(guid));
     }
 
     /**
@@ -234,12 +173,8 @@
      */
     public long getProfileUseDateForTesting(final String guid) throws InterruptedException,
             ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<Long>() {
-            @Override
-            public Long call() {
-                return PersonalDataManager.getInstance().getProfileUseDateForTesting(guid);
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().getProfileUseDateForTesting(guid));
     }
 
     /**
@@ -252,12 +187,8 @@
     public void recordAndLogCreditCardUse(final String guid) throws InterruptedException,
             TimeoutException {
         int callCount = mOnPersonalDataChangedHelper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                PersonalDataManager.getInstance().recordAndLogCreditCardUse(guid);
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().recordAndLogCreditCardUse(guid));
         mOnPersonalDataChangedHelper.waitForCallback(callCount);
     }
 
@@ -275,13 +206,9 @@
     public void setCreditCardUseStatsForTesting(final String guid, final int count, final long date)
             throws InterruptedException, TimeoutException {
         int callCount = mOnPersonalDataChangedHelper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                PersonalDataManager.getInstance().setCreditCardUseStatsForTesting(
-                        guid, count, date);
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().setCreditCardUseStatsForTesting(
+                        guid, count, date));
         mOnPersonalDataChangedHelper.waitForCallback(callCount);
     }
 
@@ -293,12 +220,8 @@
      */
     public int getCreditCardUseCountForTesting(final String guid) throws InterruptedException,
             ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<Integer>() {
-            @Override
-            public Integer call() {
-                return PersonalDataManager.getInstance().getCreditCardUseCountForTesting(guid);
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().getCreditCardUseCountForTesting(guid));
     }
 
     /**
@@ -311,12 +234,8 @@
      */
     public long getCreditCardUseDateForTesting(final String guid) throws InterruptedException,
             ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<Long>() {
-            @Override
-            public Long call() {
-                return PersonalDataManager.getInstance().getCreditCardUseDateForTesting(guid);
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().getCreditCardUseDateForTesting(guid));
     }
 
     /**
@@ -327,29 +246,16 @@
      *         For more details see the comment header in time.h.
      */
     public long getCurrentDateForTesting() throws InterruptedException, ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<Long>() {
-            @Override
-            public Long call() {
-                return PersonalDataManager.getInstance().getCurrentDateForTesting();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> PersonalDataManager.getInstance().getCurrentDateForTesting());
     }
 
     private void registerDataObserver() {
         try {
             int callCount = mOnPersonalDataChangedHelper.getCallCount();
-            boolean isDataLoaded = ThreadUtils.runOnUiThreadBlocking(new Callable<Boolean>() {
-                @Override
-                public Boolean call() {
-                    return PersonalDataManager.getInstance().registerDataObserver(
-                            new PersonalDataManagerObserver() {
-                                @Override
-                                public void onPersonalDataChanged() {
-                                    mOnPersonalDataChangedHelper.notifyCalled();
-                                }
-                            });
-                }
-            });
+            boolean isDataLoaded = ThreadUtils.runOnUiThreadBlocking(
+                    () -> PersonalDataManager.getInstance().registerDataObserver(
+                            () -> mOnPersonalDataChangedHelper.notifyCalled()));
             if (isDataLoaded) return;
             mOnPersonalDataChangedHelper.waitForCallback(callCount);
         } catch (TimeoutException | InterruptedException | ExecutionException e) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
index f9d50e2..b7e33118 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
@@ -3113,7 +3113,7 @@
     @Test
     @SmallTest
     @Feature({"ContextualSearch"})
-    public void testLongPressHidesFindInPageOverlay() throws Exception {
+    public void testTriggeringContextualSearchHidesFindInPageOverlay() throws Exception {
         MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(),
                 mActivityTestRule.getActivity(), R.id.find_in_page_id);
 
@@ -3133,7 +3133,7 @@
         View findToolbar = mActivityTestRule.getActivity().findViewById(R.id.find_toolbar);
         Assert.assertTrue(findToolbar.isShown());
 
-        longPressNode("states");
+        simulateTapSearch("search");
 
         waitForPanelToPeek();
         Assert.assertFalse(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxTest.java
index dc4da257..8539873 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxTest.java
@@ -28,13 +28,13 @@
 
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.EnormousTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.ScalableTimeout;
 import org.chromium.base.test.util.parameter.CommandLineParameter;
+import org.chromium.base.test.util.parameter.SkipCommandLineParameterization;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeFeatureList;
@@ -597,8 +597,8 @@
      * Test to verify that the security icon is present when visiting http:// URLs.
      */
     @Test
-    //@MediumTest
-    @DisabledTest(message = "crbug.com/754723")
+    @MediumTest
+    @SkipCommandLineParameterization
     public void testSecurityIconOnHTTP() throws InterruptedException {
         EmbeddedTestServer testServer = EmbeddedTestServer.createAndStartServer(
                 InstrumentationRegistry.getInstrumentation().getContext());
@@ -613,8 +613,15 @@
                     (LocationBarLayout) mActivityTestRule.getActivity().findViewById(
                             R.id.location_bar);
             boolean securityIcon = locationBar.isSecurityButtonShown();
-            Assert.assertFalse("Omnibox should not have a Security icon", securityIcon);
-            Assert.assertFalse(securityButton.isShown());
+            if (DeviceFormFactor.isTablet()) {
+                Assert.assertTrue("Omnibox should have a Security icon", securityIcon);
+                Assert.assertTrue(securityButton.isShown());
+                Assert.assertEquals(
+                        R.drawable.omnibox_info, locationBar.getSecurityIconResourceId());
+            } else {
+                Assert.assertFalse("Omnibox should not have a Security icon", securityIcon);
+                Assert.assertFalse(securityButton.isShown());
+            }
         } finally {
             testServer.stopAndDestroyServer();
         }
@@ -625,6 +632,7 @@
      */
     @Test
     @MediumTest
+    @SkipCommandLineParameterization
     public void testSecurityIconOnHTTPS() throws InterruptedException {
         EmbeddedTestServer httpsTestServer = EmbeddedTestServer.createAndStartHTTPSServer(
                 InstrumentationRegistry.getInstrumentation().getContext(),
@@ -645,6 +653,8 @@
             Assert.assertEquals("security_button with wrong resource-id", R.id.security_button,
                     securityButton.getId());
             Assert.assertTrue(securityButton.isShown());
+            Assert.assertEquals(
+                    R.drawable.omnibox_https_valid, locationBar.getSecurityIconResourceId());
         } finally {
             httpsTestServer.stopAndDestroyServer();
         }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java
index f793e32..0318a131 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java
@@ -1077,15 +1077,10 @@
     }
 
     private void findApps(final Set<String> methodNames) throws Throwable {
-        mRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                AndroidPaymentAppFinder.find(
-                        mRule.getActivity().getCurrentContentViewCore().getWebContents(),
-                        methodNames, new PaymentManifestWebDataService(), mDownloader, mParser,
-                        mPackageManager, AndroidPaymentAppFinderTest.this);
-            }
-        });
+        mRule.runOnUiThread((Runnable) () -> AndroidPaymentAppFinder.find(
+                mRule.getActivity().getCurrentContentViewCore().getWebContents(),
+                methodNames, new PaymentManifestWebDataService(), mDownloader, mParser,
+                mPackageManager, AndroidPaymentAppFinderTest.this));
         CriteriaHelper.pollInstrumentationThread(new Criteria() {
             @Override
             public boolean isSatisfied() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestDownloaderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestDownloaderTest.java
index 55868a9..592e8283 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestDownloaderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestDownloaderTest.java
@@ -94,13 +94,10 @@
         mRule.startMainActivityOnBlankPage();
         mServer = EmbeddedTestServer.createAndStartServer(
                 InstrumentationRegistry.getInstrumentation().getContext());
-        mRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mDownloader.initialize(
-                        mRule.getActivity().getCurrentContentViewCore().getWebContents());
-                mDownloader.allowHttpForTest();
-            }
+        mRule.runOnUiThread((Runnable) () -> {
+            mDownloader.initialize(
+                    mRule.getActivity().getCurrentContentViewCore().getWebContents());
+            mDownloader.allowHttpForTest();
         });
         mDownloadComplete = false;
         mDownloadPaymentMethodManifestSuccess = false;
@@ -112,12 +109,7 @@
 
     @After
     public void tearDown() throws Throwable {
-        mRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mDownloader.destroy();
-            }
-        });
+        mRule.runOnUiThread((Runnable) () -> mDownloader.destroy());
         mServer.stopAndDestroyServer();
     }
 
@@ -126,12 +118,8 @@
     public void testDownloadWebAppManifest() throws Throwable {
         final URI uri =
                 new URI(mServer.getURL("/components/test/data/payments/bobpay.com/app.json"));
-        mRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mDownloader.downloadWebAppManifest(uri, PaymentManifestDownloaderTest.this);
-            }
-        });
+        mRule.runOnUiThread((Runnable) () -> mDownloader.downloadWebAppManifest(uri,
+                PaymentManifestDownloaderTest.this));
         CriteriaHelper.pollInstrumentationThread(new Criteria() {
             @Override
             public boolean isSatisfied() {
@@ -148,12 +136,8 @@
     @Feature({"Payments"})
     public void testUnableToDownloadWebAppManifest() throws Throwable {
         final URI uri = new URI(mServer.getURL("/no-such-app.json"));
-        mRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mDownloader.downloadWebAppManifest(uri, PaymentManifestDownloaderTest.this);
-            }
-        });
+        mRule.runOnUiThread((Runnable) () -> mDownloader.downloadWebAppManifest(uri,
+                PaymentManifestDownloaderTest.this));
         CriteriaHelper.pollInstrumentationThread(new Criteria() {
             @Override
             public boolean isSatisfied() {
@@ -168,12 +152,8 @@
     @Feature({"Payments"})
     public void testDownloadPaymentMethodManifest() throws Throwable {
         final URI uri = new URI(mServer.getURL("/components/test/data/payments/bobpay.com/webpay"));
-        mRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mDownloader.downloadPaymentMethodManifest(uri, PaymentManifestDownloaderTest.this);
-            }
-        });
+        mRule.runOnUiThread((Runnable) () -> mDownloader.downloadPaymentMethodManifest(uri,
+                PaymentManifestDownloaderTest.this));
         CriteriaHelper.pollInstrumentationThread(new Criteria() {
             @Override
             public boolean isSatisfied() {
@@ -190,12 +170,8 @@
     @Feature({"Payments"})
     public void testUnableToDownloadPaymentMethodManifest() throws Throwable {
         final URI uri = new URI(mServer.getURL("/no-such-payment-method-name"));
-        mRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mDownloader.downloadPaymentMethodManifest(uri, PaymentManifestDownloaderTest.this);
-            }
-        });
+        mRule.runOnUiThread((Runnable) () -> mDownloader.downloadPaymentMethodManifest(uri,
+                PaymentManifestDownloaderTest.this));
         CriteriaHelper.pollInstrumentationThread(new Criteria() {
             @Override
             public boolean isSatisfied() {
@@ -216,16 +192,13 @@
         final URI webAppUri1 = new URI(mServer.getURL("/no-such-app.json"));
         final URI webAppUri2 =
                 new URI(mServer.getURL("/components/test/data/payments/bobpay.com/app.json"));
-        mRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mDownloader.downloadPaymentMethodManifest(
-                        paymentMethodUri1, PaymentManifestDownloaderTest.this);
-                mDownloader.downloadPaymentMethodManifest(
-                        paymentMethodUri2, PaymentManifestDownloaderTest.this);
-                mDownloader.downloadWebAppManifest(webAppUri1, PaymentManifestDownloaderTest.this);
-                mDownloader.downloadWebAppManifest(webAppUri2, PaymentManifestDownloaderTest.this);
-            }
+        mRule.runOnUiThread((Runnable) () -> {
+            mDownloader.downloadPaymentMethodManifest(
+                    paymentMethodUri1, PaymentManifestDownloaderTest.this);
+            mDownloader.downloadPaymentMethodManifest(
+                    paymentMethodUri2, PaymentManifestDownloaderTest.this);
+            mDownloader.downloadWebAppManifest(webAppUri1, PaymentManifestDownloaderTest.this);
+            mDownloader.downloadWebAppManifest(webAppUri2, PaymentManifestDownloaderTest.this);
         });
         CriteriaHelper.pollInstrumentationThread(new Criteria() {
             @Override
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestParserTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestParserTest.java
index 2e41989..4116aa2f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestParserTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentManifestParserTest.java
@@ -70,12 +70,7 @@
     @Before
     public void setUp() throws Throwable {
         mRule.startMainActivityOnBlankPage();
-        mRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mParser.startUtilityProcess();
-            }
-        });
+        mRule.runOnUiThread((Runnable) () -> mParser.startUtilityProcess());
         mWebAppManifestUris = null;
         mSupportedOrigins = null;
         mAllOriginsSupported = false;
@@ -87,25 +82,15 @@
 
     @After
     public void tearDown() throws Throwable {
-        mRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mParser.stopUtilityProcess();
-            }
-        });
+        mRule.runOnUiThread((Runnable) () -> mParser.stopUtilityProcess());
     }
 
     @Test
     @MediumTest
     @Feature({"Payments"})
     public void testParseInvalidPaymentMethodManifest() throws Throwable {
-        mRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mParser.parsePaymentMethodManifest(
-                        "invalid payment method manifest", PaymentManifestParserTest.this);
-            }
-        });
+        mRule.runOnUiThread((Runnable) () -> mParser.parsePaymentMethodManifest(
+                "invalid payment method manifest", PaymentManifestParserTest.this));
         CriteriaHelper.pollInstrumentationThread(new Criteria() {
             @Override
             public boolean isSatisfied() {
@@ -118,22 +103,17 @@
     @MediumTest
     @Feature({"Payments"})
     public void testParsePaymentMethodManifest() throws Throwable {
-        mRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mParser.parsePaymentMethodManifest("{"
-                                + "  \"default_applications\": ["
-                                + "    \"https://bobpay.com/app.json\","
-                                + "    \"https://alicepay.com/app.json\""
-                                + "  ],"
-                                + "  \"supported_origins\": ["
-                                + "    \"https://charliepay.com\","
-                                + "    \"https://evepay.com\""
-                                + "  ]"
-                                + "}",
-                        PaymentManifestParserTest.this);
-            }
-        });
+        mRule.runOnUiThread((Runnable) () -> mParser.parsePaymentMethodManifest("{"
+                        + "  \"default_applications\": ["
+                        + "    \"https://bobpay.com/app.json\","
+                        + "    \"https://alicepay.com/app.json\""
+                        + "  ],"
+                        + "  \"supported_origins\": ["
+                        + "    \"https://charliepay.com\","
+                        + "    \"https://evepay.com\""
+                        + "  ]"
+                        + "}",
+                PaymentManifestParserTest.this));
         CriteriaHelper.pollInstrumentationThread(new Criteria() {
             @Override
             public boolean isSatisfied() {
@@ -155,13 +135,8 @@
     @MediumTest
     @Feature({"Payments"})
     public void testParsePaymentMethodManifestWithAllOriginsSupported() throws Throwable {
-        mRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mParser.parsePaymentMethodManifest(
-                        "{\"supported_origins\": \"*\"}", PaymentManifestParserTest.this);
-            }
-        });
+        mRule.runOnUiThread((Runnable) () -> mParser.parsePaymentMethodManifest(
+                "{\"supported_origins\": \"*\"}", PaymentManifestParserTest.this));
         CriteriaHelper.pollInstrumentationThread(new Criteria() {
             @Override
             public boolean isSatisfied() {
@@ -179,13 +154,8 @@
     @MediumTest
     @Feature({"Payments"})
     public void testParseInvalidWebAppManifest() throws Throwable {
-        mRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mParser.parseWebAppManifest(
-                        "invalid web app manifest", PaymentManifestParserTest.this);
-            }
-        });
+        mRule.runOnUiThread((Runnable) () -> mParser.parseWebAppManifest(
+                "invalid web app manifest", PaymentManifestParserTest.this));
         CriteriaHelper.pollInstrumentationThread(new Criteria() {
             @Override
             public boolean isSatisfied() {
@@ -198,26 +168,21 @@
     @MediumTest
     @Feature({"Payments"})
     public void testParseWebAppManifest() throws Throwable {
-        mRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mParser.parseWebAppManifest("{"
-                                + "  \"related_applications\": [{"
-                                + "    \"platform\": \"play\", "
-                                + "    \"id\": \"com.bobpay.app\", "
-                                + "    \"min_version\": \"1\", "
-                                + "    \"fingerprints\": [{"
-                                + "      \"type\": \"sha256_cert\", "
-                                + "      \"value\": \""
-                                + "00:01:02:03:04:05:06:07:08:09:"
-                                + "A0:A1:A2:A3:A4:A5:A6:A7:A8:A9:"
-                                + "B0:B1:B2:B3:B4:B5:B6:B7:B8:B9:C0:C1\""
-                                + "    }]"
-                                + "  }]"
-                                + "}",
-                        PaymentManifestParserTest.this);
-            }
-        });
+        mRule.runOnUiThread((Runnable) () -> mParser.parseWebAppManifest("{"
+                        + "  \"related_applications\": [{"
+                        + "    \"platform\": \"play\", "
+                        + "    \"id\": \"com.bobpay.app\", "
+                        + "    \"min_version\": \"1\", "
+                        + "    \"fingerprints\": [{"
+                        + "      \"type\": \"sha256_cert\", "
+                        + "      \"value\": \""
+                        + "00:01:02:03:04:05:06:07:08:09:"
+                        + "A0:A1:A2:A3:A4:A5:A6:A7:A8:A9:"
+                        + "B0:B1:B2:B3:B4:B5:B6:B7:B8:B9:C0:C1\""
+                        + "    }]"
+                        + "  }]"
+                        + "}",
+                PaymentManifestParserTest.this));
         CriteriaHelper.pollInstrumentationThread(new Criteria() {
             @Override
             public boolean isSatisfied() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java
index d79613c8..4f020bf 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java
@@ -68,17 +68,15 @@
 
         // Press the back button.
         int callCount = mPaymentRequestTestRule.getDismissed().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest().onBackPressed();
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest()
+                        .onBackPressed());
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
         mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
 
         // Make sure the canMakePayment events were logged correctly.
-        int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.CAN_MAKE_PAYMENT_FALSE;
+        int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.CAN_MAKE_PAYMENT_FALSE
+                | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -118,7 +116,8 @@
 
         // Make sure the canMakePayment events were logged correctly.
         int expectedSample = Event.SHOWN | Event.PAY_CLICKED | Event.RECEIVED_INSTRUMENT_DETAILS
-                | Event.COMPLETED | Event.CAN_MAKE_PAYMENT_FALSE;
+                | Event.COMPLETED | Event.CAN_MAKE_PAYMENT_FALSE | Event.REQUEST_METHOD_BASIC_CARD
+                | Event.REQUEST_METHOD_OTHER;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -147,7 +146,8 @@
 
         // Make sure the canMakePayment events were logged correctly.
         int expectedSample = Event.SHOWN | Event.OTHER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.CAN_MAKE_PAYMENT_TRUE;
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.CAN_MAKE_PAYMENT_TRUE
+                | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -175,7 +175,8 @@
         // Make sure the canMakePayment events were logged correctly.
         int expectedSample = Event.SHOWN | Event.PAY_CLICKED | Event.RECEIVED_INSTRUMENT_DETAILS
                 | Event.COMPLETED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.CAN_MAKE_PAYMENT_TRUE;
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.CAN_MAKE_PAYMENT_TRUE
+                | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -196,17 +197,15 @@
 
         // Press the back button.
         int callCount = mPaymentRequestTestRule.getDismissed().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest().onBackPressed();
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest()
+                        .onBackPressed());
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
         mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
 
         // Make sure no canMakePayment events were logged.
-        int expectedSample = Event.SHOWN | Event.USER_ABORTED;
+        int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_METHOD_BASIC_CARD
+                | Event.REQUEST_METHOD_OTHER;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -233,7 +232,8 @@
         // Make sure no canMakePayment events were logged.
         int expectedSample = Event.SHOWN | Event.PAY_CLICKED | Event.RECEIVED_INSTRUMENT_DETAILS
                 | Event.COMPLETED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS;
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_METHOD_BASIC_CARD
+                | Event.REQUEST_METHOD_OTHER;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCardEditorAutoAdvanceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCardEditorAutoAdvanceTest.java
index 54bf1ae..1c138d5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCardEditorAutoAdvanceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCardEditorAutoAdvanceTest.java
@@ -87,12 +87,7 @@
         Assert.assertTrue(mPaymentRequestTestRule.getCardEditorFocusedView() != focusedChildView);
 
         // Request focus to card number field after auto advancing above.
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                focusedChildView.requestFocus();
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking((Runnable) () -> focusedChildView.requestFocus());
         mPaymentRequestTestRule.setTextInCardEditorAndWait(
                 new String[] {"3056 9309 0259 041"}, mPaymentRequestTestRule.getEditorTextUpdate());
         Assert.assertTrue(mPaymentRequestTestRule.getCardEditorFocusedView() == focusedChildView);
@@ -127,12 +122,7 @@
         Assert.assertTrue(mPaymentRequestTestRule.getCardEditorFocusedView() != focusedChildView);
 
         // Request focus to card number field after auto advancing above.
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                focusedChildView.requestFocus();
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking((Runnable) () -> focusedChildView.requestFocus());
         mPaymentRequestTestRule.setTextInCardEditorAndWait(new String[] {"3782 822463 10005 1"},
                 mPaymentRequestTestRule.getEditorTextUpdate());
         Assert.assertTrue(mPaymentRequestTestRule.getCardEditorFocusedView() == focusedChildView);
@@ -177,12 +167,7 @@
         Assert.assertTrue(mPaymentRequestTestRule.getCardEditorFocusedView() != focusedChildView);
 
         // Request focus to card number field after auto advancing above.
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                focusedChildView.requestFocus();
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking((Runnable) () -> focusedChildView.requestFocus());
         mPaymentRequestTestRule.setTextInCardEditorAndWait(new String[] {"4012 8888 8888 1881 1"},
                 mPaymentRequestTestRule.getEditorTextUpdate());
         Assert.assertTrue(mPaymentRequestTestRule.getCardEditorFocusedView() == focusedChildView);
@@ -226,12 +211,7 @@
         Assert.assertTrue(mPaymentRequestTestRule.getCardEditorFocusedView() != focusedChildView);
 
         // Request focus to card number field after auto advancing above.
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                focusedChildView.requestFocus();
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking((Runnable) () -> focusedChildView.requestFocus());
         mPaymentRequestTestRule.setTextInCardEditorAndWait(
                 new String[] {"6212 3456 7890 0000 0031"},
                 mPaymentRequestTestRule.getEditorTextUpdate());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsAndFreeShippingTest.java
index a2138b2..ed619fff 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsAndFreeShippingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsAndFreeShippingTest.java
@@ -103,7 +103,8 @@
         int expectedSample = Event.SHOWN | Event.PAY_CLICKED | Event.RECEIVED_INSTRUMENT_DETAILS
                 | Event.COMPLETED | Event.HAD_INITIAL_FORM_OF_PAYMENT
                 | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_PAYER_PHONE
-                | Event.REQUEST_PAYER_EMAIL | Event.REQUEST_PAYER_NAME | Event.REQUEST_SHIPPING;
+                | Event.REQUEST_PAYER_EMAIL | Event.REQUEST_PAYER_NAME | Event.REQUEST_SHIPPING
+                | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java
index df69312..210f44f1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java
@@ -143,18 +143,15 @@
 
         // Quickly press on "add contact info" and then [X].
         int callCount = mPaymentRequestTestRule.getReadyToEdit().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getContactDetailsSectionForTest()
-                        .findViewById(R.id.payments_add_option_button)
-                        .performClick();
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getDialogForTest()
-                        .findViewById(R.id.close_button)
-                        .performClick();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getContactDetailsSectionForTest()
+                    .findViewById(R.id.payments_add_option_button)
+                    .performClick();
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getDialogForTest()
+                    .findViewById(R.id.close_button)
+                    .performClick();
         });
         mPaymentRequestTestRule.getReadyToEdit().waitForCallback(callCount);
 
@@ -177,18 +174,15 @@
 
         // Quickly press on [X] and then "add contact info."
         int callCount = mPaymentRequestTestRule.getDismissed().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getDialogForTest()
-                        .findViewById(R.id.close_button)
-                        .performClick();
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getContactDetailsSectionForTest()
-                        .findViewById(R.id.payments_add_option_button)
-                        .performClick();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getDialogForTest()
+                    .findViewById(R.id.close_button)
+                    .performClick();
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getContactDetailsSectionForTest()
+                    .findViewById(R.id.payments_add_option_button)
+                    .performClick();
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
@@ -249,18 +243,15 @@
 
         // Quickly press on "add contact info" and then "cancel."
         int callCount = mPaymentRequestTestRule.getReadyToEdit().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getContactDetailsSectionForTest()
-                        .findViewById(R.id.payments_add_option_button)
-                        .performClick();
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getDialogForTest()
-                        .findViewById(R.id.button_secondary)
-                        .performClick();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getContactDetailsSectionForTest()
+                    .findViewById(R.id.payments_add_option_button)
+                    .performClick();
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getDialogForTest()
+                    .findViewById(R.id.button_secondary)
+                    .performClick();
         });
         mPaymentRequestTestRule.getReadyToEdit().waitForCallback(callCount);
 
@@ -283,18 +274,15 @@
 
         // Quickly press on "cancel" and then "add contact info."
         int callCount = mPaymentRequestTestRule.getDismissed().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getDialogForTest()
-                        .findViewById(R.id.button_secondary)
-                        .performClick();
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getContactDetailsSectionForTest()
-                        .findViewById(R.id.payments_add_option_button)
-                        .performClick();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getDialogForTest()
+                    .findViewById(R.id.button_secondary)
+                    .performClick();
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getContactDetailsSectionForTest()
+                    .findViewById(R.id.payments_add_option_button)
+                    .performClick();
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
@@ -335,7 +323,8 @@
         int expectedSample = Event.SHOWN | Event.COMPLETED | Event.PAY_CLICKED
                 | Event.HAD_INITIAL_FORM_OF_PAYMENT | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS
                 | Event.RECEIVED_INSTRUMENT_DETAILS | Event.REQUEST_PAYER_EMAIL
-                | Event.REQUEST_PAYER_PHONE | Event.REQUEST_PAYER_NAME;
+                | Event.REQUEST_PAYER_PHONE | Event.REQUEST_PAYER_NAME
+                | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java
index a8cca016..3a60612 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java
@@ -229,18 +229,15 @@
 
         // Quickly press "add address" and then [X].
         int callCount = mPaymentRequestTestRule.getReadyToEdit().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getShippingAddressSectionForTest()
-                        .findViewById(R.id.payments_add_option_button)
-                        .performClick();
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getDialogForTest()
-                        .findViewById(R.id.close_button)
-                        .performClick();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getShippingAddressSectionForTest()
+                    .findViewById(R.id.payments_add_option_button)
+                    .performClick();
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getDialogForTest()
+                    .findViewById(R.id.close_button)
+                    .performClick();
         });
         mPaymentRequestTestRule.getReadyToEdit().waitForCallback(callCount);
 
@@ -263,18 +260,15 @@
 
         // Quickly press [X] and then "add address."
         int callCount = mPaymentRequestTestRule.getDismissed().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getDialogForTest()
-                        .findViewById(R.id.close_button)
-                        .performClick();
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getShippingAddressSectionForTest()
-                        .findViewById(R.id.payments_add_option_button)
-                        .performClick();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getDialogForTest()
+                    .findViewById(R.id.close_button)
+                    .performClick();
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getShippingAddressSectionForTest()
+                    .findViewById(R.id.payments_add_option_button)
+                    .performClick();
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
@@ -293,18 +287,15 @@
 
         // Quickly press "add address" and then "cancel."
         int callCount = mPaymentRequestTestRule.getReadyToEdit().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getShippingAddressSectionForTest()
-                        .findViewById(R.id.payments_add_option_button)
-                        .performClick();
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getDialogForTest()
-                        .findViewById(R.id.button_secondary)
-                        .performClick();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getShippingAddressSectionForTest()
+                    .findViewById(R.id.payments_add_option_button)
+                    .performClick();
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getDialogForTest()
+                    .findViewById(R.id.button_secondary)
+                    .performClick();
         });
         mPaymentRequestTestRule.getReadyToEdit().waitForCallback(callCount);
 
@@ -327,18 +318,15 @@
 
         // Quickly press on "cancel" and then "add address."
         int callCount = mPaymentRequestTestRule.getDismissed().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getDialogForTest()
-                        .findViewById(R.id.button_secondary)
-                        .performClick();
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getShippingAddressSectionForTest()
-                        .findViewById(R.id.payments_add_option_button)
-                        .performClick();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getDialogForTest()
+                    .findViewById(R.id.button_secondary)
+                    .performClick();
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getShippingAddressSectionForTest()
+                    .findViewById(R.id.payments_add_option_button)
+                    .performClick();
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java
index ea2454771..d356eaa 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java
@@ -89,7 +89,7 @@
 
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
                 | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_PAYER_EMAIL
-                | Event.REQUEST_SHIPPING;
+                | Event.REQUEST_SHIPPING | Event.REQUEST_METHOD_BASIC_CARD;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java
index 3a07cee..9d991b6 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java
@@ -161,7 +161,8 @@
 
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
                 | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_PAYER_EMAIL
-                | Event.REQUEST_PAYER_PHONE;
+                | Event.REQUEST_PAYER_PHONE | Event.REQUEST_METHOD_BASIC_CARD
+                | Event.REQUEST_METHOD_OTHER;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java
index 275e152..4fc1a0b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java
@@ -159,7 +159,8 @@
 
         int expectedSample = Event.SHOWN | Event.COMPLETED | Event.PAY_CLICKED
                 | Event.HAD_INITIAL_FORM_OF_PAYMENT | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS
-                | Event.RECEIVED_INSTRUMENT_DETAILS | Event.REQUEST_PAYER_EMAIL;
+                | Event.RECEIVED_INSTRUMENT_DETAILS | Event.REQUEST_PAYER_EMAIL
+                | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java
index 0973925..2677700 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java
@@ -169,18 +169,15 @@
 
         // Quickly press on "add address" and then [X].
         int callCount = mPaymentRequestTestRule.getReadyToEdit().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getShippingAddressSectionForTest()
-                        .findViewById(R.id.payments_add_option_button)
-                        .performClick();
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getDialogForTest()
-                        .findViewById(R.id.close_button)
-                        .performClick();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getShippingAddressSectionForTest()
+                    .findViewById(R.id.payments_add_option_button)
+                    .performClick();
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getDialogForTest()
+                    .findViewById(R.id.close_button)
+                    .performClick();
         });
         mPaymentRequestTestRule.getReadyToEdit().waitForCallback(callCount);
 
@@ -203,18 +200,15 @@
 
         // Quickly press on [X] and then "add address."
         int callCount = mPaymentRequestTestRule.getDismissed().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getDialogForTest()
-                        .findViewById(R.id.close_button)
-                        .performClick();
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getShippingAddressSectionForTest()
-                        .findViewById(R.id.payments_add_option_button)
-                        .performClick();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getDialogForTest()
+                    .findViewById(R.id.close_button)
+                    .performClick();
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getShippingAddressSectionForTest()
+                    .findViewById(R.id.payments_add_option_button)
+                    .performClick();
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
@@ -234,18 +228,15 @@
 
         // Quickly press on "add address" and then "cancel."
         int callCount = mPaymentRequestTestRule.getReadyToEdit().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getShippingAddressSectionForTest()
-                        .findViewById(R.id.payments_add_option_button)
-                        .performClick();
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getDialogForTest()
-                        .findViewById(R.id.button_secondary)
-                        .performClick();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getShippingAddressSectionForTest()
+                    .findViewById(R.id.payments_add_option_button)
+                    .performClick();
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getDialogForTest()
+                    .findViewById(R.id.button_secondary)
+                    .performClick();
         });
         mPaymentRequestTestRule.getReadyToEdit().waitForCallback(callCount);
 
@@ -268,18 +259,15 @@
 
         // Quickly press on "cancel" and then "add address."
         int callCount = mPaymentRequestTestRule.getDismissed().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getDialogForTest()
-                        .findViewById(R.id.button_secondary)
-                        .performClick();
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getShippingAddressSectionForTest()
-                        .findViewById(R.id.payments_add_option_button)
-                        .performClick();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getDialogForTest()
+                    .findViewById(R.id.button_secondary)
+                    .performClick();
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getShippingAddressSectionForTest()
+                    .findViewById(R.id.payments_add_option_button)
+                    .performClick();
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
@@ -302,7 +290,8 @@
         mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
 
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING;
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING
+                | Event.REQUEST_METHOD_BASIC_CARD;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java
index 774b983..d901f34 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java
@@ -578,7 +578,8 @@
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING;
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING
+                | Event.REQUEST_METHOD_BASIC_CARD;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -611,7 +612,7 @@
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.REQUEST_SHIPPING;
+                | Event.REQUEST_SHIPPING | Event.REQUEST_METHOD_BASIC_CARD;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -644,7 +645,7 @@
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.REQUEST_SHIPPING;
+                | Event.REQUEST_SHIPPING | Event.REQUEST_METHOD_BASIC_CARD;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -676,7 +677,8 @@
         mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
 
         // Make sure the events were logged correctly.
-        int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING;
+        int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING
+                | Event.REQUEST_METHOD_BASIC_CARD;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -706,7 +708,8 @@
         mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
 
         // Make sure the events were logged correctly.
-        int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING;
+        int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING
+                | Event.REQUEST_METHOD_BASIC_CARD;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -736,7 +739,8 @@
         mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
 
         // Make sure the events were logged correctly.
-        int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING;
+        int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING
+                | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -767,7 +771,8 @@
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING;
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING
+                | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -800,7 +805,8 @@
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.REQUEST_SHIPPING;
+                | Event.REQUEST_SHIPPING | Event.REQUEST_METHOD_BASIC_CARD
+                | Event.REQUEST_METHOD_OTHER;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -834,7 +840,8 @@
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING;
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING
+                | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -866,7 +873,8 @@
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING;
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING
+                | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -901,7 +909,8 @@
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING;
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING
+                | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -930,7 +939,8 @@
         mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
 
         // Make sure the events were logged correctly.
-        int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING;
+        int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.REQUEST_SHIPPING
+                | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -1030,10 +1040,20 @@
         Assert.assertEquals(2,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.NumberOfSelectionEdits.ShippingAddress.Completed", 0));
+
+        // Make sure the events were logged correctly.
+        int expectedSample = Event.SHOWN | Event.COMPLETED | Event.REQUEST_SHIPPING
+                | Event.REQUEST_METHOD_BASIC_CARD | Event.HAD_INITIAL_FORM_OF_PAYMENT
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.RECEIVED_INSTRUMENT_DETAILS
+                | Event.PAY_CLICKED;
+        Assert.assertEquals(2,
+                RecordHistogram.getHistogramValueCountForTesting(
+                        "PaymentRequest.Events", expectedSample));
     }
 
     /**
-     * Expect that no journey metrics are logged if the payment request was not shown to the user.
+     * Expect that only some journey metrics are logged if the payment request was not shown to the
+     * user.
      */
     @Test
     @MediumTest
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java
index 1021786e..ccfea79 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java
@@ -90,7 +90,8 @@
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.PAY_CLICKED | Event.RECEIVED_INSTRUMENT_DETAILS
                 | Event.COMPLETED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING;
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING
+                | Event.REQUEST_METHOD_BASIC_CARD;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -112,15 +113,11 @@
 
         // Cancel the Payment Request.
         int callCount = mPaymentRequestTestRule.getDismissed().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI()
+        ThreadUtils.runOnUiThreadBlocking(
+                (Runnable) () -> mPaymentRequestTestRule.getPaymentRequestUI()
                         .getDialogForTest()
                         .findViewById(R.id.button_secondary)
-                        .performClick();
-            }
-        });
+                        .performClick());
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
         mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
 
@@ -128,7 +125,8 @@
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING;
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING
+                | Event.REQUEST_METHOD_BASIC_CARD;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -157,7 +155,8 @@
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING;
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING
+                | Event.REQUEST_METHOD_BASIC_CARD;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -179,12 +178,9 @@
 
         // Press the back button.
         int callCount = mPaymentRequestTestRule.getDismissed().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest().onBackPressed();
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest()
+                        .onBackPressed());
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
         mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
 
@@ -192,7 +188,8 @@
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING;
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING
+                | Event.REQUEST_METHOD_BASIC_CARD;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -221,7 +218,8 @@
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.OTHER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING;
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING
+                | Event.REQUEST_METHOD_BASIC_CARD;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -248,7 +246,8 @@
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.OTHER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING;
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING
+                | Event.REQUEST_METHOD_BASIC_CARD;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -382,7 +381,8 @@
         // Make sure the events were logged correctly.
         int expectedSample = Event.SKIPPED_SHOW | Event.PAY_CLICKED
                 | Event.RECEIVED_INSTRUMENT_DETAILS | Event.COMPLETED
-                | Event.HAD_INITIAL_FORM_OF_PAYMENT | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS;
+                | Event.HAD_INITIAL_FORM_OF_PAYMENT | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS
+                | Event.REQUEST_METHOD_GOOGLE;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -412,7 +412,7 @@
 
         // Make sure the events were logged correctly.
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS;
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_METHOD_GOOGLE;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
@@ -447,9 +447,12 @@
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
         mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
 
-        // Make sure only one set of events was logged.
-        Assert.assertEquals(
-                1, RecordHistogram.getHistogramTotalCountForTesting("PaymentRequest.Events"));
+        // Make sure the events were logged correctly.
+        int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_METHOD_BASIC_CARD;
+        Assert.assertEquals(1,
+                RecordHistogram.getHistogramValueCountForTesting(
+                        "PaymentRequest.Events", expectedSample));
     }
 
     /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java
index 7bd2ab2..bfe8611 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java
@@ -89,7 +89,7 @@
 
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
                 | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_SHIPPING
-                | Event.REQUEST_PAYER_NAME;
+                | Event.REQUEST_PAYER_NAME | Event.REQUEST_METHOD_BASIC_CARD;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java
index 469b9ed8..ed0c70f0a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java
@@ -171,7 +171,8 @@
 
         int expectedSample = Event.SHOWN | Event.PAY_CLICKED | Event.RECEIVED_INSTRUMENT_DETAILS
                 | Event.COMPLETED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_PAYER_NAME;
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_PAYER_NAME
+                | Event.REQUEST_METHOD_BASIC_CARD;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java
index 6c55b0db..4c5e7463bd 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java
@@ -283,18 +283,15 @@
 
         // Quickly press on "add card" and then [X].
         int callCount = mPaymentRequestTestRule.getReadyToEdit().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getPaymentMethodSectionForTest()
-                        .findViewById(R.id.payments_add_option_button)
-                        .performClick();
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getDialogForTest()
-                        .findViewById(R.id.close_button)
-                        .performClick();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getPaymentMethodSectionForTest()
+                    .findViewById(R.id.payments_add_option_button)
+                    .performClick();
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getDialogForTest()
+                    .findViewById(R.id.close_button)
+                    .performClick();
         });
         mPaymentRequestTestRule.getReadyToEdit().waitForCallback(callCount);
 
@@ -317,18 +314,15 @@
 
         // Quickly press on [X] and then "add card."
         int callCount = mPaymentRequestTestRule.getDismissed().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getDialogForTest()
-                        .findViewById(R.id.close_button)
-                        .performClick();
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getPaymentMethodSectionForTest()
-                        .findViewById(R.id.payments_add_option_button)
-                        .performClick();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getDialogForTest()
+                    .findViewById(R.id.close_button)
+                    .performClick();
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getPaymentMethodSectionForTest()
+                    .findViewById(R.id.payments_add_option_button)
+                    .performClick();
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
@@ -347,18 +341,15 @@
 
         // Quickly press on "add card" and then "cancel."
         int callCount = mPaymentRequestTestRule.getReadyToEdit().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getPaymentMethodSectionForTest()
-                        .findViewById(R.id.payments_add_option_button)
-                        .performClick();
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getDialogForTest()
-                        .findViewById(R.id.button_secondary)
-                        .performClick();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getPaymentMethodSectionForTest()
+                    .findViewById(R.id.payments_add_option_button)
+                    .performClick();
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getDialogForTest()
+                    .findViewById(R.id.button_secondary)
+                    .performClick();
         });
         mPaymentRequestTestRule.getReadyToEdit().waitForCallback(callCount);
 
@@ -381,18 +372,15 @@
 
         // Quickly press on "cancel" and then "add card."
         int callCount = mPaymentRequestTestRule.getDismissed().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getDialogForTest()
-                        .findViewById(R.id.button_secondary)
-                        .performClick();
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getPaymentMethodSectionForTest()
-                        .findViewById(R.id.payments_add_option_button)
-                        .performClick();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getDialogForTest()
+                    .findViewById(R.id.button_secondary)
+                    .performClick();
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getPaymentMethodSectionForTest()
+                    .findViewById(R.id.payments_add_option_button)
+                    .performClick();
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
@@ -412,15 +400,12 @@
 
         // Quickly dismiss and then press on "pay."
         int callCount = mPaymentRequestTestRule.getDismissed().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest().onBackPressed();
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getDialogForTest()
-                        .findViewById(R.id.button_primary)
-                        .performClick();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest().onBackPressed();
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getDialogForTest()
+                    .findViewById(R.id.button_primary)
+                    .performClick();
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
@@ -440,15 +425,12 @@
 
         // Quickly dismiss and then press on [X].
         int callCount = mPaymentRequestTestRule.getDismissed().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest().onBackPressed();
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getDialogForTest()
-                        .findViewById(R.id.close_button)
-                        .performClick();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest().onBackPressed();
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getDialogForTest()
+                    .findViewById(R.id.close_button)
+                    .performClick();
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
@@ -468,15 +450,12 @@
 
         // Quickly press on [X] and then dismiss.
         int callCount = mPaymentRequestTestRule.getDismissed().getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getPaymentRequestUI()
-                        .getDialogForTest()
-                        .findViewById(R.id.close_button)
-                        .performClick();
-                mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest().onBackPressed();
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mPaymentRequestTestRule.getPaymentRequestUI()
+                    .getDialogForTest()
+                    .findViewById(R.id.close_button)
+                    .performClick();
+            mPaymentRequestTestRule.getPaymentRequestUI().getDialogForTest().onBackPressed();
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(callCount);
 
@@ -500,7 +479,7 @@
         mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
 
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS;
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_METHOD_BASIC_CARD;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java
index 556da561..afa071a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java
@@ -21,14 +21,10 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.payments.PaymentAppFactory.PaymentAppCreatedCallback;
-import org.chromium.chrome.browser.payments.PaymentAppFactory.PaymentAppFactoryAddition;
 import org.chromium.chrome.browser.payments.PaymentRequestTestCommon.TestPay;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
-import org.chromium.content_public.browser.WebContents;
 
-import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeoutException;
 
@@ -96,23 +92,15 @@
     public void testPaymentWithInstrumentsAppResponseAfterDismissShouldNotCrash()
             throws InterruptedException, ExecutionException, TimeoutException {
         final TestPay app = new TestPay("https://bobpay.com", HAVE_INSTRUMENTS, IMMEDIATE_RESPONSE);
-        PaymentAppFactory.getInstance().addAdditionalFactory(new PaymentAppFactoryAddition() {
-            @Override
-            public void create(WebContents webContents, Set<String> methodNames,
-                    PaymentAppFactory.PaymentAppCreatedCallback callback) {
-                callback.onPaymentAppCreated(app);
-                callback.onAllPaymentAppsCreated();
-            }
-        });
+        PaymentAppFactory.getInstance().addAdditionalFactory(
+                (webContents, methodNames, callback) -> {
+                    callback.onPaymentAppCreated(app);
+                    callback.onAllPaymentAppsCreated();
+                });
         mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput());
         mPaymentRequestTestRule.clickAndWait(
                 R.id.close_button, mPaymentRequestTestRule.getDismissed());
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                app.respond();
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(() -> app.respond());
         mPaymentRequestTestRule.expectResultContains(
                 new String[] {"show() rejected", "Request cancelled"});
     }
@@ -126,21 +114,13 @@
     public void testPaymentAppNoInstrumentsResponseAfterDismissShouldNotCrash()
             throws InterruptedException, ExecutionException, TimeoutException {
         final TestPay app = new TestPay("https://bobpay.com", NO_INSTRUMENTS, IMMEDIATE_RESPONSE);
-        PaymentAppFactory.getInstance().addAdditionalFactory(new PaymentAppFactoryAddition() {
-            @Override
-            public void create(WebContents webContents, Set<String> methodNames,
-                    PaymentAppCreatedCallback callback) {
-                callback.onPaymentAppCreated(app);
-                callback.onAllPaymentAppsCreated();
-            }
-        });
+        PaymentAppFactory.getInstance().addAdditionalFactory(
+                (webContents, methodNames, callback) -> {
+                    callback.onPaymentAppCreated(app);
+                    callback.onAllPaymentAppsCreated();
+                });
         mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getShowFailed());
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                app.respond();
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(() -> app.respond());
         mPaymentRequestTestRule.expectResultContains(
                 new String[] {"show() rejected", "The payment method is not supported"});
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppsSortingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppsSortingTest.java
index 54ea441..61e2038 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppsSortingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppsSortingTest.java
@@ -22,15 +22,11 @@
 import org.chromium.chrome.browser.autofill.CardType;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
-import org.chromium.chrome.browser.payments.PaymentAppFactory.PaymentAppCreatedCallback;
-import org.chromium.chrome.browser.payments.PaymentAppFactory.PaymentAppFactoryAddition;
 import org.chromium.chrome.browser.payments.PaymentRequestTestCommon.TestPay;
 import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
-import org.chromium.content_public.browser.WebContents;
 
-import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeoutException;
 
@@ -72,16 +68,13 @@
                 new TestPay("https://bobpay.com", HAVE_INSTRUMENTS, IMMEDIATE_RESPONSE);
         final TestPay appC =
                 new TestPay("https://charliepay.com", HAVE_INSTRUMENTS, IMMEDIATE_RESPONSE);
-        PaymentAppFactory.getInstance().addAdditionalFactory(new PaymentAppFactoryAddition() {
-            @Override
-            public void create(WebContents webContents, Set<String> methodNames,
-                    PaymentAppCreatedCallback callback) {
-                callback.onPaymentAppCreated(appA);
-                callback.onPaymentAppCreated(appB);
-                callback.onPaymentAppCreated(appC);
-                callback.onAllPaymentAppsCreated();
-            }
-        });
+        PaymentAppFactory.getInstance().addAdditionalFactory(
+                (webContents, methodNames, callback) -> {
+                    callback.onPaymentAppCreated(appA);
+                    callback.onPaymentAppCreated(appB);
+                    callback.onPaymentAppCreated(appC);
+                    callback.onAllPaymentAppsCreated();
+                });
         String alicePayId = appA.getAppIdentifier() + "https://alicepay.com";
         String bobPayId = appB.getAppIdentifier() + "https://bobpay.com";
         String charliePayId = appC.getAppIdentifier() + "https://charliepay.com";
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneAndFreeShippingTest.java
index 1fe1867..de300066e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneAndFreeShippingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneAndFreeShippingTest.java
@@ -96,7 +96,7 @@
         int expectedSample = Event.SHOWN | Event.PAY_CLICKED | Event.RECEIVED_INSTRUMENT_DETAILS
                 | Event.COMPLETED | Event.HAD_INITIAL_FORM_OF_PAYMENT
                 | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_PAYER_PHONE
-                | Event.REQUEST_SHIPPING;
+                | Event.REQUEST_SHIPPING | Event.REQUEST_METHOD_BASIC_CARD;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java
index a49b0384..cee5599 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java
@@ -158,7 +158,8 @@
         mPaymentRequestTestRule.expectResultContains(new String[] {"Request cancelled"});
 
         int expectedSample = Event.SHOWN | Event.USER_ABORTED | Event.HAD_INITIAL_FORM_OF_PAYMENT
-                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_PAYER_PHONE;
+                | Event.HAD_NECESSARY_COMPLETE_SUGGESTIONS | Event.REQUEST_PAYER_PHONE
+                | Event.REQUEST_METHOD_BASIC_CARD | Event.REQUEST_METHOD_OTHER;
         Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         "PaymentRequest.Events", expectedSample));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java
index 97b9a03..59addaa9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java
@@ -15,9 +15,7 @@
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
-import org.chromium.content_public.browser.WebContents;
 
-import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeoutException;
 
@@ -41,19 +39,15 @@
      */
     private void installMockServiceWorkerPaymentApp(final boolean hasSupportedMethods) {
         PaymentAppFactory.getInstance().addAdditionalFactory(
-                new PaymentAppFactory.PaymentAppFactoryAddition() {
-                    @Override
-                    public void create(WebContents webContents, Set<String> methodNames,
-                            PaymentAppFactory.PaymentAppCreatedCallback callback) {
-                        String[] supportedMethodNames = {"https://bobpay.com", "basic-card"};
-                        callback.onPaymentAppCreated(new ServiceWorkerPaymentApp(webContents,
-                                0 /* registrationId */, "BobPay" /* label */,
-                                "https://bobpay.com" /* sublabel */, null /* icon */,
-                                hasSupportedMethods ? supportedMethodNames
-                                                    : new String[0] /* methodNames */,
-                                new String[0] /* preferredRelatedApplicationIds */));
-                        callback.onAllPaymentAppsCreated();
-                    }
+                (webContents, methodNames, callback) -> {
+                    String[] supportedMethodNames = {"https://bobpay.com", "basic-card"};
+                    callback.onPaymentAppCreated(new ServiceWorkerPaymentApp(webContents,
+                            0 /* registrationId */, "BobPay" /* label */,
+                            "https://bobpay.com" /* sublabel */, null /* icon */,
+                            hasSupportedMethods ? supportedMethodNames
+                                    : new String[0] /* methodNames */,
+                            new String[0] /* preferredRelatedApplicationIds */));
+                    callback.onAllPaymentAppsCreated();
                 });
     }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTabTest.java
index b51c625e..3dae6f24 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTabTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTabTest.java
@@ -66,13 +66,10 @@
             throws InterruptedException, ExecutionException, TimeoutException {
         mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput());
         Assert.assertEquals(0, mPaymentRequestTestRule.getDismissed().getCallCount());
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mPaymentRequestTestRule.getActivity().getTabCreator(false).createNewTab(
-                        new LoadUrlParams("about:blank"), TabLaunchType.FROM_CHROME_UI, null);
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                (Runnable) () -> mPaymentRequestTestRule.getActivity().getTabCreator(
+                        false).createNewTab(
+                        new LoadUrlParams("about:blank"), TabLaunchType.FROM_CHROME_UI, null));
         mPaymentRequestTestRule.getDismissed().waitForCallback(0);
     }
 
@@ -86,12 +83,9 @@
             throws InterruptedException, ExecutionException, TimeoutException {
         mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput());
         Assert.assertEquals(0, mPaymentRequestTestRule.getDismissed().getCallCount());
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                TabModel currentModel = mPaymentRequestTestRule.getActivity().getCurrentTabModel();
-                TabModelUtils.closeCurrentTab(currentModel);
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            TabModel currentModel = mPaymentRequestTestRule.getActivity().getCurrentTabModel();
+            TabModelUtils.closeCurrentTab(currentModel);
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(0);
     }
@@ -104,12 +98,9 @@
             throws InterruptedException, ExecutionException, TimeoutException {
         mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput());
         Assert.assertEquals(0, mPaymentRequestTestRule.getDismissed().getCallCount());
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                TabModel currentModel = mPaymentRequestTestRule.getActivity().getCurrentTabModel();
-                TabModelUtils.getCurrentTab(currentModel).loadUrl(new LoadUrlParams("about:blank"));
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            TabModel currentModel = mPaymentRequestTestRule.getActivity().getCurrentTabModel();
+            TabModelUtils.getCurrentTab(currentModel).loadUrl(new LoadUrlParams("about:blank"));
         });
         mPaymentRequestTestRule.getDismissed().waitForCallback(0);
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestCommon.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestCommon.java
index 112218e..7e2d48ae 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestCommon.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestCommon.java
@@ -23,7 +23,6 @@
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.autofill.CardUnmaskPrompt;
 import org.chromium.chrome.browser.autofill.CardUnmaskPrompt.CardUnmaskObserverForTest;
-import org.chromium.chrome.browser.payments.PaymentAppFactory.PaymentAppFactoryAddition;
 import org.chromium.chrome.browser.payments.PaymentRequestImpl.PaymentRequestServiceObserverForTest;
 import org.chromium.chrome.browser.payments.ui.EditorTextField;
 import org.chromium.chrome.browser.payments.ui.PaymentRequestSection.OptionSection;
@@ -141,15 +140,12 @@
 
     private void openPage() throws InterruptedException, ExecutionException, TimeoutException {
         mCallback.onMainActivityStarted();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mViewCoreRef.set(mCallback.getActivity().getCurrentContentViewCore());
-                mWebContentsRef.set(mViewCoreRef.get().getWebContents());
-                PaymentRequestUI.setObserverForTest(PaymentRequestTestCommon.this);
-                PaymentRequestImpl.setObserverForTest(PaymentRequestTestCommon.this);
-                CardUnmaskPrompt.setObserverForTest(PaymentRequestTestCommon.this);
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mViewCoreRef.set(mCallback.getActivity().getCurrentContentViewCore());
+            mWebContentsRef.set(mViewCoreRef.get().getWebContents());
+            PaymentRequestUI.setObserverForTest(PaymentRequestTestCommon.this);
+            PaymentRequestImpl.setObserverForTest(PaymentRequestTestCommon.this);
+            CardUnmaskPrompt.setObserverForTest(PaymentRequestTestCommon.this);
         });
         mCallback.assertWaitForPageScaleFactorMatch(1);
     }
@@ -200,86 +196,62 @@
     protected void clickAndWait(final int resourceId, CallbackHelper helper)
             throws InterruptedException, TimeoutException {
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mUI.getDialogForTest().findViewById(resourceId).performClick();
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                (Runnable) () -> mUI.getDialogForTest().findViewById(resourceId).performClick());
         helper.waitForCallback(callCount);
     }
 
     protected void clickInShippingAddressAndWait(final int resourceId, CallbackHelper helper)
             throws InterruptedException, TimeoutException {
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mUI.getShippingAddressSectionForTest().findViewById(resourceId).performClick();
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                (Runnable) () -> mUI.getShippingAddressSectionForTest().findViewById(
+                        resourceId).performClick());
         helper.waitForCallback(callCount);
     }
 
     protected void clickInPaymentMethodAndWait(final int resourceId, CallbackHelper helper)
             throws InterruptedException, TimeoutException {
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mUI.getPaymentMethodSectionForTest().findViewById(resourceId).performClick();
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                (Runnable) () -> mUI.getPaymentMethodSectionForTest().findViewById(
+                        resourceId).performClick());
         helper.waitForCallback(callCount);
     }
 
     protected void clickInContactInfoAndWait(final int resourceId, CallbackHelper helper)
             throws InterruptedException, TimeoutException {
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mUI.getContactDetailsSectionForTest().findViewById(resourceId).performClick();
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                (Runnable) () -> mUI.getContactDetailsSectionForTest().findViewById(
+                        resourceId).performClick());
         helper.waitForCallback(callCount);
     }
 
     protected void clickInCardEditorAndWait(final int resourceId, CallbackHelper helper)
             throws InterruptedException, TimeoutException {
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mUI.getCardEditorDialog().findViewById(resourceId).performClick();
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                (Runnable) () -> mUI.getCardEditorDialog().findViewById(resourceId).performClick());
         helper.waitForCallback(callCount);
     }
 
     protected void clickInEditorAndWait(final int resourceId, CallbackHelper helper)
             throws InterruptedException, TimeoutException {
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mUI.getEditorDialog().findViewById(resourceId).performClick();
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                (Runnable) () -> mUI.getEditorDialog().findViewById(resourceId).performClick());
         helper.waitForCallback(callCount);
     }
 
     protected void clickAndroidBackButtonInEditorAndWait(CallbackHelper helper)
             throws InterruptedException, TimeoutException {
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mUI.getEditorDialog().dispatchKeyEvent(
-                        new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
-                mUI.getEditorDialog().dispatchKeyEvent(
-                        new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK));
-            }
+        ThreadUtils.runOnUiThread(() -> {
+            mUI.getEditorDialog().dispatchKeyEvent(
+                    new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
+            mUI.getEditorDialog().dispatchKeyEvent(
+                    new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK));
         });
         helper.waitForCallback(callCount);
     }
@@ -287,152 +259,98 @@
     protected void clickCardUnmaskButtonAndWait(final int dialogButtonId, CallbackHelper helper)
             throws InterruptedException, TimeoutException {
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                mCardUnmaskPrompt.getDialogForTest().getButton(dialogButtonId).performClick();
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(
+                (Runnable) () -> mCardUnmaskPrompt.getDialogForTest().getButton(
+                        dialogButtonId).performClick());
         helper.waitForCallback(callCount);
     }
 
     protected int getShippingAddressSectionButtonState() throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<Integer>() {
-            @Override
-            public Integer call() {
-                return mUI.getShippingAddressSectionForTest().getEditButtonState();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> mUI.getShippingAddressSectionForTest().getEditButtonState());
     }
 
     protected int getContactDetailsButtonState() throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<Integer>() {
-            @Override
-            public Integer call() {
-                return mUI.getContactDetailsSectionForTest().getEditButtonState();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> mUI.getContactDetailsSectionForTest().getEditButtonState());
     }
 
     protected String getPaymentInstrumentLabel(final int index) throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() {
-            @Override
-            public String call() {
-                return ((OptionSection) mUI.getPaymentMethodSectionForTest())
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> ((OptionSection) mUI.getPaymentMethodSectionForTest())
                         .getOptionLabelsForTest(index)
                         .getText()
-                        .toString();
-            }
-        });
+                        .toString());
     }
 
     protected String getSelectedPaymentInstrumentLabel() throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() {
-            @Override
-            public String call() {
-                OptionSection section = ((OptionSection) mUI.getPaymentMethodSectionForTest());
-                int size = section.getNumberOfOptionLabelsForTest();
-                for (int i = 0; i < size; i++) {
-                    if (section.getOptionRowAtIndex(i).isChecked()) {
-                        return section.getOptionRowAtIndex(i).getLabelText().toString();
-                    }
+        return ThreadUtils.runOnUiThreadBlocking(() -> {
+            OptionSection section = ((OptionSection) mUI.getPaymentMethodSectionForTest());
+            int size = section.getNumberOfOptionLabelsForTest();
+            for (int i = 0; i < size; i++) {
+                if (section.getOptionRowAtIndex(i).isChecked()) {
+                    return section.getOptionRowAtIndex(i).getLabelText().toString();
                 }
-                return null;
             }
+            return null;
         });
     }
 
     protected String getOrderSummaryTotal() throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() {
-            @Override
-            public String call() {
-                return mUI.getOrderSummaryTotalTextViewForTest().getText().toString();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> mUI.getOrderSummaryTotalTextViewForTest().getText().toString());
     }
 
     protected String getContactDetailsSuggestionLabel(final int suggestionIndex)
             throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() {
-            @Override
-            public String call() {
-                return ((OptionSection) mUI.getContactDetailsSectionForTest())
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> ((OptionSection) mUI.getContactDetailsSectionForTest())
                         .getOptionLabelsForTest(suggestionIndex)
                         .getText()
-                        .toString();
-            }
-        });
+                        .toString());
     }
 
     protected int getNumberOfPaymentInstruments() throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<Integer>() {
-            @Override
-            public Integer call() {
-                return ((OptionSection) mUI.getPaymentMethodSectionForTest())
-                        .getNumberOfOptionLabelsForTest();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> ((OptionSection) mUI.getPaymentMethodSectionForTest())
+                        .getNumberOfOptionLabelsForTest());
     }
 
     protected int getNumberOfContactDetailSuggestions() throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<Integer>() {
-            @Override
-            public Integer call() {
-                return ((OptionSection) mUI.getContactDetailsSectionForTest())
-                        .getNumberOfOptionLabelsForTest();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> ((OptionSection) mUI.getContactDetailsSectionForTest())
+                        .getNumberOfOptionLabelsForTest());
     }
 
     protected String getShippingAddressSuggestionLabel(final int suggestionIndex)
             throws ExecutionException {
         Assert.assertTrue(suggestionIndex < getNumberOfShippingAddressSuggestions());
 
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() {
-            @Override
-            public String call() {
-                return mUI.getShippingAddressSectionForTest()
-                        .getOptionLabelsForTest(suggestionIndex)
-                        .getText()
-                        .toString();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(() -> mUI.getShippingAddressSectionForTest()
+                .getOptionLabelsForTest(suggestionIndex)
+                .getText()
+                .toString());
     }
 
     protected String getShippingAddressSummary() throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() {
-            @Override
-            public String call() {
-                return mUI.getShippingAddressSectionForTest()
-                        .getLeftSummaryLabelForTest()
-                        .getText()
-                        .toString();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(() -> mUI.getShippingAddressSectionForTest()
+                .getLeftSummaryLabelForTest()
+                .getText()
+                .toString());
     }
 
     protected String getShippingOptionSummary() throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() {
-            @Override
-            public String call() {
-                return mUI.getShippingOptionSectionForTest()
-                        .getLeftSummaryLabelForTest()
-                        .getText()
-                        .toString();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(() -> mUI.getShippingOptionSectionForTest()
+                .getLeftSummaryLabelForTest()
+                .getText()
+                .toString());
     }
 
     protected String getShippingOptionCostSummaryOnBottomSheet() throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() {
-            @Override
-            public String call() {
-                return mUI.getShippingOptionSectionForTest()
-                        .getRightSummaryLabelForTest()
-                        .getText()
-                        .toString();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(() -> mUI.getShippingOptionSectionForTest()
+                .getRightSummaryLabelForTest()
+                .getText()
+                .toString());
     }
 
     protected View getCardEditorFocusedView() {
@@ -445,14 +363,10 @@
         Assert.assertTrue(suggestionIndex < getNumberOfShippingAddressSuggestions());
 
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                ((OptionSection) mUI.getShippingAddressSectionForTest())
+        ThreadUtils.runOnUiThreadBlocking(
+                (Runnable) () -> ((OptionSection) mUI.getShippingAddressSectionForTest())
                         .getOptionLabelsForTest(suggestionIndex)
-                        .performClick();
-            }
-        });
+                        .performClick());
         helper.waitForCallback(callCount);
     }
 
@@ -462,14 +376,10 @@
         Assert.assertTrue(suggestionIndex < getNumberOfPaymentInstruments());
 
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                ((OptionSection) mUI.getPaymentMethodSectionForTest())
+        ThreadUtils.runOnUiThreadBlocking(
+                (Runnable) () -> ((OptionSection) mUI.getPaymentMethodSectionForTest())
                         .getOptionLabelsForTest(suggestionIndex)
-                        .performClick();
-            }
-        });
+                        .performClick());
         helper.waitForCallback(callCount);
     }
 
@@ -479,14 +389,10 @@
         Assert.assertTrue(suggestionIndex < getNumberOfContactDetailSuggestions());
 
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                ((OptionSection) mUI.getContactDetailsSectionForTest())
+        ThreadUtils.runOnUiThreadBlocking(
+                (Runnable) () -> ((OptionSection) mUI.getContactDetailsSectionForTest())
                         .getOptionLabelsForTest(suggestionIndex)
-                        .performClick();
-            }
-        });
+                        .performClick());
         helper.waitForCallback(callCount);
     }
 
@@ -496,78 +402,51 @@
         Assert.assertTrue(suggestionIndex < getNumberOfPaymentInstruments());
 
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                ((OptionSection) mUI.getPaymentMethodSectionForTest())
+        ThreadUtils.runOnUiThreadBlocking(
+                (Runnable) () -> ((OptionSection) mUI.getPaymentMethodSectionForTest())
                         .getOptionRowAtIndex(suggestionIndex)
                         .getEditIconForTest()
-                        .performClick();
-            }
-        });
+                        .performClick());
         helper.waitForCallback(callCount);
     }
 
     protected int getNumberOfShippingAddressSuggestions() throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<Integer>() {
-            @Override
-            public Integer call() {
-                return ((OptionSection) mUI.getShippingAddressSectionForTest())
-                        .getNumberOfOptionLabelsForTest();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> ((OptionSection) mUI.getShippingAddressSectionForTest())
+                        .getNumberOfOptionLabelsForTest());
     }
 
     protected OptionRow getShippingAddressOptionRowAtIndex(final int index)
             throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<OptionRow>() {
-            @Override
-            public OptionRow call() {
-                return ((OptionSection) mUI.getShippingAddressSectionForTest())
-                        .getOptionRowAtIndex(index);
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> ((OptionSection) mUI.getShippingAddressSectionForTest())
+                        .getOptionRowAtIndex(index));
     }
 
     protected String getSpinnerSelectionTextInCardEditor(final int dropdownIndex)
             throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() {
-            @Override
-            public String call() {
-                return mUI.getCardEditorDialog()
-                        .getDropdownFieldsForTest()
-                        .get(dropdownIndex)
-                        .getSelectedItem()
-                        .toString();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(() -> mUI.getCardEditorDialog()
+                .getDropdownFieldsForTest()
+                .get(dropdownIndex)
+                .getSelectedItem()
+                .toString());
     }
 
     protected String getSpinnerTextAtPositionInCardEditor(
             final int dropdownIndex, final int itemPosition) throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() {
-            @Override
-            public String call() {
-                return mUI.getCardEditorDialog()
-                        .getDropdownFieldsForTest()
-                        .get(dropdownIndex)
-                        .getItemAtPosition(itemPosition)
-                        .toString();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(() -> mUI.getCardEditorDialog()
+                .getDropdownFieldsForTest()
+                .get(dropdownIndex)
+                .getItemAtPosition(itemPosition)
+                .toString());
     }
 
     protected int getSpinnerItemCountInCardEditor(final int dropdownIndex)
             throws ExecutionException {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<Integer>() {
-            @Override
-            public Integer call() {
-                return mUI.getCardEditorDialog()
-                        .getDropdownFieldsForTest()
-                        .get(dropdownIndex)
-                        .getCount();
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(() -> mUI.getCardEditorDialog()
+                .getDropdownFieldsForTest()
+                .get(dropdownIndex)
+                .getCount());
     }
 
     protected String getUnmaskPromptErrorMessage() {
@@ -577,13 +456,10 @@
     protected void setSpinnerSelectionsInCardEditorAndWait(final int[] selections,
             CallbackHelper helper) throws InterruptedException, TimeoutException {
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                List<Spinner> fields = mUI.getCardEditorDialog().getDropdownFieldsForTest();
-                for (int i = 0; i < selections.length && i < fields.size(); i++) {
-                    fields.get(i).setSelection(selections[i]);
-                }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            List<Spinner> fields = mUI.getCardEditorDialog().getDropdownFieldsForTest();
+            for (int i = 0; i < selections.length && i < fields.size(); i++) {
+                fields.get(i).setSelection(selections[i]);
             }
         });
         helper.waitForCallback(callCount);
@@ -592,30 +468,23 @@
     protected void setSpinnerSelectionInEditorAndWait(final int selection, CallbackHelper helper)
             throws InterruptedException, TimeoutException {
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                ((Spinner) mUI.getEditorDialog().findViewById(R.id.spinner))
-                        .setSelection(selection);
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(() -> ((Spinner) mUI.getEditorDialog().findViewById(
+                R.id.spinner))
+                .setSelection(selection));
         helper.waitForCallback(callCount);
     }
 
     protected void setTextInCardEditorAndWait(final String[] values, CallbackHelper helper)
             throws InterruptedException, TimeoutException {
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                ViewGroup contents =
-                        (ViewGroup) mUI.getCardEditorDialog().findViewById(R.id.contents);
-                Assert.assertNotNull(contents);
-                for (int i = 0, j = 0; i < contents.getChildCount() && j < values.length; i++) {
-                    View view = contents.getChildAt(i);
-                    if (view instanceof EditorTextField) {
-                        ((EditorTextField) view).getEditText().setText(values[j++]);
-                    }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            ViewGroup contents =
+                    (ViewGroup) mUI.getCardEditorDialog().findViewById(R.id.contents);
+            Assert.assertNotNull(contents);
+            for (int i = 0, j = 0; i < contents.getChildCount() && j < values.length; i++) {
+                View view = contents.getChildAt(i);
+                if (view instanceof EditorTextField) {
+                    ((EditorTextField) view).getEditText().setText(values[j++]);
                 }
             }
         });
@@ -625,13 +494,10 @@
     protected void setTextInEditorAndWait(final String[] values, CallbackHelper helper)
             throws InterruptedException, TimeoutException {
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                List<EditText> fields = mUI.getEditorDialog().getEditableTextFieldsForTest();
-                for (int i = 0; i < values.length; i++) {
-                    fields.get(i).setText(values[i]);
-                }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            List<EditText> fields = mUI.getEditorDialog().getEditableTextFieldsForTest();
+            for (int i = 0; i < values.length; i++) {
+                fields.get(i).setText(values[i]);
             }
         });
         helper.waitForCallback(callCount);
@@ -640,27 +506,20 @@
     protected void selectCheckboxAndWait(final int resourceId, final boolean isChecked,
             CallbackHelper helper) throws InterruptedException, TimeoutException {
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                ((CheckBox) mUI.getCardEditorDialog().findViewById(resourceId))
-                        .setChecked(isChecked);
-            }
-        });
+        ThreadUtils.runOnUiThreadBlocking(() -> ((CheckBox) mUI.getCardEditorDialog().findViewById(
+                resourceId))
+                .setChecked(isChecked));
         helper.waitForCallback(callCount);
     }
 
     protected void setTextInCardUnmaskDialogAndWait(final int resourceId, final String input,
             CallbackHelper helper) throws InterruptedException, TimeoutException {
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                EditText editText =
-                        ((EditText) mCardUnmaskPrompt.getDialogForTest().findViewById(resourceId));
-                editText.setText(input);
-                editText.getOnFocusChangeListener().onFocusChange(null, false);
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            EditText editText =
+                    ((EditText) mCardUnmaskPrompt.getDialogForTest().findViewById(resourceId));
+            editText.setText(input);
+            editText.getOnFocusChangeListener().onFocusChange(null, false);
         });
         helper.waitForCallback(callCount);
     }
@@ -670,16 +529,13 @@
             throws InterruptedException, TimeoutException {
         assert resourceIds.length == values.length;
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                for (int i = 0; i < resourceIds.length; ++i) {
-                    EditText editText =
-                            ((EditText) mCardUnmaskPrompt.getDialogForTest().findViewById(
-                                    resourceIds[i]));
-                    editText.setText(values[i]);
-                    editText.getOnFocusChangeListener().onFocusChange(null, false);
-                }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            for (int i = 0; i < resourceIds.length; ++i) {
+                EditText editText =
+                        ((EditText) mCardUnmaskPrompt.getDialogForTest().findViewById(
+                                resourceIds[i]));
+                editText.setText(values[i]);
+                editText.getOnFocusChangeListener().onFocusChange(null, false);
             }
         });
         helper.waitForCallback(callCount);
@@ -688,14 +544,11 @@
     /* package */ void hitSoftwareKeyboardSubmitButtonAndWait(final int resourceId,
             CallbackHelper helper) throws InterruptedException, TimeoutException {
         int callCount = helper.getCallCount();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                EditText editText =
-                        (EditText) mCardUnmaskPrompt.getDialogForTest().findViewById(resourceId);
-                editText.requestFocus();
-                editText.onEditorAction(EditorInfo.IME_ACTION_DONE);
-            }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            EditText editText =
+                    (EditText) mCardUnmaskPrompt.getDialogForTest().findViewById(resourceId);
+            editText.requestFocus();
+            editText.onEditorAction(EditorInfo.IME_ACTION_DONE);
         });
         helper.waitForCallback(callCount);
     }
@@ -794,13 +647,9 @@
     }
 
     /* package */ View getCardUnmaskView() throws Throwable {
-        return ThreadUtils.runOnUiThreadBlocking(new Callable<View>() {
-            @Override
-            public View call() {
-                return mCardUnmaskPrompt.getDialogForTest().findViewById(
-                        R.id.autofill_card_unmask_prompt);
-            }
-        });
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> mCardUnmaskPrompt.getDialogForTest().findViewById(
+                        R.id.autofill_card_unmask_prompt));
     }
 
     @Override
@@ -937,25 +786,20 @@
 
     void installPaymentApp(final String appMethodName, final int instrumentPresence,
             final int responseSpeed, final int creationSpeed) {
-        PaymentAppFactory.getInstance().addAdditionalFactory(new PaymentAppFactoryAddition() {
-            @Override
-            public void create(WebContents webContents, Set<String> methodNames,
-                    final PaymentAppFactory.PaymentAppCreatedCallback callback) {
-                final TestPay app = new TestPay(appMethodName, instrumentPresence, responseSpeed);
-                if (creationSpeed == IMMEDIATE_CREATION) {
-                    callback.onPaymentAppCreated(app);
-                    callback.onAllPaymentAppsCreated();
-                } else {
-                    new Handler().postDelayed(new Runnable() {
-                        @Override
-                        public void run() {
+        PaymentAppFactory.getInstance().addAdditionalFactory(
+                (webContents, methodNames, callback) -> {
+                    final TestPay app = new TestPay(appMethodName, instrumentPresence,
+                            responseSpeed);
+                    if (creationSpeed == IMMEDIATE_CREATION) {
+                        callback.onPaymentAppCreated(app);
+                        callback.onAllPaymentAppsCreated();
+                    } else {
+                        new Handler().postDelayed(() -> {
                             callback.onPaymentAppCreated(app);
                             callback.onAllPaymentAppsCreated();
-                        }
-                    }, 100);
-                }
-            }
-        });
+                        }, 100);
+                    }
+                });
     }
 
     /** A payment app implementation for test. */
@@ -985,12 +829,9 @@
                 instruments.add(new TestPayInstrument(
                         getAppIdentifier(), mDefaultMethodName, mDefaultMethodName));
             }
-            Runnable instrumentsReady = new Runnable() {
-                @Override
-                public void run() {
-                    ThreadUtils.assertOnUiThread();
-                    mCallback.onInstrumentsReady(TestPay.this, instruments);
-                }
+            Runnable instrumentsReady = () -> {
+                ThreadUtils.assertOnUiThread();
+                mCallback.onInstrumentsReady(TestPay.this, instruments);
             };
             if (mResponseSpeed == IMMEDIATE_RESPONSE) {
                 instrumentsReady.run();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/WebVrTransitionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/WebVrTransitionTest.java
index c9051fa3..ac306b75 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/WebVrTransitionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/WebVrTransitionTest.java
@@ -59,6 +59,23 @@
     }
 
     /**
+     * Tests that WebVR is not exposed if the flag is not on and the page does
+     * not have an origin trial token.
+     */
+    @Test
+    @MediumTest
+    @CommandLineFlags.Remove({"enable-webvr"})
+    public void testWebVrDisabledWithoutFlagSet() throws InterruptedException {
+        // TODO(bsheedy): Remove this test once WebVR is on by default without
+        // requiring an origin trial.
+        mVrTestRule.loadUrlAndAwaitInitialization(
+                VrTestRule.getHtmlTestFile("test_webvr_disabled_without_flag_set"),
+                PAGE_LOAD_TIMEOUT_S);
+        mVrTestRule.waitOnJavaScriptStep(mVrTestRule.getFirstTabWebContents());
+        mVrTestRule.endTest(mVrTestRule.getFirstTabWebContents());
+    }
+
+    /**
      * Tests that scanning the Daydream View NFC tag on supported devices fires the
      * vrdisplayactivate event.
      */
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcherTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcherTest.java
index 24ffa6c..f1961cd 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcherTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcherTest.java
@@ -25,7 +25,6 @@
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
-import org.chromium.chrome.test.util.browser.TabLoadObserver;
 import org.chromium.chrome.test.util.browser.WebappTestPage;
 import org.chromium.net.test.EmbeddedTestServer;
 
@@ -74,12 +73,6 @@
         private String mPrimaryIconMurmur2Hash;
 
         @Override
-        public void onWebManifestForInitialUrlNotWebApkCompatible() {
-            mWebApkCompatible = false;
-            notifyCalled();
-        }
-
-        @Override
         public void onGotManifestData(
                 WebApkInfo fetchedInfo, String primaryIconUrl, String badgeIconUrl) {
             Assert.assertNull(mName);
@@ -165,35 +158,15 @@
         CallbackWaiter waiter = new CallbackWaiter();
         startWebApkUpdateDataFetcher(mTestServer.getURL(WEB_MANIFEST_SCOPE),
                 mTestServer.getURL(WEB_MANIFEST_URL2), waiter);
-        waiter.waitForCallback(0);
-        Assert.assertFalse(waiter.isWebApkCompatible());
 
         WebappTestPage.navigateToPageWithServiceWorkerAndManifest(
                 mTestServer, mTab, WEB_MANIFEST_URL2);
-        waiter.waitForCallback(1);
+        waiter.waitForCallback(0);
         Assert.assertTrue(waiter.isWebApkCompatible());
         Assert.assertEquals(WEB_MANIFEST_NAME2, waiter.name());
     }
 
     /**
-     * Test that {@link onWebManifestForInitialUrlNotWebApkCompatible()} is called after attempting
-     * to fetch Web Manifest for page with no Web Manifest.
-     */
-    @Test
-    @MediumTest
-    @Feature({"Webapps"})
-    public void testNoWebManifest() throws Exception {
-        new TabLoadObserver(mTab).fullyLoadUrl(
-                mTestServer.getURL("/chrome/test/data/banners/no_manifest_test_page.html"));
-
-        CallbackWaiter waiter = new CallbackWaiter();
-        startWebApkUpdateDataFetcher(mTestServer.getURL(WEB_MANIFEST_SCOPE),
-                mTestServer.getURL(WEB_MANIFEST_URL2), waiter);
-        waiter.waitForCallback(0);
-        Assert.assertFalse(waiter.isWebApkCompatible());
-    }
-
-    /**
      * Test that large icon murmur2 hashes are correctly plumbed to Java. The hash can take on
      * values up to 2^64 - 1 which is greater than {@link Long#MAX_VALUE}.
      */
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
index 4dd0085..4150a62d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
@@ -80,12 +80,6 @@
         }
 
         @Override
-        public void onWebManifestForInitialUrlNotWebApkCompatible() {
-            super.onWebManifestForInitialUrlNotWebApkCompatible();
-            mWaiter.notifyCalled();
-        }
-
-        @Override
         public void onGotManifestData(WebApkInfo fetchedInfo, String primaryIconUrl,
                 String badgeIconUrl) {
             super.onGotManifestData(fetchedInfo, primaryIconUrl, badgeIconUrl);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappModeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappModeTest.java
index 5ec7b597..6988c51 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappModeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappModeTest.java
@@ -246,8 +246,9 @@
      * Ensure WebappActivities can't be launched without proper security checks.
      */
     @Test
-    @MediumTest
-    @Feature({"Webapps"})
+    //@MediumTest
+    //@Feature({"Webapps"})
+    @DisabledTest(message = "crbug.com/755114")
     public void testWebappRequiresValidMac() throws Exception {
         // Try to start a WebappActivity.  Fail because the Intent is insecure.
         fireWebappIntent(WEBAPP_1_ID, WEBAPP_1_URL, WEBAPP_1_TITLE, WEBAPP_ICON, false);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
index 41ba2f3b..4eed153 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
@@ -370,8 +370,7 @@
         }
 
         // Chrome is killed. Neither
-        // {@link WebApkUpdateManager#onWebManifestForInitialUrlNotWebApkCompatible()} nor
-        // {@link WebApkUpdateManager#OnGotManifestData()} is called.
+        // {@link WebApkUpdateManager#OnGotManifestData()} is not called.
 
         {
             // Relaunching the WebAPK should do an is-update-needed check.
@@ -483,13 +482,12 @@
         updateIfNeeded(updateManager);
         assertTrue(updateManager.updateCheckStarted());
 
-        updateManager.onWebManifestForInitialUrlNotWebApkCompatible();
+        updateManager.onGotManifestData(null, null, null);
         assertTrue(updateManager.updateRequested());
         assertEquals(NAME, updateManager.requestedUpdateName());
 
         // Check that the {@link ManifestUpgradeDetector} has been destroyed. This prevents
-        // {@link #onWebManifestForInitialUrlNotWebApkCompatible()} and {@link #onGotManifestData()}
-        // from getting called.
+        // {@link #onGotManifestData()} from getting called.
         assertTrue(updateManager.destroyedFetcher());
     }
 
@@ -534,7 +532,6 @@
         assertTrue(updateManager.updateCheckStarted());
 
         // start_url does not have a Web Manifest. No update should be requested.
-        updateManager.onWebManifestForInitialUrlNotWebApkCompatible();
         assertFalse(updateManager.updateRequested());
         // {@link ManifestUpgradeDetector} should still be alive so that it can get
         // {@link #onGotManifestData} when page with the Web Manifest finishes loading.
@@ -566,7 +563,6 @@
         TestWebApkUpdateManager updateManager =
                 new TestWebApkUpdateManager(getStorage(WEBAPK_PACKAGE_NAME));
         updateIfNeeded(updateManager);
-        updateManager.onWebManifestForInitialUrlNotWebApkCompatible();
         onGotManifestData(updateManager, defaultManifestData());
         assertFalse(updateManager.updateRequested());
 
diff --git a/chrome/app/media_router_strings.grdp b/chrome/app/media_router_strings.grdp
index 6f6b689..78db4368 100644
--- a/chrome/app/media_router_strings.grdp
+++ b/chrome/app/media_router_strings.grdp
@@ -169,6 +169,12 @@
   <message name="IDS_MEDIA_ROUTER_ROUTE_DETAILS_VOLUME_TITLE" desc="The title label for a volume control bar for media contents.">
     Volume
   </message>
+  <message name="IDS_MEDIA_ROUTER_ROUTE_DETAILS_CURRENT_TIME_LABEL" desc="The label for the current time position of media contents.">
+    Current time
+  </message>
+  <message name="IDS_MEDIA_ROUTER_ROUTE_DETAILS_DURATION_LABEL" desc="The label for the total duration of media contents.">
+    Duration
+  </message>
 
   <!-- Sink List -->
   <message name="IDS_MEDIA_ROUTER_DESTINATION_MISSING" desc="Link to display when no Cast destinations are found which, on click, opens a page to the Chromecast help center explaining possible reasons why none are detected.">
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index 509d1d97..ed0a6ef 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -924,9 +924,6 @@
     <message name="IDS_SETTINGS_PRINTING_CUPS_PRINTERS_ADD_PRINTER" desc="In CUPS printing settings subpage, text for the link adding a new CUPS printer.">
       Add Printer
     </message>
-    <message name="IDS_SETTINGS_PRINTING_CUPS_PRINTERS_DETAILS" desc="Text for the drop down menu which allows the user to see the printer details.">
-      Details
-    </message>
     <message name="IDS_SETTINGS_PRINTING_CUPS_PRINTERS_EDIT" desc="Text for the drop down menu which allows the user to edit the printer details.">
       Edit
     </message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index b1f3d01..f8f04b38 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -3693,10 +3693,16 @@
 
   if ((is_linux && !is_chromeos) || is_win) {
     sources += [
+      "feature_engagement/feature_tracker.cc",
+      "feature_engagement/feature_tracker.h",
       "feature_engagement/new_tab/new_tab_tracker.cc",
       "feature_engagement/new_tab/new_tab_tracker.h",
       "feature_engagement/new_tab/new_tab_tracker_factory.cc",
       "feature_engagement/new_tab/new_tab_tracker_factory.h",
+      "feature_engagement/session_duration_updater.cc",
+      "feature_engagement/session_duration_updater.h",
+      "feature_engagement/session_duration_updater_factory.cc",
+      "feature_engagement/session_duration_updater_factory.h",
     ]
   }
 
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index 1251b2d..2d8234d 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -151,7 +151,29 @@
   # are commonly referenced by renderer-side and browser-side code, and
   # does not use Blink types like WTF.
   "+third_party/WebKit/common",
+
+  # The following restrictions are for ChromeOS and in particular mus/mash where
+  # Ozone does not run in process. If the linux build transitions to Ozone then
+  # we likely need to make these restrictions applicable only to ChromeOS files.
+  "-ui/events/ozone",
+  "-ui/ozone",
+  "+ui/ozone/public/ozone_switches.h",
+  # ui/events/devices is tied with ozone, which is controlled by mus, and
+  # shouldn't be used by Chrome directly.
+  "-ui/events/devices",
+  # Enums and supporting classes or observers that are safe (should be moved to
+  # services/ui/public/cpp). http://crbug.com/747544.
+  "+ui/events/devices/device_hotplug_event_observer.h",
+  "+ui/events/devices/input_device.h",
+  "+ui/events/devices/input_device_event_observer.h",
+  "+ui/events/devices/stylus_state.h",
+  "+ui/events/devices/touchscreen_device.h",
+  "+ui/events/devices/input_device_manager.h",
+
+  # Only used by X11 (non-ChromeOS) code, which can use X directly.
+  "+ui/events/devices/x11",
 ]
+
 specific_include_rules = {
   # TODO(mash): Remove. http://crbug.com/678705
   "fullscreen_chromeos\.cc": [
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 0d6c1c459..c30ae496 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -2973,7 +2973,7 @@
      FEATURE_VALUE_TYPE(omnibox::kOmniboxTailSuggestions)},
     {"enable-new-app-menu-icon", flag_descriptions::kEnableNewAppMenuIconName,
      flag_descriptions::kEnableNewAppMenuIconDescription, kOsDesktop,
-     SINGLE_VALUE_TYPE(switches::kEnableNewAppMenuIcon)},
+     FEATURE_VALUE_TYPE(features::kAnimatedAppMenuIcon)},
 #endif  // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
 
 #if defined(OS_ANDROID)
diff --git a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc
index 3c691113..eb341dd 100644
--- a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc
+++ b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc
@@ -343,7 +343,7 @@
   media->set_mime_type(context.GetBasePageEncoding());
 
   discourse_context::Selection* selection = display->mutable_selection();
-  selection->set_content(UTF16ToUTF8(context.GetSurroundingText()));
+  selection->set_content(base::UTF16ToUTF8(context.GetSurroundingText()));
   selection->set_start(context.GetStartOffset());
   selection->set_end(context.GetEndOffset());
   selection->set_is_uri_encoded(false);
diff --git a/chrome/browser/android/favicon_helper.cc b/chrome/browser/android/favicon_helper.cc
index 3fec960..bfa7006 100644
--- a/chrome/browser/android/favicon_helper.cc
+++ b/chrome/browser/android/favicon_helper.cc
@@ -68,6 +68,14 @@
                                                j_favicon_bitmap, j_icon_url);
 }
 
+void OnEnsureIconIsAvailableFinished(
+    const ScopedJavaGlobalRef<jobject>& j_availability_callback,
+    bool newly_available) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_IconAvailabilityCallback_onIconAvailabilityChecked(
+      env, j_availability_callback, newly_available);
+}
+
 }  // namespace
 
 static jlong Init(JNIEnv* env, const JavaParamRef<jclass>& clazz) {
@@ -157,7 +165,6 @@
     const JavaParamRef<jstring>& j_page_url,
     const JavaParamRef<jstring>& j_icon_url,
     jboolean j_is_large_icon,
-    jboolean j_is_temporary,
     const JavaParamRef<jobject>& j_availability_callback) {
   Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
   DCHECK(profile);
@@ -174,7 +181,7 @@
   ScopedJavaGlobalRef<jobject> j_scoped_callback(env, j_availability_callback);
   favicon_base::FaviconImageCallback callback_runner = base::Bind(
       &FaviconHelper::OnFaviconImageResultAvailable, j_scoped_callback, profile,
-      web_contents, page_url, icon_url, icon_type, j_is_temporary);
+      web_contents, page_url, icon_url, icon_type);
   favicon::FaviconService* service = FaviconServiceFactory::GetForProfile(
       profile, ServiceAccessType::IMPLICIT_ACCESS);
   favicon::GetFaviconImageForPageURL(service, page_url, icon_type,
@@ -182,6 +189,20 @@
                                      cancelable_task_tracker_.get());
 }
 
+void FaviconHelper::TouchOnDemandFavicon(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& obj,
+    const JavaParamRef<jobject>& j_profile,
+    const JavaParamRef<jstring>& j_icon_url) {
+  Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
+  DCHECK(profile);
+  GURL icon_url(ConvertJavaStringToUTF8(env, j_icon_url));
+
+  favicon::FaviconService* service = FaviconServiceFactory::GetForProfile(
+      profile, ServiceAccessType::IMPLICIT_ACCESS);
+  service->TouchOnDemandFavicon(icon_url);
+}
+
 FaviconHelper::~FaviconHelper() {}
 
 // Return the index of |sizes| whose area is largest but not exceeds int type
@@ -213,29 +234,27 @@
     Profile* profile,
     const GURL& page_url,
     favicon_base::IconType icon_type,
-    bool is_temporary,
     int download_request_id,
     int http_status_code,
     const GURL& image_url,
     const std::vector<SkBitmap>& bitmaps,
     const std::vector<gfx::Size>& original_sizes) {
-  bool success = !bitmaps.empty();
-  if (success) {
-    // Only keep the largest icon available.
-    gfx::Image image = gfx::Image(gfx::ImageSkia(
-        gfx::ImageSkiaRep(bitmaps[GetLargestSizeIndex(original_sizes)], 0)));
-    favicon_base::SetFaviconColorSpace(&image);
-    favicon::FaviconService* service = FaviconServiceFactory::GetForProfile(
-        profile, ServiceAccessType::IMPLICIT_ACCESS);
-    service->SetFavicons(page_url, image_url, icon_type, image);
-
-    if (is_temporary)
-      service->SetFaviconOutOfDateForPage(page_url);
+  if (bitmaps.empty()) {
+    OnEnsureIconIsAvailableFinished(j_availability_callback,
+                                    /*newly_available=*/false);
+    return;
   }
 
-  JNIEnv* env = AttachCurrentThread();
-  Java_IconAvailabilityCallback_onIconAvailabilityChecked(
-      env, j_availability_callback, /*newly_available=*/success);
+  // Only keep the largest icon available.
+  gfx::Image image = gfx::Image(gfx::ImageSkia(
+      gfx::ImageSkiaRep(bitmaps[GetLargestSizeIndex(original_sizes)], 0)));
+  favicon_base::SetFaviconColorSpace(&image);
+  favicon::FaviconService* service = FaviconServiceFactory::GetForProfile(
+      profile, ServiceAccessType::IMPLICIT_ACCESS);
+
+  service->SetOnDemandFavicons(
+      page_url, image_url, icon_type, image,
+      base::Bind(&OnEnsureIconIsAvailableFinished, j_availability_callback));
 }
 
 void FaviconHelper::OnFaviconImageResultAvailable(
@@ -245,21 +264,19 @@
     const GURL& page_url,
     const GURL& icon_url,
     favicon_base::IconType icon_type,
-    bool is_temporary,
     const favicon_base::FaviconImageResult& result) {
   // If there already is a favicon, return immediately.
   // Can |web_contents| be null here? crbug.com/688249
   if (!result.image.IsEmpty() || !web_contents) {
     // Either the image already exists in the FaviconService, or it doesn't and
     // we can't download it. Either way, it's not *newly* available.
-    JNIEnv* env = AttachCurrentThread();
-    Java_IconAvailabilityCallback_onIconAvailabilityChecked(
-        env, j_availability_callback, /*newly_available=*/false);
+    OnEnsureIconIsAvailableFinished(j_availability_callback,
+                                    /*newly_available=*/false);
     return;
   }
 
   web_contents->DownloadImage(
       icon_url, true, 0, false,
       base::Bind(&FaviconHelper::OnFaviconDownloaded, j_availability_callback,
-                 profile, page_url, icon_type, is_temporary));
+                 profile, page_url, icon_type));
 }
diff --git a/chrome/browser/android/favicon_helper.h b/chrome/browser/android/favicon_helper.h
index 730622a..b9dfe62 100644
--- a/chrome/browser/android/favicon_helper.h
+++ b/chrome/browser/android/favicon_helper.h
@@ -39,6 +39,7 @@
       const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jobject>& jprofile,
       const base::android::JavaParamRef<jstring>& j_page_url);
+
   void EnsureIconIsAvailable(
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& obj,
@@ -47,8 +48,12 @@
       const base::android::JavaParamRef<jstring>& j_page_url,
       const base::android::JavaParamRef<jstring>& j_icon_url,
       jboolean j_is_large_icon,
-      jboolean j_is_temporary,
       const base::android::JavaParamRef<jobject>& j_availability_callback);
+  void TouchOnDemandFavicon(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& obj,
+      const base::android::JavaParamRef<jobject>& j_profile,
+      const base::android::JavaParamRef<jstring>& j_icon_url);
 
  private:
   FRIEND_TEST_ALL_PREFIXES(FaviconHelperTest, GetLargestSizeIndex);
@@ -61,7 +66,6 @@
       const GURL& page_url,
       const GURL& icon_url,
       favicon_base::IconType icon_type,
-      bool is_temporary,
       const favicon_base::FaviconImageResult& result);
 
   static void OnFaviconDownloaded(
@@ -70,7 +74,6 @@
       Profile* profile,
       const GURL& page_url,
       favicon_base::IconType icon_type,
-      bool is_temporary,
       int download_request_id,
       int http_status_code,
       const GURL& image_url,
diff --git a/chrome/browser/android/instantapps/instant_apps_infobar_delegate.cc b/chrome/browser/android/instantapps/instant_apps_infobar_delegate.cc
index 4d3fc0c..459795c 100644
--- a/chrome/browser/android/instantapps/instant_apps_infobar_delegate.cc
+++ b/chrome/browser/android/instantapps/instant_apps_infobar_delegate.cc
@@ -78,6 +78,17 @@
   }
 }
 
+bool InstantAppsInfoBarDelegate::ShouldExpire(
+    const NavigationDetails& details) const {
+  content::WebContents* web_contents =
+      InfoBarService::WebContentsFromInfoBar(infobar());
+  bool navigation_url_is_launch_url =
+      web_contents != NULL &&
+      web_contents->GetURL().EqualsIgnoringRef(GURL(url_));
+  return !navigation_url_is_launch_url &&
+         ConfirmInfoBarDelegate::ShouldExpire(details);
+}
+
 void Launch(JNIEnv* env,
             const base::android::JavaParamRef<jclass>& clazz,
             const base::android::JavaParamRef<jobject>& jweb_contents,
diff --git a/chrome/browser/android/instantapps/instant_apps_infobar_delegate.h b/chrome/browser/android/instantapps/instant_apps_infobar_delegate.h
index c9933a99..cdf20ea8 100644
--- a/chrome/browser/android/instantapps/instant_apps_infobar_delegate.h
+++ b/chrome/browser/android/instantapps/instant_apps_infobar_delegate.h
@@ -24,6 +24,9 @@
 
   base::android::ScopedJavaGlobalRef<jobject> data() { return data_; }
 
+  // ConfirmInfoBarDelegate:
+  bool ShouldExpire(const NavigationDetails& details) const override;
+
   // WebContentsObserver:
   void DidFinishNavigation(
       content::NavigationHandle* navigation_handle) override;
diff --git a/chrome/browser/android/webapk/webapk_update_data_fetcher.cc b/chrome/browser/android/webapk/webapk_update_data_fetcher.cc
index b7a9d96..61950caa 100644
--- a/chrome/browser/android/webapk/webapk_update_data_fetcher.cc
+++ b/chrome/browser/android/webapk/webapk_update_data_fetcher.cc
@@ -54,7 +54,6 @@
     : content::WebContentsObserver(nullptr),
       scope_(scope),
       web_manifest_url_(web_manifest_url),
-      is_initial_fetch_(false),
       info_(GURL()),
       weak_ptr_factory_(this) {
   java_ref_.Reset(env, obj);
@@ -96,13 +95,11 @@
   // installable data the first time.
   if (url == last_fetched_url_)
     return;
-  is_initial_fetch_ = last_fetched_url_.is_empty();
+
   last_fetched_url_ = url;
 
-  if (!IsInScope(url, scope_)) {
-    OnWebManifestNotWebApkCompatible();
+  if (!IsInScope(url, scope_))
     return;
-  }
 
   InstallableParams params;
   params.ideal_primary_icon_size_in_px =
@@ -142,7 +139,6 @@
   if (data.error_code != NO_ERROR_DETECTED || data.manifest.IsEmpty() ||
       web_manifest_url_ != data.manifest_url ||
       !AreWebManifestUrlsWebApkCompatible(data.manifest)) {
-    OnWebManifestNotWebApkCompatible();
     return;
   }
 
@@ -167,10 +163,8 @@
 
 void WebApkUpdateDataFetcher::OnGotPrimaryIconMurmur2Hash(
     const std::string& primary_icon_murmur2_hash) {
-  if (primary_icon_murmur2_hash.empty()) {
-    OnWebManifestNotWebApkCompatible();
+  if (primary_icon_murmur2_hash.empty())
     return;
-  }
 
   if (!info_.best_badge_icon_url.is_empty() &&
       info_.best_badge_icon_url != info_.best_primary_icon_url) {
@@ -191,10 +185,8 @@
     const std::string& primary_icon_murmur2_hash,
     bool did_fetch_badge_icon,
     const std::string& badge_icon_murmur2_hash) {
-  if (did_fetch_badge_icon && badge_icon_murmur2_hash.empty()) {
-    OnWebManifestNotWebApkCompatible();
+  if (did_fetch_badge_icon && badge_icon_murmur2_hash.empty())
     return;
-  }
 
   JNIEnv* env = base::android::AttachCurrentThread();
 
@@ -233,11 +225,3 @@
       java_badge_icon, java_icon_urls, info_.display, info_.orientation,
       info_.theme_color, info_.background_color);
 }
-
-void WebApkUpdateDataFetcher::OnWebManifestNotWebApkCompatible() {
-  if (!is_initial_fetch_)
-    return;
-
-  Java_WebApkUpdateDataFetcher_onWebManifestForInitialUrlNotWebApkCompatible(
-      base::android::AttachCurrentThread(), java_ref_);
-}
diff --git a/chrome/browser/android/webapk/webapk_update_data_fetcher.h b/chrome/browser/android/webapk/webapk_update_data_fetcher.h
index 777a760..1b9d4d2 100644
--- a/chrome/browser/android/webapk/webapk_update_data_fetcher.h
+++ b/chrome/browser/android/webapk/webapk_update_data_fetcher.h
@@ -77,9 +77,6 @@
   // The WebAPK's Web Manifest URL that the detector is looking for.
   const GURL web_manifest_url_;
 
-  // Whether this is the initial URL fetch.
-  bool is_initial_fetch_;
-
   // The URL for which the installable data is being fetched / was last fetched.
   GURL last_fetched_url_;
 
diff --git a/chrome/browser/app_controller_mac_browsertest.mm b/chrome/browser/app_controller_mac_browsertest.mm
index 63324c0..765b6527 100644
--- a/chrome/browser/app_controller_mac_browsertest.mm
+++ b/chrome/browser/app_controller_mac_browsertest.mm
@@ -54,6 +54,8 @@
 #include "extensions/test/extension_test_message_listener.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 
+using base::SysUTF16ToNSString;
+
 namespace {
 
 GURL g_open_shortcut_url = GURL::EmptyGURL();
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc
index 3358114..e011d41 100644
--- a/chrome/browser/apps/guest_view/web_view_browsertest.cc
+++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -62,6 +62,7 @@
 #include "content/public/common/child_process_host.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
+#include "content/public/common/url_constants.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/download_test_observer.h"
 #include "content/public/test/fake_speech_recognition_manager.h"
@@ -79,6 +80,7 @@
 #include "extensions/common/extensions_client.h"
 #include "extensions/test/extension_test_message_listener.h"
 #include "media/base/media_switches.h"
+#include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/embedded_test_server/http_request.h"
 #include "net/test/embedded_test_server/http_response.h"
@@ -4222,3 +4224,164 @@
   chrome::CloseTab(browser());
 }
 #endif
+
+// This test class makes "isolated.com" an isolated origin, to be used in
+// testing isolated origins inside of a WebView.
+class IsolatedOriginWebViewTest : public WebViewTest {
+ public:
+  IsolatedOriginWebViewTest() {}
+  ~IsolatedOriginWebViewTest() override {}
+
+ protected:
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    ASSERT_TRUE(embedded_test_server()->InitializeAndListen());
+
+    std::string origin =
+        embedded_test_server()->GetURL("isolated.com", "/").spec();
+    command_line->AppendSwitchASCII(switches::kIsolateOrigins, origin);
+    WebViewTest::SetUpCommandLine(command_line);
+  }
+
+  void SetUpOnMainThread() override {
+    host_resolver()->AddRule("*", "127.0.0.1");
+    embedded_test_server()->StartAcceptingConnections();
+    WebViewTest::SetUpOnMainThread();
+  }
+};
+INSTANTIATE_TEST_CASE_P(WebViewTests,
+                        IsolatedOriginWebViewTest,
+                        testing::Bool());
+
+// Test isolated origins inside a WebView, and make sure that loading an
+// isolated origin in a regular tab's subframe doesn't reuse a WebView process
+// that had loaded it previously, which would result in renderer kills. See
+// https://crbug.com/751916 and https://crbug.com/751920.
+IN_PROC_BROWSER_TEST_P(IsolatedOriginWebViewTest, IsolatedOriginInWebview) {
+  LoadAppWithGuest("web_view/simple");
+  content::WebContents* guest = GetGuestWebContents();
+
+  // Navigate <webview> to an isolated origin.
+  GURL isolated_url(
+      embedded_test_server()->GetURL("isolated.com", "/title1.html"));
+  {
+    content::TestNavigationObserver load_observer(guest);
+    EXPECT_TRUE(
+        ExecuteScript(guest, "location.href = '" + isolated_url.spec() + "';"));
+    load_observer.Wait();
+  }
+
+  // TODO(alexmos, creis): The isolated origin currently has to use the
+  // chrome-guest:// SiteInstance, rather than a SiteInstance with its own
+  // meaningful site URL.  This should be fixed as part of
+  // https://crbug.com/734722.
+  EXPECT_TRUE(guest->GetMainFrame()->GetSiteInstance()->GetSiteURL().SchemeIs(
+      content::kGuestScheme));
+
+  // Now, navigate <webview> to a regular page with a subframe.
+  GURL foo_url(embedded_test_server()->GetURL("foo.com", "/iframe.html"));
+  {
+    content::TestNavigationObserver load_observer(guest);
+    EXPECT_TRUE(
+        ExecuteScript(guest, "location.href = '" + foo_url.spec() + "';"));
+    load_observer.Wait();
+  }
+
+  // Navigate subframe in <webview> to an isolated origin.
+  EXPECT_TRUE(NavigateIframeToURL(guest, "test", isolated_url));
+
+  // TODO(alexmos, creis): Unfortunately, the subframe currently has to stay in
+  // the guest process.  The expectations here should change once WebViews
+  // can support OOPIFs.  See https://crbug.com/614463.
+  content::RenderFrameHost* webview_subframe =
+      ChildFrameAt(guest->GetMainFrame(), 0);
+  EXPECT_EQ(webview_subframe->GetProcess(),
+            guest->GetMainFrame()->GetProcess());
+  EXPECT_EQ(webview_subframe->GetSiteInstance(),
+            guest->GetMainFrame()->GetSiteInstance());
+
+  // Load a page with subframe in a regular tab.
+  AddTabAtIndex(0, foo_url, ui::PAGE_TRANSITION_TYPED);
+  content::WebContents* tab =
+      browser()->tab_strip_model()->GetActiveWebContents();
+
+  // Navigate that subframe to an isolated origin.  This should not join the
+  // WebView process, which has isolated.foo.com committed in a different
+  // storage partition.
+  EXPECT_TRUE(NavigateIframeToURL(tab, "test", isolated_url));
+  content::RenderFrameHost* subframe = ChildFrameAt(tab->GetMainFrame(), 0);
+  EXPECT_NE(guest->GetMainFrame()->GetProcess(), subframe->GetProcess());
+
+  // Check that the guest process hasn't crashed.
+  EXPECT_TRUE(guest->GetMainFrame()->IsRenderFrameLive());
+
+  // Check that accessing a foo.com cookie from the WebView doesn't result in a
+  // renderer kill. This might happen if we erroneously applied an isolated.com
+  // origin lock to the WebView process when committing isolated.com.
+  bool cookie_is_correct = false;
+  EXPECT_TRUE(ExecuteScriptAndExtractBool(
+      guest,
+      "document.cookie = 'foo=bar';\n"
+      "window.domAutomationController.send(document.cookie == 'foo=bar');\n",
+      &cookie_is_correct));
+  EXPECT_TRUE(cookie_is_correct);
+}
+
+// This test is similar to IsolatedOriginInWebview above, but loads an isolated
+// origin in a <webview> subframe *after* loading the same isolated origin in a
+// regular tab's subframe.  The isolated origin's subframe in the <webview>
+// subframe should not reuse the regular tab's subframe process.  See
+// https://crbug.com/751916 and https://crbug.com/751920.
+IN_PROC_BROWSER_TEST_P(IsolatedOriginWebViewTest,
+                       LoadIsolatedOriginInWebviewAfterLoadingInRegularTab) {
+  LoadAppWithGuest("web_view/simple");
+  content::WebContents* guest = GetGuestWebContents();
+
+  // Load a page with subframe in a regular tab.
+  GURL foo_url(embedded_test_server()->GetURL("foo.com", "/iframe.html"));
+  AddTabAtIndex(0, foo_url, ui::PAGE_TRANSITION_TYPED);
+  content::WebContents* tab =
+      browser()->tab_strip_model()->GetActiveWebContents();
+
+  // Navigate that subframe to an isolated origin.
+  GURL isolated_url(
+      embedded_test_server()->GetURL("isolated.com", "/title1.html"));
+  EXPECT_TRUE(NavigateIframeToURL(tab, "test", isolated_url));
+  content::RenderFrameHost* subframe = ChildFrameAt(tab->GetMainFrame(), 0);
+  EXPECT_NE(tab->GetMainFrame()->GetProcess(), subframe->GetProcess());
+
+  // Navigate <webview> to a regular page with an isolated origin subframe.
+  {
+    content::TestNavigationObserver load_observer(guest);
+    EXPECT_TRUE(
+        ExecuteScript(guest, "location.href = '" + foo_url.spec() + "';"));
+    load_observer.Wait();
+  }
+  EXPECT_TRUE(NavigateIframeToURL(guest, "test", isolated_url));
+
+  // TODO(alexmos, creis): The subframe currently has to stay in the guest
+  // process.  The expectations here should change once WebViews can support
+  // OOPIFs.  See https://crbug.com/614463.
+  content::RenderFrameHost* webview_subframe =
+      ChildFrameAt(guest->GetMainFrame(), 0);
+  EXPECT_EQ(webview_subframe->GetProcess(),
+            guest->GetMainFrame()->GetProcess());
+  EXPECT_EQ(webview_subframe->GetSiteInstance(),
+            guest->GetMainFrame()->GetSiteInstance());
+  EXPECT_NE(webview_subframe->GetProcess(), subframe->GetProcess());
+
+  // Check that the guest and regular tab processes haven't crashed.
+  EXPECT_TRUE(guest->GetMainFrame()->IsRenderFrameLive());
+  EXPECT_TRUE(tab->GetMainFrame()->IsRenderFrameLive());
+  EXPECT_TRUE(subframe->IsRenderFrameLive());
+
+  // Check that accessing a foo.com cookie from the WebView doesn't result in a
+  // renderer kill. This might happen if we erroneously applied an isolated.com
+  // origin lock to the WebView process when committing isolated.com.
+  bool cookie_is_correct = false;
+  EXPECT_TRUE(ExecuteScriptAndExtractBool(
+      guest,
+      "document.cookie = 'foo=bar';\n"
+      "window.domAutomationController.send(document.cookie == 'foo=bar');\n",
+      &cookie_is_correct));
+  EXPECT_TRUE(cookie_is_correct);
+}
diff --git a/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc b/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc
index 6ec3b8ed..943de7f 100644
--- a/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc
+++ b/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc
@@ -47,7 +47,7 @@
 #include "extensions/test/extension_test_message_listener.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "ui/base/ime/composition_text.h"
-#include "ui/base/ime/composition_underline.h"
+#include "ui/base/ime/ime_text_span.h"
 #include "ui/base/ime/text_input_client.h"
 #include "ui/base/test/ui_controls.h"
 #include "ui/events/keycodes/keyboard_codes.h"
@@ -1724,7 +1724,7 @@
       target_web_contents->GetRenderWidgetHostView()->GetRenderWidgetHost();
   content::SendImeCommitTextToWidget(
       target_rwh_for_input, base::UTF8ToUTF16("C"),
-      std::vector<ui::CompositionUnderline>(), gfx::Range(4, 5), 0);
+      std::vector<ui::ImeTextSpan>(), gfx::Range(4, 5), 0);
   input_listener.WaitUntilSatisfied();
 
   // Get the input value from the guest.
@@ -1790,7 +1790,7 @@
   CompositionRangeUpdateObserver observer(embedder_web_contents);
   content::SendImeSetCompositionTextToWidget(
       target_web_contents->GetRenderWidgetHostView()->GetRenderWidgetHost(),
-      base::UTF8ToUTF16("ABC"), std::vector<ui::CompositionUnderline>(),
+      base::UTF8ToUTF16("ABC"), std::vector<ui::ImeTextSpan>(),
       gfx::Range::InvalidRange(), 0, 3);
   observer.WaitForCompositionRangeLength(3U);
 }
diff --git a/chrome/browser/chrome_service.cc b/chrome/browser/chrome_service.cc
index 372235e..e90a954 100644
--- a/chrome/browser/chrome_service.cc
+++ b/chrome/browser/chrome_service.cc
@@ -12,10 +12,10 @@
 }
 
 ChromeService::ChromeService() {
+#if defined(OS_CHROMEOS)
 #if defined(USE_OZONE)
   input_device_controller_.AddInterface(&registry_);
 #endif
-#if defined(OS_CHROMEOS)
   registry_.AddInterface(
       base::Bind(&chromeos::Launchable::Bind, base::Unretained(&launchable_)));
 #endif
diff --git a/chrome/browser/chrome_service.h b/chrome/browser/chrome_service.h
index ffc1f9f6..2c7e8eb 100644
--- a/chrome/browser/chrome_service.h
+++ b/chrome/browser/chrome_service.h
@@ -10,10 +10,10 @@
 
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/chromeos/launchable.h"
-#endif
 #if defined(USE_OZONE)
 #include "services/ui/public/cpp/input_devices/input_device_controller.h"
 #endif
+#endif
 
 class ChromeService : public service_manager::Service {
  public:
@@ -32,10 +32,10 @@
 
 #if defined(OS_CHROMEOS)
   chromeos::Launchable launchable_;
-#endif
 #if defined(USE_OZONE)
   ui::InputDeviceController input_device_controller_;
 #endif
+#endif
 
   DISALLOW_COPY_AND_ASSIGN(ChromeService);
 };
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index b31a4a0..ea42528a 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -362,6 +362,8 @@
     "arc/fileapi/arc_file_system_operation_runner_util.h",
     "arc/fileapi/arc_media_view_util.cc",
     "arc/fileapi/arc_media_view_util.h",
+    "arc/fileapi/file_stream_forwarder.cc",
+    "arc/fileapi/file_stream_forwarder.h",
     "arc/intent_helper/arc_external_protocol_dialog.cc",
     "arc/intent_helper/arc_external_protocol_dialog.h",
     "arc/intent_helper/arc_navigation_throttle.cc",
@@ -782,6 +784,8 @@
     "lock_screen_apps/app_manager.h",
     "lock_screen_apps/app_manager_impl.cc",
     "lock_screen_apps/app_manager_impl.h",
+    "lock_screen_apps/app_window_metrics_tracker.cc",
+    "lock_screen_apps/app_window_metrics_tracker.h",
     "lock_screen_apps/focus_cycler_delegate.h",
     "lock_screen_apps/state_controller.cc",
     "lock_screen_apps/state_controller.h",
@@ -1668,6 +1672,7 @@
     "arc/fileapi/arc_documents_provider_root_unittest.cc",
     "arc/fileapi/arc_documents_provider_util_unittest.cc",
     "arc/fileapi/arc_file_system_operation_runner_unittest.cc",
+    "arc/fileapi/file_stream_forwarder_unittest.cc",
     "arc/intent_helper/arc_external_protocol_dialog_unittest.cc",
     "arc/intent_helper/arc_navigation_throttle_unittest.cc",
     "arc/kiosk/arc_kiosk_bridge_unittest.cc",
diff --git a/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder.cc b/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder.cc
new file mode 100644
index 0000000..2b1e958
--- /dev/null
+++ b/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder.cc
@@ -0,0 +1,146 @@
+// 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/chromeos/arc/fileapi/file_stream_forwarder.h"
+
+#include "base/files/file_util.h"
+#include "base/task_scheduler/task_scheduler.h"
+#include "base/task_scheduler/task_traits.h"
+#include "content/public/browser/browser_thread.h"
+#include "net/base/net_errors.h"
+
+using content::BrowserThread;
+
+namespace arc {
+
+namespace {
+
+constexpr int kBufSize = 32 * 1024;
+
+}  // namespace
+
+FileStreamForwarder::FileStreamForwarder(
+    scoped_refptr<storage::FileSystemContext> context,
+    const storage::FileSystemURL& url,
+    int64_t offset,
+    int64_t size,
+    base::ScopedFD fd_dest,
+    ResultCallback callback)
+    : context_(context),
+      url_(url),
+      offset_(offset),
+      remaining_size_(size),
+      fd_dest_(std::move(fd_dest)),
+      callback_(std::move(callback)),
+      task_runner_(base::TaskScheduler::GetInstance()
+                       ->CreateSequencedTaskRunnerWithTraits(
+                           // It's safe to shutdown without waiting for the
+                           // completion of tasks running with this task runner.
+                           {base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN,
+                            base::MayBlock()})),
+      buf_(new net::IOBufferWithSize(kBufSize)),
+      weak_ptr_factory_(this) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  BrowserThread::PostTask(
+      BrowserThread::IO, FROM_HERE,
+      base::BindOnce(&FileStreamForwarder::Start, base::Unretained(this)));
+}
+
+void FileStreamForwarder::Destroy() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  BrowserThread::PostTask(
+      BrowserThread::IO, FROM_HERE,
+      base::BindOnce(&FileStreamForwarder::DestroyOnIOThread,
+                     base::Unretained(this)));
+}
+
+FileStreamForwarder::~FileStreamForwarder() {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  if (!callback_.is_null())  // Aborted before completion.
+    NotifyCompleted(false);
+  // Use the task runner to close the FD.
+  task_runner_->PostTask(
+      FROM_HERE, base::BindOnce([](base::ScopedFD fd) {}, std::move(fd_dest_)));
+}
+
+void FileStreamForwarder::DestroyOnIOThread() {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  delete this;
+}
+
+void FileStreamForwarder::Start() {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  stream_reader_ = context_->CreateFileStreamReader(
+      url_, offset_, remaining_size_, base::Time());
+  if (!stream_reader_) {
+    LOG(ERROR) << "CreateFileStreamReader failed.";
+    NotifyCompleted(false);
+    return;
+  }
+  DoRead();
+}
+
+void FileStreamForwarder::DoRead() {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  if (remaining_size_ == 0) {
+    NotifyCompleted(true);
+    return;
+  }
+  const int result = stream_reader_->Read(
+      buf_.get(), std::min<int64_t>(buf_->size(), remaining_size_),
+      base::Bind(&FileStreamForwarder::OnReadCompleted,
+                 weak_ptr_factory_.GetWeakPtr()));
+  if (result != net::ERR_IO_PENDING) {
+    // Read result is returned synchronously.
+    OnReadCompleted(result);
+  }
+}
+
+void FileStreamForwarder::OnReadCompleted(int result) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  if (result <= 0) {
+    if (result == 0) {
+      LOG(ERROR) << remaining_size_ << " more bytes to read, but reached EOF.";
+    } else {
+      LOG(ERROR) << "Read failed " << net::ErrorToString(result);
+    }
+    NotifyCompleted(false);
+    return;
+  }
+  remaining_size_ -= result;
+  DCHECK_GE(remaining_size_, 0);
+
+  base::PostTaskAndReplyWithResult(
+      task_runner_.get(), FROM_HERE,
+      base::BindOnce(
+          [](int fd, scoped_refptr<net::IOBuffer> buf, int size) {
+            const bool result =
+                base::WriteFileDescriptor(fd, buf->data(), size);
+            PLOG_IF(ERROR, !result) << "Write failed.";
+            return result;
+          },
+          fd_dest_.get(), buf_, result),
+      base::BindOnce(&FileStreamForwarder::OnWriteCompleted,
+                     weak_ptr_factory_.GetWeakPtr()));
+}
+
+void FileStreamForwarder::OnWriteCompleted(bool result) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  if (!result) {
+    NotifyCompleted(false);
+    return;
+  }
+  // Continue reading.
+  DoRead();
+}
+
+void FileStreamForwarder::NotifyCompleted(bool result) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  DCHECK(!callback_.is_null());
+  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
+                          base::BindOnce(std::move(callback_), result));
+  callback_.Reset();  // Not to leave the callback in an undefined state.
+}
+
+}  // namespace arc
diff --git a/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder.h b/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder.h
new file mode 100644
index 0000000..93bdc00d
--- /dev/null
+++ b/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder.h
@@ -0,0 +1,93 @@
+// 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_CHROMEOS_ARC_FILEAPI_FILE_STREAM_FORWARDER_H_
+#define CHROME_BROWSER_CHROMEOS_ARC_FILEAPI_FILE_STREAM_FORWARDER_H_
+
+#include <memory>
+
+#include "base/callback.h"
+#include "base/files/scoped_file.h"
+#include "base/memory/weak_ptr.h"
+#include "net/base/io_buffer.h"
+#include "storage/browser/fileapi/file_stream_reader.h"
+#include "storage/browser/fileapi/file_system_context.h"
+
+namespace arc {
+
+// FileStreamForwarder reads data of the given FileSystemURL, and writes it to
+// the given FD. While all internal actions happen on the IO thread, all public
+// methods should be called on the UI thread. If this object is destroyed before
+// the completion, the in-flight operation may abort before finishing, and the
+// callback will be called with false when aborted.
+class FileStreamForwarder {
+ public:
+  struct DestroyHelper {
+    void operator()(FileStreamForwarder* object) const { object->Destroy(); }
+  };
+
+  // |result| is true when the specified amount of data was successfully
+  // forwarded.
+  using ResultCallback = base::OnceCallback<void(bool result)>;
+
+  // Starts reading the part of the file specified by |offset| and |size|, and
+  // writes the data to |fd_dest|, and runs |callback| with true iff |size|
+  // bytes of data were successfully read and written.
+  FileStreamForwarder(scoped_refptr<storage::FileSystemContext> context,
+                      const storage::FileSystemURL& url,
+                      int64_t offset,
+                      int64_t size,
+                      base::ScopedFD fd_dest,
+                      ResultCallback callback);
+
+  // Posts a task to destruct this object on the IO thread.
+  // Must not be called multiple times for the same object.
+  void Destroy();
+
+ private:
+  // Use Destroy() to destruct this object.
+  ~FileStreamForwarder();
+
+  // Destructs this object.
+  void DestroyOnIOThread();
+
+  // Starts reading the data.
+  void Start();
+
+  // Does the actual reading.
+  void DoRead();
+
+  // Called when read is completed. |result| is the number of bytes read, or an
+  // error code if it's negative.
+  void OnReadCompleted(int result);
+
+  // Called when write is completed.
+  void OnWriteCompleted(bool result);
+
+  // Runs the result callback on the UI thread.
+  void NotifyCompleted(bool result);
+
+  scoped_refptr<storage::FileSystemContext> context_;
+  const storage::FileSystemURL url_;
+  const int64_t offset_;
+  int64_t remaining_size_;
+  base::ScopedFD fd_dest_;
+  ResultCallback callback_;
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;  // For blocking IO.
+  scoped_refptr<net::IOBufferWithSize> buf_;
+  std::unique_ptr<storage::FileStreamReader> stream_reader_;
+
+  base::WeakPtrFactory<FileStreamForwarder> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(FileStreamForwarder);
+};
+
+// FileStreamForwarderPtr is unique_ptr with a custom deleter. Use this to
+// safely handle the ownership of FileStreamForwarder.
+using FileStreamForwarderPtr =
+    std::unique_ptr<FileStreamForwarder, FileStreamForwarder::DestroyHelper>;
+
+}  // namespace arc
+
+#endif  // CHROME_BROWSER_CHROMEOS_ARC_FILEAPI_FILE_STREAM_FORWARDER_H_
diff --git a/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder_unittest.cc b/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder_unittest.cc
new file mode 100644
index 0000000..a2090c2
--- /dev/null
+++ b/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder_unittest.cc
@@ -0,0 +1,198 @@
+// 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/chromeos/arc/fileapi/file_stream_forwarder.h"
+
+#include "base/files/file_util.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/optional.h"
+#include "base/rand_util.h"
+#include "base/run_loop.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "storage/browser/fileapi/file_system_context.h"
+#include "storage/browser/test/async_file_test_helper.h"
+#include "storage/browser/test/test_file_system_context.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace arc {
+
+namespace {
+
+class FileStreamForwarderTest : public testing::Test {
+ public:
+  FileStreamForwarderTest() {}
+
+  void SetUp() override {
+    // Prepare a temporary directory and the destination file.
+    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
+
+    dest_file_path_ = temp_dir_.GetPath().AppendASCII("dest");
+    base::File dest_file(dest_file_path_,
+                         base::File::FLAG_CREATE | base::File::FLAG_WRITE);
+    ASSERT_TRUE(dest_file.IsValid());
+    dest_fd_ = base::ScopedFD(dest_file.TakePlatformFile());
+
+    context_ = content::CreateFileSystemContextForTesting(nullptr,
+                                                          temp_dir_.GetPath());
+
+    // Prepare a file system.
+    constexpr char kURLOrigin[] = "http://origin/";
+
+    context_->OpenFileSystem(
+        GURL(kURLOrigin), storage::kFileSystemTypeTemporary,
+        storage::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT,
+        base::Bind([](const GURL& root_url, const std::string& name,
+                      base::File::Error result) {
+          EXPECT_EQ(base::File::FILE_OK, result);
+        }));
+    base::RunLoop().RunUntilIdle();
+
+    // Prepare a 64KB file in the file system.
+    url_ = context_->CreateCrackedFileSystemURL(
+        GURL(kURLOrigin), storage::kFileSystemTypeTemporary,
+        base::FilePath().AppendASCII("test.dat"));
+
+    constexpr int kTestDataSize = 1024 * 64;
+    test_data_ = base::RandBytesAsString(kTestDataSize);
+
+    ASSERT_EQ(base::File::FILE_OK,
+              content::AsyncFileTestHelper::CreateFileWithData(
+                  context_.get(), url_, test_data_.data(), test_data_.size()));
+  }
+
+ protected:
+  content::TestBrowserThreadBundle test_browser_thread_bundle_;
+  base::ScopedTempDir temp_dir_;
+  base::FilePath dest_file_path_;
+  base::ScopedFD dest_fd_;
+  scoped_refptr<storage::FileSystemContext> context_;
+  storage::FileSystemURL url_;
+  std::string test_data_;
+};
+
+TEST_F(FileStreamForwarderTest, ForwardAll) {
+  constexpr int kOffset = 0;
+  const int kSize = test_data_.size();
+  base::RunLoop run_loop;
+  FileStreamForwarderPtr forwarder(new FileStreamForwarder(
+      context_, url_, kOffset, kSize, std::move(dest_fd_),
+      base::BindOnce(
+          [](base::RunLoop* run_loop, bool result) {
+            EXPECT_TRUE(result);
+            run_loop->Quit();
+          },
+          &run_loop)));
+  run_loop.Run();
+
+  std::string contents;
+  ASSERT_TRUE(base::ReadFileToString(dest_file_path_, &contents));
+  EXPECT_EQ(test_data_, contents);
+}
+
+TEST_F(FileStreamForwarderTest, ForwardPartially) {
+  constexpr int kOffset = 12345;
+  constexpr int kSize = 6789;
+  base::RunLoop run_loop;
+  FileStreamForwarderPtr forwarder(new FileStreamForwarder(
+      context_, url_, kOffset, kSize, std::move(dest_fd_),
+      base::BindOnce(
+          [](base::RunLoop* run_loop, bool result) {
+            EXPECT_TRUE(result);
+            run_loop->Quit();
+          },
+          &run_loop)));
+  run_loop.Run();
+
+  std::string contents;
+  ASSERT_TRUE(base::ReadFileToString(dest_file_path_, &contents));
+  EXPECT_EQ(std::string(test_data_.begin() + kOffset,
+                        test_data_.begin() + kOffset + kSize),
+            contents);
+}
+
+TEST_F(FileStreamForwarderTest, ForwardPartially2) {
+  constexpr int kOffset = 1;
+  const int kSize = test_data_.size() - 1;
+  base::RunLoop run_loop;
+  FileStreamForwarderPtr forwarder(new FileStreamForwarder(
+      context_, url_, kOffset, kSize, std::move(dest_fd_),
+      base::BindOnce(
+          [](base::RunLoop* run_loop, bool result) {
+            EXPECT_TRUE(result);
+            run_loop->Quit();
+          },
+          &run_loop)));
+  run_loop.Run();
+
+  std::string contents;
+  ASSERT_TRUE(base::ReadFileToString(dest_file_path_, &contents));
+  EXPECT_EQ(std::string(test_data_.begin() + kOffset,
+                        test_data_.begin() + kOffset + kSize),
+            contents);
+}
+
+TEST_F(FileStreamForwarderTest, ForwardTooMuch) {
+  constexpr int kOffset = 0;
+  const int kSize = test_data_.size() + 1;  // Request more than provided.
+  base::RunLoop run_loop;
+  FileStreamForwarderPtr forwarder(new FileStreamForwarder(
+      context_, url_, kOffset, kSize, std::move(dest_fd_),
+      base::BindOnce(
+          [](base::RunLoop* run_loop, bool result) {
+            EXPECT_FALSE(result);
+            run_loop->Quit();
+          },
+          &run_loop)));
+  run_loop.Run();
+
+  std::string contents;
+  ASSERT_TRUE(base::ReadFileToString(dest_file_path_, &contents));
+  EXPECT_EQ(test_data_, contents);
+}
+
+TEST_F(FileStreamForwarderTest, ForwardTooMuch2) {
+  constexpr int kOffset = 1;
+  const int kSize = test_data_.size();  // Request more than provided.
+  base::RunLoop run_loop;
+  FileStreamForwarderPtr forwarder(new FileStreamForwarder(
+      context_, url_, kOffset, kSize, std::move(dest_fd_),
+      base::BindOnce(
+          [](base::RunLoop* run_loop, bool result) {
+            EXPECT_FALSE(result);
+            run_loop->Quit();
+          },
+          &run_loop)));
+  run_loop.Run();
+
+  std::string contents;
+  ASSERT_TRUE(base::ReadFileToString(dest_file_path_, &contents));
+  EXPECT_EQ(std::string(test_data_.begin() + kOffset, test_data_.end()),
+            contents);
+}
+
+TEST_F(FileStreamForwarderTest, InvalidURL) {
+  storage::FileSystemURL invalid_url = context_->CreateCrackedFileSystemURL(
+      GURL("http://invalid-origin/"), storage::kFileSystemTypeTemporary,
+      base::FilePath().AppendASCII("invalid.dat"));
+  constexpr int kOffset = 0;
+  const int kSize = test_data_.size();
+  base::RunLoop run_loop;
+  FileStreamForwarderPtr forwarder(new FileStreamForwarder(
+      context_, invalid_url, kOffset, kSize, std::move(dest_fd_),
+      base::BindOnce(
+          [](base::RunLoop* run_loop, bool result) {
+            EXPECT_FALSE(result);
+            run_loop->Quit();
+          },
+          &run_loop)));
+  run_loop.Run();
+
+  std::string contents;
+  ASSERT_TRUE(base::ReadFileToString(dest_file_path_, &contents));
+  EXPECT_TRUE(contents.empty());
+}
+
+}  // namespace
+
+}  // namespace arc
diff --git a/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.cc b/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.cc
index a2a2c17..ebeb068 100644
--- a/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.cc
+++ b/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.cc
@@ -283,7 +283,16 @@
 
 void ArcVoiceInteractionFrameworkService::SetVoiceInteractionRunning(
     bool running) {
-  ash::Shell::Get()->NotifyVoiceInteractionStatusChanged(running);
+  ash::Shell::Get()->NotifyVoiceInteractionStatusChanged(
+      running ? ash::VoiceInteractionState::RUNNING
+              : ash::VoiceInteractionState::STOPPED);
+}
+
+void ArcVoiceInteractionFrameworkService::SetVoiceInteractionState(
+    ash::VoiceInteractionState state) {
+  DCHECK_NE(state_, state);
+  state_ = state;
+  ash::Shell::Get()->NotifyVoiceInteractionStatusChanged(state);
 }
 
 void ArcVoiceInteractionFrameworkService::OnMetalayerClosed() {
@@ -414,6 +423,12 @@
     return;
   }
 
+  if (state_ == ash::VoiceInteractionState::NOT_READY) {
+    // If the container side is not ready, we will be waiting for a while.
+    ash::Shell::Get()->NotifyVoiceInteractionStatusChanged(
+        ash::VoiceInteractionState::NOT_READY);
+  }
+
   if (!arc_bridge_service_->voice_interaction_framework()->has_instance()) {
     VLOG(1) << "Instance not ready.";
     SetArcCpuRestriction(false);
diff --git a/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.h b/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.h
index 7335e00a..507e264 100644
--- a/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.h
+++ b/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.h
@@ -62,6 +62,7 @@
   void OnMetalayerClosed() override;
   void SetMetalayerEnabled(bool enabled) override;
   void SetVoiceInteractionRunning(bool running) override;
+  void SetVoiceInteractionState(ash::VoiceInteractionState state) override;
 
   bool IsMetalayerSupported();
   void ShowMetalayer(const base::Closure& closed);
@@ -117,6 +118,12 @@
   // Whether there is a pending request to start voice interaction.
   bool is_request_pending_ = false;
 
+  // The current state voice interaction service is. There is usually a long
+  // delay after boot before the service is ready. We wait for the container
+  // to tell us if it is ready to quickly serve voice interaction requests.
+  // We also give user proper feedback based on the state.
+  ash::VoiceInteractionState state_ = ash::VoiceInteractionState::NOT_READY;
+
   // The time when a user initated an interaction.
   base::TimeTicks user_interaction_start_time_;
 
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
index fbf927a..721c39f0 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
@@ -94,7 +94,7 @@
     ProfileInfo profile_info;
     profile_info.profile_id =
         multi_user_util::GetAccountIdFromProfile(profile).GetUserEmail();
-    profile_info.display_name = UTF16ToUTF8(user->GetDisplayName());
+    profile_info.display_name = base::UTF16ToUTF8(user->GetDisplayName());
     // TODO(hirono): Remove the property from the profile_info.
     profile_info.is_current_profile = true;
 
@@ -188,8 +188,8 @@
     result.allow_redeem_offers = true;
   }
   result.timezone =
-      UTF16ToUTF8(chromeos::system::TimezoneSettings::GetInstance()
-                      ->GetCurrentTimezoneID());
+      base::UTF16ToUTF8(chromeos::system::TimezoneSettings::GetInstance()
+                            ->GetCurrentTimezoneID());
 
   drive::EventLogger* logger = file_manager::util::GetLogger(profile);
   if (logger)
diff --git a/chrome/browser/chromeos/feedback_util.cc b/chrome/browser/chromeos/feedback_util.cc
index c629cd6..4c8eb3b 100644
--- a/chrome/browser/chromeos/feedback_util.cc
+++ b/chrome/browser/chromeos/feedback_util.cc
@@ -6,10 +6,11 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
-#include "base/logging.h"
 #include "chrome/browser/extensions/api/feedback_private/feedback_private_api.h"
 #include "chrome/browser/extensions/api/feedback_private/feedback_service.h"
+#include "chrome/browser/feedback/system_logs/chrome_system_logs_fetcher.h"
 #include "chrome/browser/profiles/profile.h"
+#include "components/feedback/system_logs/system_logs_fetcher.h"
 
 using feedback::FeedbackData;
 
@@ -34,7 +35,7 @@
   feedback_data->set_description(description);
   feedback_data->SetAndCompressSystemInfo(std::move(sys_info));
 
-  GetFeedbackService(profile)->SendFeedback(profile, feedback_data, callback);
+  GetFeedbackService(profile)->SendFeedback(feedback_data, callback);
 }
 
 }  // namespace
@@ -42,7 +43,10 @@
 void SendSysLogFeedback(Profile* profile,
                         const std::string& description,
                         const SendSysLogFeedbackCallback& callback) {
-  GetFeedbackService(profile)->GetSystemInformation(
+  // |fetcher| deletes itself after calling its callback.
+  system_logs::SystemLogsFetcher* fetcher =
+      system_logs::BuildChromeSystemLogsFetcher();
+  fetcher->Fetch(
       base::Bind(&OnGetSystemInformation, profile, description, callback));
 }
 
diff --git a/chrome/browser/chromeos/file_manager/external_filesystem_apitest.cc b/chrome/browser/chromeos/file_manager/external_filesystem_apitest.cc
index 150f3500..928d1c5 100644
--- a/chrome/browser/chromeos/file_manager/external_filesystem_apitest.cc
+++ b/chrome/browser/chromeos/file_manager/external_filesystem_apitest.cc
@@ -467,9 +467,12 @@
   // DriveIntegrationService factory function for this test.
   drive::DriveIntegrationService* CreateDriveIntegrationService(
       Profile* profile) {
-    // Ignore signin profile.
-    if (profile->GetPath() == chromeos::ProfileHelper::GetSigninProfileDir())
+    // Ignore signin and lock screen apps profile.
+    if (profile->GetPath() == chromeos::ProfileHelper::GetSigninProfileDir() ||
+        profile->GetPath() ==
+            chromeos::ProfileHelper::GetLockScreenAppProfilePath()) {
       return nullptr;
+    }
 
     // DriveFileSystemExtensionApiTest doesn't expect that several user profiles
     // could exist simultaneously.
diff --git a/chrome/browser/chromeos/first_run/first_run.cc b/chrome/browser/chromeos/first_run/first_run.cc
index 9b211159..9c836edd 100644
--- a/chrome/browser/chromeos/first_run/first_run.cc
+++ b/chrome/browser/chromeos/first_run/first_run.cc
@@ -14,6 +14,8 @@
 #include "chrome/browser/chromeos/login/wizard_controller.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/policy/profile_policy_connector.h"
+#include "chrome/browser/policy/profile_policy_connector_factory.h"
 #include "chrome/browser/prefs/pref_service_syncable_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/signin_manager_factory.h"
@@ -72,6 +74,10 @@
     return;
   }
 
+  if (policy::ProfilePolicyConnectorFactory::GetForBrowserContext(profile)
+          ->IsManaged())
+    return;
+
   if (command_line->HasSwitch(::switches::kTestType))
     return;
 
@@ -152,10 +158,10 @@
 }  // namespace
 
 void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
-  registry->RegisterBooleanPref(
-      prefs::kFirstRunTutorialShown,
-      false,
-      user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF);
+  // This preference used to be syncable, change it to non-syncable so new
+  // users will always see the welcome app on a new device.
+  // See crbug.com/752361
+  registry->RegisterBooleanPref(prefs::kFirstRunTutorialShown, false);
 }
 
 void MaybeLaunchDialogAfterSessionStart() {
diff --git a/chrome/browser/chromeos/first_run/goodies_displayer_browsertest.cc b/chrome/browser/chromeos/first_run/goodies_displayer_browsertest.cc
index e19be6e..1915915b 100644
--- a/chrome/browser/chromeos/first_run/goodies_displayer_browsertest.cc
+++ b/chrome/browser/chromeos/first_run/goodies_displayer_browsertest.cc
@@ -2,9 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "chrome/browser/chromeos/first_run/goodies_displayer.h"
+
 #include "base/command_line.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/first_run/goodies_displayer.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
@@ -84,6 +85,13 @@
   // InProcessBrowserTest overrides.
   void SetUpDefaultCommandLine(base::CommandLine* command_line) override {
     base::CommandLine default_command_line(base::CommandLine::NO_PROGRAM);
+    if (command_line->HasSwitch(switches::kMus)) {
+      default_command_line.AppendSwitch(switches::kMus);
+    } else if (command_line->HasSwitch(switches::kMusConfig)) {
+      default_command_line.AppendSwitchASCII(
+          switches::kMusConfig,
+          command_line->GetSwitchValueASCII(switches::kMusConfig));
+    }
     InProcessBrowserTest::SetUpDefaultCommandLine(&default_command_line);
     if (NoFirstRunSpecified()) {  // --no-first-run is present by default.
       *command_line = default_command_line;
diff --git a/chrome/browser/chromeos/input_method/input_method_engine_browsertests.cc b/chrome/browser/chromeos/input_method/input_method_engine_browsertests.cc
index 37740abc..2ccc952 100644
--- a/chrome/browser/chromeos/input_method/input_method_engine_browsertests.cc
+++ b/chrome/browser/chromeos/input_method/input_method_engine_browsertests.cc
@@ -563,20 +563,20 @@
     const ui::CompositionText& composition_text =
         mock_input_context->last_update_composition_arg().composition_text;
     EXPECT_EQ(base::UTF8ToUTF16("COMPOSITION_TEXT"), composition_text.text);
-    const ui::CompositionUnderlines underlines = composition_text.underlines;
+    const ui::ImeTextSpans ime_text_spans = composition_text.ime_text_spans;
 
-    ASSERT_EQ(2U, underlines.size());
+    ASSERT_EQ(2U, ime_text_spans.size());
     // single underline
-    EXPECT_EQ(SK_ColorBLACK, underlines[0].color);
-    EXPECT_FALSE(underlines[0].thick);
-    EXPECT_EQ(0U, underlines[0].start_offset);
-    EXPECT_EQ(5U, underlines[0].end_offset);
+    EXPECT_EQ(SK_ColorBLACK, ime_text_spans[0].color);
+    EXPECT_FALSE(ime_text_spans[0].thick);
+    EXPECT_EQ(0U, ime_text_spans[0].start_offset);
+    EXPECT_EQ(5U, ime_text_spans[0].end_offset);
 
     // double underline
-    EXPECT_EQ(SK_ColorBLACK, underlines[1].color);
-    EXPECT_TRUE(underlines[1].thick);
-    EXPECT_EQ(6U, underlines[1].start_offset);
-    EXPECT_EQ(10U, underlines[1].end_offset);
+    EXPECT_EQ(SK_ColorBLACK, ime_text_spans[1].color);
+    EXPECT_TRUE(ime_text_spans[1].thick);
+    EXPECT_EQ(6U, ime_text_spans[1].start_offset);
+    EXPECT_EQ(10U, ime_text_spans[1].end_offset);
   }
   {
     SCOPED_TRACE("clearComposition test");
@@ -1027,14 +1027,14 @@
     const ui::CompositionText& composition_text =
         mock_input_context->last_update_composition_arg().composition_text;
     EXPECT_EQ(base::UTF8ToUTF16("us"), composition_text.text);
-    const ui::CompositionUnderlines underlines = composition_text.underlines;
+    const ui::ImeTextSpans ime_text_spans = composition_text.ime_text_spans;
 
-    ASSERT_EQ(1U, underlines.size());
+    ASSERT_EQ(1U, ime_text_spans.size());
     // single underline
-    EXPECT_EQ(SK_ColorBLACK, underlines[0].color);
-    EXPECT_FALSE(underlines[0].thick);
-    EXPECT_EQ(0U, underlines[0].start_offset);
-    EXPECT_EQ(1U, underlines[0].end_offset);
+    EXPECT_EQ(SK_ColorBLACK, ime_text_spans[0].color);
+    EXPECT_FALSE(ime_text_spans[0].thick);
+    EXPECT_EQ(0U, ime_text_spans[0].start_offset);
+    EXPECT_EQ(1U, ime_text_spans[0].end_offset);
     EXPECT_TRUE(mock_input_context->last_commit_text().empty());
 
     InputMethodManager::Get()->GetActiveIMEState()->ChangeInputMethod(
diff --git a/chrome/browser/chromeos/input_method/textinput_surroundingtext_browsertest.cc b/chrome/browser/chromeos/input_method/textinput_surroundingtext_browsertest.cc
index d8ac3f04..f03a9a1 100644
--- a/chrome/browser/chromeos/input_method/textinput_surroundingtext_browsertest.cc
+++ b/chrome/browser/chromeos/input_method/textinput_surroundingtext_browsertest.cc
@@ -10,7 +10,6 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_test_utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "ui/base/ime/composition_underline.h"
 
 namespace chromeos {
 
diff --git a/chrome/browser/chromeos/lock_screen_apps/app_manager_impl.cc b/chrome/browser/chromeos/lock_screen_apps/app_manager_impl.cc
index 92181d0..5c96c03 100644
--- a/chrome/browser/chromeos/lock_screen_apps/app_manager_impl.cc
+++ b/chrome/browser/chromeos/lock_screen_apps/app_manager_impl.cc
@@ -15,9 +15,11 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string16.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "base/time/tick_clock.h"
 #include "chrome/browser/chromeos/note_taking_helper.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/extensions/extension_assets_manager.h"
@@ -40,6 +42,38 @@
 using ExtensionCallback = base::Callback<void(
     const scoped_refptr<const extensions::Extension>& extension)>;
 
+// The lock screen note taking availability state.
+// Used to report UMA histograms - the values should map to
+// LockScreenActionAvailability UMA enum values, and the values assigned to
+// enum states should NOT be changed.
+enum class ActionAvailability {
+  kAvailable = 0,
+  kNoActionHandlerApp = 1,
+  kAppNotSupportingLockScreen = 2,
+  kActionNotEnabledOnLockScreen = 3,
+  kDisallowedByPolicy = 4,
+  kCount,
+};
+
+ActionAvailability GetLockScreenNoteTakingAvailability(
+    chromeos::NoteTakingAppInfo* app_info) {
+  if (!app_info || !app_info->preferred)
+    return ActionAvailability::kNoActionHandlerApp;
+
+  switch (app_info->lock_screen_support) {
+    case chromeos::NoteTakingLockScreenSupport::kNotSupported:
+      return ActionAvailability::kAppNotSupportingLockScreen;
+    case chromeos::NoteTakingLockScreenSupport::kSupported:
+      return ActionAvailability::kActionNotEnabledOnLockScreen;
+    case chromeos::NoteTakingLockScreenSupport::kNotAllowedByPolicy:
+      return ActionAvailability::kDisallowedByPolicy;
+    case chromeos::NoteTakingLockScreenSupport::kEnabled:
+      return ActionAvailability::kAvailable;
+  }
+
+  return ActionAvailability::kAppNotSupportingLockScreen;
+}
+
 void InvokeCallbackOnTaskRunner(
     const ExtensionCallback& callback,
     const scoped_refptr<base::SequencedTaskRunner>& task_runner,
@@ -113,8 +147,9 @@
 
 }  // namespace
 
-AppManagerImpl::AppManagerImpl()
-    : extensions_observer_(this),
+AppManagerImpl::AppManagerImpl(base::TickClock* tick_clock)
+    : tick_clock_(tick_clock),
+      extensions_observer_(this),
       note_taking_helper_observer_(this),
       weak_ptr_factory_(this) {}
 
@@ -264,12 +299,15 @@
   std::unique_ptr<chromeos::NoteTakingAppInfo> note_taking_app =
       chromeos::NoteTakingHelper::Get()->GetPreferredChromeAppInfo(
           primary_profile_);
+  ActionAvailability availability =
+      GetLockScreenNoteTakingAvailability(note_taking_app.get());
 
-  if (!note_taking_app || !note_taking_app->preferred ||
-      note_taking_app->lock_screen_support !=
-          chromeos::NoteTakingLockScreenSupport::kEnabled) {
+  UMA_HISTOGRAM_ENUMERATION(
+      "Apps.LockScreen.NoteTakingApp.AvailabilityOnScreenLock", availability,
+      ActionAvailability::kCount);
+
+  if (availability != ActionAvailability::kAvailable)
     return std::string();
-  }
 
   return note_taking_app->app_id;
 }
@@ -325,14 +363,20 @@
           lock_screen_service->install_directory(), lock_screen_profile_,
           base::Bind(&InvokeCallbackOnTaskRunner,
                      base::Bind(&AppManagerImpl::CompleteLockScreenAppInstall,
-                                weak_ptr_factory_.GetWeakPtr(), install_count_),
+                                weak_ptr_factory_.GetWeakPtr(), install_count_,
+                                tick_clock_->NowTicks()),
                      base::ThreadTaskRunnerHandle::Get())));
   return State::kActivating;
 }
 
 void AppManagerImpl::CompleteLockScreenAppInstall(
     int install_id,
+    base::TimeTicks install_start_time,
     const scoped_refptr<const extensions::Extension>& app) {
+  UMA_HISTOGRAM_TIMES(
+      "Apps.LockScreen.NoteTakingApp.LockScreenInstallationDuration",
+      tick_clock_->NowTicks() - install_start_time);
+
   // Bail out if the app manager is no longer waiting for this app's
   // installation - the copied resources will be cleaned up when the (ephemeral)
   // lock screen profile is destroyed.
diff --git a/chrome/browser/chromeos/lock_screen_apps/app_manager_impl.h b/chrome/browser/chromeos/lock_screen_apps/app_manager_impl.h
index 4f658cd..61a230e 100644
--- a/chrome/browser/chromeos/lock_screen_apps/app_manager_impl.h
+++ b/chrome/browser/chromeos/lock_screen_apps/app_manager_impl.h
@@ -11,12 +11,17 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observer.h"
+#include "base/time/time.h"
 #include "chrome/browser/chromeos/lock_screen_apps/app_manager.h"
 #include "chrome/browser/chromeos/note_taking_helper.h"
 #include "extensions/browser/extension_registry_observer.h"
 
 class Profile;
 
+namespace base {
+class TickClock;
+}
+
 namespace extensions {
 class Extension;
 class ExtensionRegistry;
@@ -29,7 +34,7 @@
                        public chromeos::NoteTakingHelper::Observer,
                        public extensions::ExtensionRegistryObserver {
  public:
-  AppManagerImpl();
+  explicit AppManagerImpl(base::TickClock* tick_clock);
   ~AppManagerImpl() override;
 
   // AppManager implementation:
@@ -77,6 +82,7 @@
   //     installation failed.
   void CompleteLockScreenAppInstall(
       int install_id,
+      base::TimeTicks install_start_time,
       const scoped_refptr<const extensions::Extension>& app);
 
   // Installs app to the lock screen profile's extension service and enables
@@ -106,6 +112,8 @@
   State state_ = State::kNotInitialized;
   std::string lock_screen_app_id_;
 
+  base::TickClock* tick_clock_;
+
   ScopedObserver<extensions::ExtensionRegistry,
                  extensions::ExtensionRegistryObserver>
       extensions_observer_;
diff --git a/chrome/browser/chromeos/lock_screen_apps/app_manager_impl_unittest.cc b/chrome/browser/chromeos/lock_screen_apps/app_manager_impl_unittest.cc
index 4ff90d6e..d459dd5c 100644
--- a/chrome/browser/chromeos/lock_screen_apps/app_manager_impl_unittest.cc
+++ b/chrome/browser/chromeos/lock_screen_apps/app_manager_impl_unittest.cc
@@ -14,6 +14,7 @@
 #include "base/json/json_file_value_serializer.h"
 #include "base/memory/ptr_util.h"
 #include "base/test/scoped_command_line.h"
+#include "base/test/simple_test_tick_clock.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h"
@@ -358,7 +359,9 @@
 
   AppManager* app_manager() { return app_manager_.get(); }
 
-  void ResetAppManager() { app_manager_ = base::MakeUnique<AppManagerImpl>(); }
+  void ResetAppManager() {
+    app_manager_ = base::MakeUnique<AppManagerImpl>(&tick_clock_);
+  }
 
   int note_taking_changed_count() const { return note_taking_changed_count_; }
 
@@ -378,6 +381,9 @@
 
   int NoteTakingChangedCountOnStart() { return IsInstallAsync() ? 1 : 0; }
 
+ protected:
+  base::SimpleTestTickClock tick_clock_;
+
  private:
   void OnNoteTakingChanged() { ++note_taking_changed_count_; }
 
diff --git a/chrome/browser/chromeos/lock_screen_apps/app_window_metrics_tracker.cc b/chrome/browser/chromeos/lock_screen_apps/app_window_metrics_tracker.cc
new file mode 100644
index 0000000..2f82e60
--- /dev/null
+++ b/chrome/browser/chromeos/lock_screen_apps/app_window_metrics_tracker.cc
@@ -0,0 +1,172 @@
+// 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/chromeos/lock_screen_apps/app_window_metrics_tracker.h"
+
+#include "base/metrics/histogram_macros.h"
+#include "base/time/tick_clock.h"
+#include "base/time/time.h"
+#include "extensions/browser/app_window/app_window.h"
+
+namespace {
+
+// Name of the count histogram used to keep track of (1-indexed) app launch
+// request ordinal number in a lock screen session.
+const char kAppLaunchOrdinalNumberInLockSession[] =
+    "Apps.LockScreen.NoteTakingApp.LaunchRequestOrdinalNumber";
+
+// Name of the histogram that tracks total amount of time an app window was
+// active for a single launch event - i.e. time from app window being shown to
+// app window closure.
+const char kTotalAppWindowSessionTime[] =
+    "Apps.LockScreen.NoteTakingApp.AppWindowLifeTime.TotalActive";
+
+// Name of the histogram that tracks amount of time an app window was in
+// foreground, on top the lock screen.
+const char kTimeAppWindowInForeground[] =
+    "Apps.LockScreen.NoteTakingApp.AppWindowLifeTime.Foreground";
+
+// Name of the histogram that track amount of time an app window was in
+// background, behind the lock screen.
+const char kTimeAppWindowInBackground[] =
+    "Apps.LockScreen.NoteTakingApp.AppWindowLifeTime.Background";
+
+// Name of the histogram that tracks the amount time needed to show an app
+// window (the window render view being created) after the app launch was
+// requested.
+const char kTimeFromLaunchToWindowBeingShown[] =
+    "Apps.LockScreen.NoteTakingApp.TimeToShowWindow";
+
+// Name of the histogram that tracks the amount of time needed to load the an
+// app window contents after the app launch was requested.
+const char kTimeToLoadAppWindowContents[] =
+    "Apps.LockScreen.NoteTakingApp.TimeToLoadAppWindowContents";
+
+// The name of the histogram that tracks the amount of time the app was in
+// launching state when the launch got canceled.
+const char kLaunchDurationAtLaunchCancel[] =
+    "Apps.LockScreen.NoteTakingApp.LaunchDurationAtLaunchCancel";
+
+// The name of the histogram that track the app state when the app lock screen
+// ends.
+const char kAppWindowStateOnRemoval[] =
+    "Apps.LockScreen.NoteTakingApp.FinalAppSessionState";
+
+}  // namespace
+
+namespace lock_screen_apps {
+
+AppWindowMetricsTracker::AppWindowMetricsTracker(base::TickClock* clock)
+    : clock_(clock) {}
+
+AppWindowMetricsTracker::~AppWindowMetricsTracker() = default;
+
+void AppWindowMetricsTracker::AppLaunchRequested() {
+  DCHECK_EQ(State::kInitial, state_);
+  SetState(State::kLaunchRequested);
+
+  ++app_launch_count_;
+  UMA_HISTOGRAM_COUNTS_100(kAppLaunchOrdinalNumberInLockSession,
+                           app_launch_count_);
+}
+
+void AppWindowMetricsTracker::MovedToForeground() {
+  DCHECK_NE(State::kInitial, state_);
+
+  if (state_ == State::kForeground)
+    return;
+
+  if (state_ == State::kBackground) {
+    SetState(State::kForeground);
+    return;
+  }
+
+  // Not expected to be in a state different than foreground or background
+  // after |state_after_window_contents_load_| is reset.
+  DCHECK(state_after_window_contents_load_.has_value());
+  state_after_window_contents_load_ = State::kForeground;
+}
+
+void AppWindowMetricsTracker::MovedToBackground() {
+  DCHECK_NE(State::kInitial, state_);
+
+  if (state_ == State::kBackground)
+    return;
+
+  if (state_ == State::kForeground) {
+    SetState(State::kBackground);
+    return;
+  }
+
+  // Not expected to be in a state different than foreground or background
+  // after |state_after_window_contents_load_| is reset.
+  DCHECK(state_after_window_contents_load_.has_value());
+  state_after_window_contents_load_ = State::kBackground;
+}
+
+void AppWindowMetricsTracker::AppWindowCreated(
+    extensions::AppWindow* app_window) {
+  Observe(app_window->web_contents());
+
+  SetState(State::kWindowCreated);
+}
+
+void AppWindowMetricsTracker::Reset() {
+  if (state_ == State::kInitial)
+    return;
+
+  UMA_HISTOGRAM_ENUMERATION(kAppWindowStateOnRemoval, state_, State::kCount);
+
+  if (state_ != State::kLaunchRequested && state_ != State::kWindowCreated) {
+    UMA_HISTOGRAM_LONG_TIMES(
+        kTotalAppWindowSessionTime,
+        clock_->NowTicks() - time_stamps_[State::kWindowShown]);
+  } else {
+    UMA_HISTOGRAM_TIMES(
+        kLaunchDurationAtLaunchCancel,
+        clock_->NowTicks() - time_stamps_[State::kLaunchRequested]);
+  }
+
+  SetState(State::kInitial);
+
+  state_after_window_contents_load_ = State::kForeground;
+
+  time_stamps_.clear();
+}
+
+void AppWindowMetricsTracker::RenderViewCreated(
+    content::RenderViewHost* render_view_host) {
+  SetState(State::kWindowShown);
+
+  UMA_HISTOGRAM_TIMES(
+      kTimeFromLaunchToWindowBeingShown,
+      clock_->NowTicks() - time_stamps_[State::kLaunchRequested]);
+}
+
+void AppWindowMetricsTracker::DocumentOnLoadCompletedInMainFrame() {
+  State next_state = state_after_window_contents_load_.value();
+  state_after_window_contents_load_.reset();
+  SetState(next_state);
+
+  UMA_HISTOGRAM_TIMES(kTimeToLoadAppWindowContents,
+                      clock_->NowTicks() - time_stamps_[State::kWindowShown]);
+}
+
+void AppWindowMetricsTracker::SetState(State state) {
+  if (state_ == state)
+    return;
+
+  if (state_ == State::kForeground) {
+    UMA_HISTOGRAM_MEDIUM_TIMES(kTimeAppWindowInForeground,
+                               clock_->NowTicks() - time_stamps_[state_]);
+  } else if (state_ == State::kBackground) {
+    UMA_HISTOGRAM_MEDIUM_TIMES(kTimeAppWindowInBackground,
+                               clock_->NowTicks() - time_stamps_[state_]);
+  }
+
+  state_ = state;
+  time_stamps_[state] = clock_->NowTicks();
+}
+
+}  // namespace lock_screen_apps
diff --git a/chrome/browser/chromeos/lock_screen_apps/app_window_metrics_tracker.h b/chrome/browser/chromeos/lock_screen_apps/app_window_metrics_tracker.h
new file mode 100644
index 0000000..a5c95ab
--- /dev/null
+++ b/chrome/browser/chromeos/lock_screen_apps/app_window_metrics_tracker.h
@@ -0,0 +1,86 @@
+// 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_CHROMEOS_LOCK_SCREEN_APPS_APP_WINDOW_METRICS_TRACKER_H_
+#define CHROME_BROWSER_CHROMEOS_LOCK_SCREEN_APPS_APP_WINDOW_METRICS_TRACKER_H_
+
+#include <map>
+
+#include "base/macros.h"
+#include "base/optional.h"
+#include "base/time/time.h"
+#include "content/public/browser/web_contents_observer.h"
+
+namespace base {
+class TickClock;
+}
+
+namespace extensions {
+class AppWindow;
+}
+
+namespace lock_screen_apps {
+
+// Helper for tracking metrics for lock screen app window launches.
+class AppWindowMetricsTracker : public content::WebContentsObserver {
+ public:
+  explicit AppWindowMetricsTracker(base::TickClock* clock);
+  ~AppWindowMetricsTracker() override;
+
+  // Register app launch request.
+  void AppLaunchRequested();
+
+  // Registers the app window created for lock screen action - the class
+  // will begin observing the app window state as a result.
+  void AppWindowCreated(extensions::AppWindow* app_window);
+
+  // Updates metrics state for app window being moved to foreground.
+  void MovedToForeground();
+
+  // Updates metrics state for app window being moved to background.
+  void MovedToBackground();
+
+  // Stops tracking current app window state, and resets collected timestamps.
+  void Reset();
+
+  // content::WebContentsObserver:
+  void RenderViewCreated(content::RenderViewHost* render_view_host) override;
+  void DocumentOnLoadCompletedInMainFrame() override;
+
+ private:
+  // NOTE: Used in histograms - do not change order, or remove entries.
+  // Also, update LockScreenAppSessionState enum.
+  enum class State {
+    kInitial = 0,
+    kLaunchRequested = 1,
+    kWindowCreated = 2,
+    kWindowShown = 3,
+    kForeground = 4,
+    kBackground = 5,
+    kCount
+  };
+
+  void SetState(State state);
+
+  base::TickClock* clock_;
+
+  State state_ = State::kInitial;
+
+  // Maps states to their last occurrence time.
+  std::map<State, base::TimeTicks> time_stamps_;
+
+  // Number of times app launch was requested during the
+  int app_launch_count_ = 0;
+
+  // The state to which the metrics tracker should move after
+  // the window contents is loaded.
+  // Should be either kForeground or kBackground.
+  base::Optional<State> state_after_window_contents_load_ = State::kForeground;
+
+  DISALLOW_COPY_AND_ASSIGN(AppWindowMetricsTracker);
+};
+
+}  // namespace lock_screen_apps
+
+#endif  // CHROME_BROWSER_CHROMEOS_LOCK_SCREEN_APPS_APP_WINDOW_METRICS_TRACKER_H_
diff --git a/chrome/browser/chromeos/lock_screen_apps/state_controller.cc b/chrome/browser/chromeos/lock_screen_apps/state_controller.cc
index 843225e6..18b8f214 100644
--- a/chrome/browser/chromeos/lock_screen_apps/state_controller.cc
+++ b/chrome/browser/chromeos/lock_screen_apps/state_controller.cc
@@ -11,10 +11,13 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/memory/ptr_util.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/path_service.h"
 #include "base/strings/string16.h"
+#include "base/time/default_tick_clock.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/lock_screen_apps/app_manager_impl.h"
+#include "chrome/browser/chromeos/lock_screen_apps/app_window_metrics_tracker.h"
 #include "chrome/browser/chromeos/lock_screen_apps/focus_cycler_delegate.h"
 #include "chrome/browser/chromeos/note_taking_helper.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
@@ -25,6 +28,7 @@
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
+#include "components/safe_browsing/common/safe_browsing_prefs.h"
 #include "components/session_manager/core/session_manager.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/service_manager_connection.h"
@@ -118,6 +122,8 @@
 }
 
 void StateController::Initialize() {
+  tick_clock_ = base::MakeUnique<base::DefaultTickClock>();
+
   // The tray action ptr might be set previously if the client was being created
   // for testing.
   if (!tray_action_ptr_) {
@@ -144,7 +150,8 @@
   lock_screen_data_.reset();
   if (app_manager_) {
     app_manager_->Stop();
-    ResetNoteTakingWindowAndMoveToNextState(true /*close_window*/);
+    ResetNoteTakingWindowAndMoveToNextState(true /*close_window*/,
+                                            NoteTakingExitReason::kShutdown);
     app_manager_.reset();
   }
   focus_cycler_delegate_ = nullptr;
@@ -159,8 +166,15 @@
                                       Profile::CreateStatus status) {
   // Ignore CREATED status - wait for profile to be initialized before
   // continuing.
-  if (status == Profile::CREATE_STATUS_CREATED)
+  if (status == Profile::CREATE_STATUS_CREATED) {
+    // Disable safe browsing for the profile to avoid activating
+    // SafeBrowsingService when the user has safe browsing disabled (reasoning
+    // similar to http://crbug.com/461493).
+    // TODO(tbarzic): Revisit this if webviews get enabled for lock screen apps.
+    lock_screen_profile->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled,
+                                                false);
     return;
+  }
 
   // On error, bail out - this will cause the lock screen apps to remain
   // unavailable on the device.
@@ -219,7 +233,7 @@
 
   // App manager might have been set previously by a test.
   if (!app_manager_)
-    app_manager_ = base::MakeUnique<AppManagerImpl>();
+    app_manager_ = base::MakeUnique<AppManagerImpl>(tick_clock_.get());
   app_manager_->Initialize(profile, lock_screen_profile_->GetOriginalProfile());
 
   input_devices_observer_.Add(ui::InputDeviceManager::GetInstance());
@@ -262,23 +276,19 @@
 }
 
 void StateController::RequestNewLockScreenNote() {
-  if (lock_screen_note_state_ != TrayActionState::kAvailable)
-    return;
-
-  DCHECK(app_manager_->IsNoteTakingAppAvailable());
-
-  // Update state to launching even if app fails to launch - this is to notify
-  // listeners that a lock screen note request was handled.
-  UpdateLockScreenNoteState(TrayActionState::kLaunching);
-  if (!app_manager_->LaunchNoteTaking())
-    UpdateLockScreenNoteState(TrayActionState::kAvailable);
+  HandleNewNoteRequest(NewNoteRequestType::kTrayAction);
 }
 
 void StateController::OnSessionStateChanged() {
   if (!session_manager::SessionManager::Get()->IsScreenLocked()) {
     lock_screen_data_->SetSessionLocked(false);
     app_manager_->Stop();
-    ResetNoteTakingWindowAndMoveToNextState(true /*close_window*/);
+    if (lock_screen_note_state_ == TrayActionState::kBackground) {
+      RecordLockScreenAppUnlockAction(LockScreenUnlockAction::kSessionUnlocked);
+    }
+    ResetNoteTakingWindowAndMoveToNextState(
+        true /*close_window*/, NoteTakingExitReason::kSessionUnlock);
+    note_app_window_metrics_.reset();
     return;
   }
 
@@ -288,14 +298,23 @@
   app_manager_->Start(
       base::Bind(&StateController::OnNoteTakingAvailabilityChanged,
                  base::Unretained(this)));
+  note_app_window_metrics_ =
+      base::MakeUnique<AppWindowMetricsTracker>(tick_clock_.get());
   lock_screen_data_->SetSessionLocked(true);
   OnNoteTakingAvailabilityChanged();
 }
 
+void StateController::OnAppWindowAdded(extensions::AppWindow* app_window) {
+  if (note_app_window_ != app_window)
+    return;
+  note_app_window_metrics_->AppWindowCreated(app_window);
+}
+
 void StateController::OnAppWindowRemoved(extensions::AppWindow* app_window) {
   if (note_app_window_ != app_window)
     return;
-  ResetNoteTakingWindowAndMoveToNextState(false /*close_window*/);
+  ResetNoteTakingWindowAndMoveToNextState(
+      false /*close_window*/, NoteTakingExitReason::kAppWindowClosed);
 }
 
 void StateController::OnStylusStateChanged(ui::StylusState state) {
@@ -303,16 +322,19 @@
     return;
 
   if (state == ui::StylusState::REMOVED)
-    RequestNewLockScreenNote();
+    HandleNewNoteRequest(NewNoteRequestType::kStylusEject);
 }
 
 void StateController::BrightnessChanged(int level, bool user_initiated) {
-  if (level == 0 && !user_initiated)
-    ResetNoteTakingWindowAndMoveToNextState(true /*close_window*/);
+  if (level == 0 && !user_initiated) {
+    ResetNoteTakingWindowAndMoveToNextState(
+        true /*close_window*/, NoteTakingExitReason::kScreenDimmed);
+  }
 }
 
 void StateController::SuspendImminent() {
-  ResetNoteTakingWindowAndMoveToNextState(true /*close_window*/);
+  ResetNoteTakingWindowAndMoveToNextState(true /*close_window*/,
+                                          NoteTakingExitReason::kSuspend);
 }
 
 extensions::AppWindow* StateController::CreateAppWindowForLockScreenAction(
@@ -362,8 +384,10 @@
 
 void StateController::MoveToBackground() {
   if (GetLockScreenNoteState() == TrayActionState::kLaunching) {
+    note_app_window_metrics_->Reset();
     UpdateLockScreenNoteState(TrayActionState::kAvailable);
   } else if (GetLockScreenNoteState() == TrayActionState::kActive) {
+    note_app_window_metrics_->MovedToBackground();
     UpdateLockScreenNoteState(TrayActionState::kBackground);
   }
 }
@@ -371,14 +395,58 @@
 void StateController::MoveToForeground() {
   if (GetLockScreenNoteState() != TrayActionState::kBackground)
     return;
+
+  RecordLockScreenAppUnlockAction(LockScreenUnlockAction::kUnlockCancelled);
+
+  note_app_window_metrics_->MovedToForeground();
   UpdateLockScreenNoteState(TrayActionState::kActive);
 }
 
+void StateController::HandleNewNoteRequestFromLockScreen(
+    NewNoteRequestType type) {
+  DCHECK(type == NewNoteRequestType::kLockScreenUiTap ||
+         type == NewNoteRequestType::kLockScreenUiSwipe ||
+         type == NewNoteRequestType::kLockScreenUiKeyboard);
+
+  HandleNewNoteRequest(type);
+}
+
+void StateController::RecordLockScreenAppUnlockAction(
+    LockScreenUnlockAction action) {
+  if (lock_screen_note_state_ != TrayActionState::kBackground)
+    return;
+
+  UMA_HISTOGRAM_ENUMERATION("Apps.LockScreen.NoteTakingApp.UnlockUIAction",
+                            action, LockScreenUnlockAction::kCount);
+}
+
+void StateController::HandleNewNoteRequest(NewNoteRequestType type) {
+  if (lock_screen_note_state_ != TrayActionState::kAvailable)
+    return;
+
+  DCHECK(app_manager_->IsNoteTakingAppAvailable());
+
+  UMA_HISTOGRAM_ENUMERATION("Apps.LockScreen.NoteTakingApp.LaunchRequestReason",
+                            type, NewNoteRequestType::kCount);
+
+  // Update state to launching even if app fails to launch - this is to notify
+  // listeners that a lock screen note request was handled.
+  UpdateLockScreenNoteState(TrayActionState::kLaunching);
+  if (!app_manager_->LaunchNoteTaking()) {
+    UpdateLockScreenNoteState(TrayActionState::kAvailable);
+    return;
+  }
+
+  note_app_window_metrics_->AppLaunchRequested();
+}
+
 void StateController::OnNoteTakingAvailabilityChanged() {
   if (!app_manager_->IsNoteTakingAppAvailable() ||
       (note_app_window_ && note_app_window_->GetExtension()->id() !=
                                app_manager_->GetNoteTakingAppId())) {
-    ResetNoteTakingWindowAndMoveToNextState(true /*close_window*/);
+    ResetNoteTakingWindowAndMoveToNextState(
+        true /*close_window*/,
+        NoteTakingExitReason::kAppLockScreenSupportDisabled);
     return;
   }
 
@@ -407,9 +475,20 @@
 }
 
 void StateController::ResetNoteTakingWindowAndMoveToNextState(
-    bool close_window) {
+    bool close_window,
+    NoteTakingExitReason exit_reason) {
   app_window_observer_.RemoveAll();
 
+  if (note_app_window_metrics_)
+    note_app_window_metrics_->Reset();
+
+  if (lock_screen_note_state_ != TrayActionState::kAvailable &&
+      lock_screen_note_state_ != TrayActionState::kNotAvailable) {
+    UMA_HISTOGRAM_ENUMERATION(
+        "Apps.LockScreen.NoteTakingApp.NoteTakingExitReason", exit_reason,
+        NoteTakingExitReason::kCount);
+  }
+
   if (note_app_window_) {
     if (focus_cycler_delegate_)
       focus_cycler_delegate_->UnregisterLockScreenAppFocusHandler();
diff --git a/chrome/browser/chromeos/lock_screen_apps/state_controller.h b/chrome/browser/chromeos/lock_screen_apps/state_controller.h
index a1ee49c..715366c 100644
--- a/chrome/browser/chromeos/lock_screen_apps/state_controller.h
+++ b/chrome/browser/chromeos/lock_screen_apps/state_controller.h
@@ -25,6 +25,10 @@
 
 class PrefRegistrySimple;
 
+namespace base {
+class TickClock;
+}
+
 namespace content {
 class BrowserContext;
 }
@@ -49,6 +53,7 @@
 
 namespace lock_screen_apps {
 
+class AppWindowMetricsTracker;
 class FocusCyclerDelegate;
 class StateObserver;
 
@@ -61,6 +66,47 @@
                         public ui::InputDeviceEventObserver,
                         public chromeos::PowerManagerClient::Observer {
  public:
+  // Type of action that triggered a request for new note.
+  // Used in histograms - should be kept in sync with
+  // NewLockScreenNoteRequestType histogram enum, and assigned values should
+  // never be changed.
+  enum class NewNoteRequestType {
+    kTrayAction = 0,
+    kLockScreenUiTap = 1,
+    kLockScreenUiSwipe = 2,
+    kLockScreenUiKeyboard = 3,
+    kStylusEject = 4,
+    kCount,
+  };
+
+  // Reason for resetting note taking app window, and exiting note taking app.
+  // Used primarily for metrics reporting.
+  // IMPORTANT: The values should be kept in sync with
+  // LockScreenNoteTakingExitReason histogram enum, and assigned values should
+  // never be changed.
+  enum class NoteTakingExitReason {
+    kSessionUnlock = 0,
+    kShutdown = 1,
+    kScreenDimmed = 2,
+    kSuspend = 3,
+    kAppWindowClosed = 4,
+    kAppLockScreenSupportDisabled = 5,
+    kCount
+  };
+
+  // Action taken by the user on lock screen when a lock screen app window was
+  // in the background - used primarily for metrics reporting.
+  // IMPORTANT: The values should be kept in sync with
+  // LockScreenNoteTakingUnlockUIAction, and assigned values should never be
+  // changed.
+  enum class LockScreenUnlockAction {
+    kSessionUnlocked = 0,
+    kUnlockCancelled = 1,
+    kShutdown = 2,
+    kSignOut = 3,
+    kCount
+  };
+
   // Returns whether the StateController is enabled - it is currently guarded by
   // a feature flag. If not enabled, |StateController| instance is not allowed
   // to be created. |Get| will still work, but it will return nullptr.
@@ -122,6 +168,7 @@
   void OnSessionStateChanged() override;
 
   // extensions::AppWindowRegistry::Observer:
+  void OnAppWindowAdded(extensions::AppWindow* app_window) override;
   void OnAppWindowRemoved(extensions::AppWindow* app_window) override;
 
   // ui::InputDeviceEventObserver:
@@ -157,6 +204,14 @@
   // windows back to foreground (i.e. visible over lock screen UI).
   void MoveToForeground();
 
+  // Handles new note requests that come from lock screen UI.
+  void HandleNewNoteRequestFromLockScreen(NewNoteRequestType type);
+
+  // Records the user action taken on lock screen when the lock screen app
+  // unlock UI is shown - i.e. when lock UI is shown on top of backgrounded
+  // lock screen app window.
+  void RecordLockScreenAppUnlockAction(LockScreenUnlockAction action);
+
  private:
   // Called when profiles needed to run lock screen apps are ready - i.e. when
   // primary user profile was set using |SetPrimaryProfile| and the profile in
@@ -178,6 +233,9 @@
   // lock screen context.
   void InitializeWithCryptoKey(Profile* profile, const std::string& crypto_key);
 
+  // Handles request to launch a new-note lock screen flow.
+  void HandleNewNoteRequest(NewNoteRequestType type);
+
   // Called when app manager reports that note taking availability has changed.
   void OnNoteTakingAvailabilityChanged();
 
@@ -185,7 +243,9 @@
   // on lock screen, unregisters the window, and closes is if |close_window| is
   // set. It changes the current state to kAvailable or kNotAvailable, depending
   // on whether lock screen note taking action can still be handled.
-  void ResetNoteTakingWindowAndMoveToNextState(bool close_window);
+  void ResetNoteTakingWindowAndMoveToNextState(
+      bool close_window,
+      NoteTakingExitReason exit_reason);
 
   // Requests lock screen note action state change to |state|.
   // Returns whether the action state has changed.
@@ -218,6 +278,11 @@
   FocusCyclerDelegate* focus_cycler_delegate_ = nullptr;
 
   extensions::AppWindow* note_app_window_ = nullptr;
+  // Used to track metrics for app window launches - it is set when the user
+  // session is locked (and reset on unlock). Note that a single instance
+  // should not be reused for different lock sessions - it tracks number of app
+  // launches per lock screen.
+  std::unique_ptr<AppWindowMetricsTracker> note_app_window_metrics_;
 
   ScopedObserver<extensions::AppWindowRegistry,
                  extensions::AppWindowRegistry::Observer>
@@ -237,6 +302,10 @@
   // to session / app manager changes.
   base::Closure ready_callback_;
 
+  // The clock used to keep track of time, for example to report app window
+  // lifetime metrics.
+  std::unique_ptr<base::TickClock> tick_clock_;
+
   base::WeakPtrFactory<StateController> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(StateController);
diff --git a/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc b/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc
index 75f6af9..577eda73 100644
--- a/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc
+++ b/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc
@@ -855,6 +855,13 @@
   // for the first time. Tell the UserImageManager that this user is not new to
   // prevent the avatar from getting changed.
   GetUserImageManager(user->GetAccountId())->UserLoggedIn(false, true);
+
+  // For public account, it's possible that the user-policy controlled wallpaper
+  // was fetched/cleared at the login screen (while for a regular user it was
+  // always fetched/cleared inside a user session), in the case the user-policy
+  // controlled wallpaper was cached/cleared by not updated in the login screen,
+  // so we need to update the wallpaper after the public user logged in.
+  WallpaperManager::Get()->SetUserWallpaperNow(user->GetAccountId());
   WallpaperManager::Get()->EnsureLoggedInUserWallpaperLoaded();
 
   SetPublicAccountDelegates();
diff --git a/chrome/browser/chromeos/login/users/default_user_image/default_user_images.cc b/chrome/browser/chromeos/login/users/default_user_image/default_user_images.cc
index ff776ec0..96c0000 100644
--- a/chrome/browser/chromeos/login/users/default_user_image/default_user_images.cc
+++ b/chrome/browser/chromeos/login/users/default_user_image/default_user_images.cc
@@ -91,6 +91,14 @@
     IDR_LOGIN_DEFAULT_USER_55,
     IDR_LOGIN_DEFAULT_USER_56,
     IDR_LOGIN_DEFAULT_USER_57,
+    IDR_LOGIN_DEFAULT_USER_58,
+    IDR_LOGIN_DEFAULT_USER_59,
+    IDR_LOGIN_DEFAULT_USER_60,
+    IDR_LOGIN_DEFAULT_USER_61,
+    IDR_LOGIN_DEFAULT_USER_62,
+    IDR_LOGIN_DEFAULT_USER_63,
+    IDR_LOGIN_DEFAULT_USER_64,
+    IDR_LOGIN_DEFAULT_USER_65,
 };
 
 const int kDefaultImagesCount = arraysize(kDefaultImageResourceIDs);
@@ -250,6 +258,14 @@
     IDS_LOGIN_DEFAULT_USER_DESC_55,
     IDS_LOGIN_DEFAULT_USER_DESC_56,
     IDS_LOGIN_DEFAULT_USER_DESC_57,
+    IDS_LOGIN_DEFAULT_USER_DESC_58,
+    IDS_LOGIN_DEFAULT_USER_DESC_59,
+    IDS_LOGIN_DEFAULT_USER_DESC_60,
+    IDS_LOGIN_DEFAULT_USER_DESC_61,
+    IDS_LOGIN_DEFAULT_USER_DESC_62,
+    IDS_LOGIN_DEFAULT_USER_DESC_63,
+    IDS_LOGIN_DEFAULT_USER_DESC_64,
+    IDS_LOGIN_DEFAULT_USER_DESC_65,
 };
 
 const int kDefaultImageDescriptionsMaxID = arraysize(kDefaultImageDescriptions);
diff --git a/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.cc b/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.cc
index 8f376eb..82cda76 100644
--- a/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.cc
+++ b/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.cc
@@ -1011,10 +1011,14 @@
   if (!wallpaper_files_id.is_valid())
     LOG(FATAL) << "Wallpaper flies id if invalid!";
 
+  // If we're at the login screen, do not change the wallpaper to the user
+  // policy controlled wallpaper but only update the cache. It will be later
+  // updated after the user logs in.
   SetCustomWallpaper(account_id, wallpaper_files_id, "policy-controlled.jpeg",
                      wallpaper::WALLPAPER_LAYOUT_CENTER_CROPPED,
                      wallpaper::POLICY, user_image->image(),
-                     true /* update wallpaper */);
+                     user_manager::UserManager::Get()
+                         ->IsUserLoggedIn() /* update wallpaper */);
 }
 
 void WallpaperManager::OnDeviceWallpaperPolicyChanged() {
diff --git a/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager_policy_browsertest.cc b/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager_policy_browsertest.cc
index 6dfaae3..41191b9b 100644
--- a/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager_policy_browsertest.cc
+++ b/chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager_policy_browsertest.cc
@@ -51,6 +51,7 @@
 #include "components/policy/proto/cloud_policy.pb.h"
 #include "components/user_manager/user.h"
 #include "components/user_manager/user_manager.h"
+#include "components/user_manager/user_names.h"
 #include "content/public/test/browser_test_utils.h"
 #include "crypto/rsa_private_key.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
@@ -287,6 +288,27 @@
               store->validation_status());
   }
 
+  // Inject |filename| as the device wallpaper policy. Set empty |filename| to
+  // clear policy.
+  void InjectDevicePolicy(const std::string& filename) {
+    if (!filename.empty()) {
+      device_policy_.payload()
+          .mutable_device_wallpaper_image()
+          ->set_device_wallpaper_image(ConstructPolicy(filename));
+    } else {
+      device_policy_.payload().Clear();
+    }
+    device_policy_.Build();
+    fake_session_manager_client_->set_device_policy(device_policy_.GetBlob());
+    fake_session_manager_client_->OnPropertyChangeComplete(true /* success */);
+  }
+
+  bool ShouldSetDeviceWallpaper(const AccountId& account_id) {
+    std::string url, hash;
+    return WallpaperManager::Get()->ShouldSetDeviceWallpaper(account_id, &url,
+                                                             &hash);
+  }
+
   // Obtain WallpaperInfo for |user_number| from WallpaperManager.
   void GetUserWallpaperInfo(int user_number,
                             wallpaper::WallpaperInfo* wallpaper_info) {
@@ -441,4 +463,41 @@
   ASSERT_EQ(kRedImageColor, GetAverageWallpaperColor());
 }
 
+IN_PROC_BROWSER_TEST_F(WallpaperManagerPolicyTest, PRE_DevicePolicyTest) {
+  SetSystemSalt();
+  RegisterUser(testUsers_[0].GetUserEmail());
+  StartupUtils::MarkOobeCompleted();
+}
+
+// Test that if device policy wallpaper and user policy wallpaper are both
+// specified, the device policy wallpaper is used in the login screen and the
+// user policy wallpaper is used inside of a user session.
+IN_PROC_BROWSER_TEST_F(WallpaperManagerPolicyTest, DevicePolicyTest) {
+  SetSystemSalt();
+
+  // Wait until default wallpaper has been loaded in the login screen.
+  RunUntilWallpaperChangeCount(1);
+
+  // Set the device wallpaper policy. Test that the device policy controlled
+  // wallpaper shows up in the login screen.
+  InjectDevicePolicy(kRedImageFileName);
+  RunUntilWallpaperChangeCount(2);
+  EXPECT_TRUE(ShouldSetDeviceWallpaper(user_manager::SignInAccountId()));
+  EXPECT_EQ(kRedImageColor, GetAverageWallpaperColor());
+
+  // Log in a test user and set the user wallpaper policy. The user policy
+  // controlled wallpaper shows up in the user session.
+  LoginUser(testUsers_[0].GetUserEmail());
+  InjectPolicy(0, kGreenImageFileName);
+  RunUntilWallpaperChangeCount(3);
+  EXPECT_EQ(kGreenImageColor, GetAverageWallpaperColor());
+
+  // Set the device wallpaper policy inside the user session. That that the
+  // user wallpaper doesn't change.
+  InjectDevicePolicy(kBlueImageFileName);
+  EXPECT_FALSE(ShouldSetDeviceWallpaper(
+      user_manager::UserManager::Get()->GetActiveUser()->GetAccountId()));
+  EXPECT_EQ(kGreenImageColor, GetAverageWallpaperColor());
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/policy/blocking_login_browsertest.cc b/chrome/browser/chromeos/policy/blocking_login_browsertest.cc
index 15a0484..aa9e1895 100644
--- a/chrome/browser/chromeos/policy/blocking_login_browsertest.cc
+++ b/chrome/browser/chromeos/policy/blocking_login_browsertest.cc
@@ -18,6 +18,7 @@
 #include "chrome/browser/chromeos/login/ui/webui_login_display.h"
 #include "chrome/browser/chromeos/login/wizard_controller.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/chromeos/settings/install_attributes.h"
 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
 #include "chrome/common/chrome_switches.h"
@@ -124,6 +125,10 @@
                const content::NotificationSource& source,
                const content::NotificationDetails& details) override {
     ASSERT_EQ(chrome::NOTIFICATION_PROFILE_ADDED, type);
+    if (chromeos::ProfileHelper::IsLockScreenAppProfile(
+            content::Source<Profile>(source).ptr())) {
+      return;
+    }
     ASSERT_FALSE(profile_added_);
     profile_added_ = content::Source<Profile>(source).ptr();
   }
diff --git a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
index 66ec6d60..b3533f4 100644
--- a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
+++ b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
@@ -61,6 +61,7 @@
 #include "chrome/browser/chromeos/policy/device_policy_builder.h"
 #include "chrome/browser/chromeos/policy/device_policy_cros_browser_test.h"
 #include "chrome/browser/chromeos/policy/proto/chrome_device_policy.pb.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/extensions/crx_installer.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/updater/chromeos_extension_cache_delegate.h"
@@ -833,6 +834,9 @@
     DCHECK_EQ(chrome::NOTIFICATION_PROFILE_CREATED, type);
 
     Profile* profile = content::Source<Profile>(source).ptr();
+    // Ignore lock screen apps profile.
+    if (chromeos::ProfileHelper::IsLockScreenAppProfile(profile))
+      return;
     registry_ = extensions::ExtensionRegistry::Get(profile);
 
     // Check if extension is already installed with newly created profile.
diff --git a/chrome/browser/chromeos/preferences.cc b/chrome/browser/chromeos/preferences.cc
index 52e9b6c..363f8ef 100644
--- a/chrome/browser/chromeos/preferences.cc
+++ b/chrome/browser/chromeos/preferences.cc
@@ -584,9 +584,9 @@
   if (reason != REASON_PREF_CHANGED ||
       pref_name == prefs::kUnifiedDesktopEnabledByDefault) {
     const bool enabled = unified_desktop_enabled_by_default_.GetValue();
-    // TODO: this needs to work in Config::MUS. http://crbug.com/705591.
+    // TODO: this needs to work in Config::MASH. http://crbug.com/705591.
     if (ash::Shell::HasInstance() &&
-        chromeos::GetAshConfig() == ash::Config::CLASSIC) {
+        chromeos::GetAshConfig() != ash::Config::MASH) {
       ash::Shell::Get()->display_manager()->SetUnifiedDesktopEnabled(enabled);
     }
   }
diff --git a/chrome/browser/chromeos/profiles/profile_helper.cc b/chrome/browser/chromeos/profiles/profile_helper.cc
index bd4bb1b..55a41b3 100644
--- a/chrome/browser/chromeos/profiles/profile_helper.cc
+++ b/chrome/browser/chromeos/profiles/profile_helper.cc
@@ -357,6 +357,11 @@
 
 const user_manager::User* ProfileHelper::GetUserByProfile(
     const Profile* profile) const {
+  if (ProfileHelper::IsSigninProfile(profile) ||
+      ProfileHelper::IsLockScreenAppProfile(profile)) {
+    return nullptr;
+  }
+
   // This map is non-empty only in tests.
   if (enable_profile_to_user_testing || !user_list_for_testing_.empty()) {
     if (always_return_primary_user_for_testing)
@@ -378,10 +383,6 @@
   DCHECK(!content::BrowserThread::IsThreadInitialized(
              content::BrowserThread::UI) ||
          content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
-  if (ProfileHelper::IsSigninProfile(profile) ||
-      ProfileHelper::IsLockScreenAppProfile(profile)) {
-    return nullptr;
-  }
 
   user_manager::UserManager* user_manager = user_manager::UserManager::Get();
 
diff --git a/chrome/browser/chromeos/profiles/profile_util.cc b/chrome/browser/chromeos/profiles/profile_util.cc
index ed4fa10..66550e4 100644
--- a/chrome/browser/chromeos/profiles/profile_util.cc
+++ b/chrome/browser/chromeos/profiles/profile_util.cc
@@ -25,6 +25,8 @@
   // not try to access the sign-in profile.
   if (profile->GetPath() == ProfileHelper::GetSigninProfileDir())
     return false;
+  if (profile->GetPath() == ProfileHelper::GetLockScreenAppProfilePath())
+    return false;
   return true;
 }
 
diff --git a/chrome/browser/conflicts/installed_programs_win.cc b/chrome/browser/conflicts/installed_programs_win.cc
index a6a8dbc37..0e82fce 100644
--- a/chrome/browser/conflicts/installed_programs_win.cc
+++ b/chrome/browser/conflicts/installed_programs_win.cc
@@ -8,6 +8,7 @@
 
 #include "base/callback.h"
 #include "base/memory/ptr_util.h"
+#include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/task_scheduler/post_task.h"
 #include "base/win/registry.h"
@@ -113,7 +114,7 @@
   // Ignore Microsoft programs.
   base::string16 publisher;
   if (GetValue(candidate, L"Publisher", &publisher) &&
-      publisher == L"Microsoft Corporation") {
+      base::StartsWith(publisher, L"Microsoft", base::CompareCase::SENSITIVE)) {
     return;
   }
 
diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
index 53337dd..8d5bc7ca 100644
--- a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
+++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
@@ -365,9 +365,9 @@
   if (method == chrome::devtools::Page::disable::kName)
     TogglePageEnable(false /* enable */, agent_host);
 
-  if (agent_host->GetType() == DevToolsAgentHost::kTypeBrowser &&
-      method.find("Browser.") == 0)
-    return HandleBrowserCommand(id, method, params).release();
+  auto* result = HandleBrowserCommand(id, method, params).release();
+  if (result)
+    return result;
 
   if (method == chrome::devtools::Page::setAdBlockingEnabled::kName)
     return SetAdBlockingEnabled(agent_host, id, params).release();
diff --git a/chrome/browser/devtools/devtools_ui_bindings.cc b/chrome/browser/devtools/devtools_ui_bindings.cc
index 9a2fedaa..c409fcc 100644
--- a/chrome/browser/devtools/devtools_ui_bindings.cc
+++ b/chrome/browser/devtools/devtools_ui_bindings.cc
@@ -226,6 +226,7 @@
   void ReadyForTest() override {}
   InfoBarService* GetInfoBarService() override;
   void RenderProcessGone(bool crashed) override {}
+  void ShowCertificateViewer(const std::string& cert_chain) override{};
 
   content::WebContents* web_contents_;
   DISALLOW_COPY_AND_ASSIGN(DefaultBindingsDelegate);
@@ -864,49 +865,7 @@
 }
 
 void DevToolsUIBindings::ShowCertificateViewer(const std::string& cert_chain) {
-  std::unique_ptr<base::Value> value =
-      base::JSONReader::Read(cert_chain);
-  if (!value || value->GetType() != base::Value::Type::LIST) {
-    NOTREACHED();
-    return;
-  }
-
-  std::unique_ptr<base::ListValue> list =
-      base::ListValue::From(std::move(value));
-  std::vector<std::string> decoded;
-  for (size_t i = 0; i < list->GetSize(); ++i) {
-    base::Value* item;
-    if (!list->Get(i, &item) || item->GetType() != base::Value::Type::STRING) {
-      NOTREACHED();
-      return;
-    }
-    std::string temp;
-    if (!item->GetAsString(&temp)) {
-      NOTREACHED();
-      return;
-    }
-    if (!base::Base64Decode(temp, &temp)) {
-      NOTREACHED();
-      return;
-    }
-    decoded.push_back(temp);
-  }
-
-  std::vector<base::StringPiece> cert_string_piece;
-  for (const auto& str : decoded)
-    cert_string_piece.push_back(str);
-  scoped_refptr<net::X509Certificate> cert =
-       net::X509Certificate::CreateFromDERCertChain(cert_string_piece);
-  if (!cert) {
-    NOTREACHED();
-    return;
-  }
-
-  if (!agent_host_ || !agent_host_->GetWebContents())
-    return;
-  content::WebContents* inspected_wc = agent_host_->GetWebContents();
-  web_contents_->GetDelegate()->ShowCertificateViewerInDevTools(
-      inspected_wc, cert.get());
+  delegate_->ShowCertificateViewer(cert_chain);
 }
 
 void DevToolsUIBindings::ZoomIn() {
diff --git a/chrome/browser/devtools/devtools_ui_bindings.h b/chrome/browser/devtools/devtools_ui_bindings.h
index 4dd51b7..827d8f07 100644
--- a/chrome/browser/devtools/devtools_ui_bindings.h
+++ b/chrome/browser/devtools/devtools_ui_bindings.h
@@ -65,6 +65,7 @@
     virtual void ReadyForTest() = 0;
     virtual InfoBarService* GetInfoBarService() = 0;
     virtual void RenderProcessGone(bool crashed) = 0;
+    virtual void ShowCertificateViewer(const std::string& cert_chain) = 0;
   };
 
   explicit DevToolsUIBindings(content::WebContents* web_contents);
diff --git a/chrome/browser/devtools/devtools_window.cc b/chrome/browser/devtools/devtools_window.cc
index dc0dfd6..3bda5f78 100644
--- a/chrome/browser/devtools/devtools_window.cc
+++ b/chrome/browser/devtools/devtools_window.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 #include <utility>
 
+#include "base/base64.h"
 #include "base/command_line.h"
 #include "base/json/json_reader.h"
 #include "base/macros.h"
@@ -997,18 +998,6 @@
   return main_web_contents_;
 }
 
-void DevToolsWindow::ShowCertificateViewer(
-    scoped_refptr<net::X509Certificate> certificate) {
-  WebContents* inspected_contents = is_docked_ ?
-      GetInspectedWebContents() : main_web_contents_;
-  Browser* browser = NULL;
-  int tab = 0;
-  if (!FindInspectedBrowserAndTabIndex(inspected_contents, &browser, &tab))
-    return;
-  gfx::NativeWindow parent = browser->window()->GetNativeWindow();
-  ::ShowCertificateViewer(inspected_contents, parent, certificate.get());
-}
-
 void DevToolsWindow::ActivateContents(WebContents* contents) {
   if (is_docked_) {
     WebContents* inspected_tab = GetInspectedWebContents();
@@ -1154,12 +1143,6 @@
   return blink::WebInputEvent::IsPinchGestureEventType(event.GetType());
 }
 
-void DevToolsWindow::ShowCertificateViewerInDevTools(
-    content::WebContents* web_contents,
-    scoped_refptr<net::X509Certificate> certificate) {
-  ShowCertificateViewer(certificate);
-}
-
 void DevToolsWindow::ActivateWindow() {
   if (life_stage_ != kLoadCompleted)
     return;
@@ -1297,6 +1280,54 @@
   }
 }
 
+void DevToolsWindow::ShowCertificateViewer(const std::string& cert_chain) {
+  std::unique_ptr<base::Value> value = base::JSONReader::Read(cert_chain);
+  if (!value || value->GetType() != base::Value::Type::LIST) {
+    NOTREACHED();
+    return;
+  }
+
+  std::unique_ptr<base::ListValue> list =
+      base::ListValue::From(std::move(value));
+  std::vector<std::string> decoded;
+  for (size_t i = 0; i < list->GetSize(); ++i) {
+    base::Value* item;
+    if (!list->Get(i, &item) || item->GetType() != base::Value::Type::STRING) {
+      NOTREACHED();
+      return;
+    }
+    std::string temp;
+    if (!item->GetAsString(&temp)) {
+      NOTREACHED();
+      return;
+    }
+    if (!base::Base64Decode(temp, &temp)) {
+      NOTREACHED();
+      return;
+    }
+    decoded.push_back(temp);
+  }
+
+  std::vector<base::StringPiece> cert_string_piece;
+  for (const auto& str : decoded)
+    cert_string_piece.push_back(str);
+  scoped_refptr<net::X509Certificate> cert =
+      net::X509Certificate::CreateFromDERCertChain(cert_string_piece);
+  if (!cert) {
+    NOTREACHED();
+    return;
+  }
+
+  WebContents* inspected_contents =
+      is_docked_ ? GetInspectedWebContents() : main_web_contents_;
+  Browser* browser = NULL;
+  int tab = 0;
+  if (!FindInspectedBrowserAndTabIndex(inspected_contents, &browser, &tab))
+    return;
+  gfx::NativeWindow parent = browser->window()->GetNativeWindow();
+  ::ShowCertificateViewer(inspected_contents, parent, cert.get());
+}
+
 void DevToolsWindow::OnLoadCompleted() {
   // First seed inspected tab id for extension APIs.
   WebContents* inspected_web_contents = GetInspectedWebContents();
diff --git a/chrome/browser/devtools/devtools_window.h b/chrome/browser/devtools/devtools_window.h
index ca3e0ef..c9c7121 100644
--- a/chrome/browser/devtools/devtools_window.h
+++ b/chrome/browser/devtools/devtools_window.h
@@ -127,8 +127,6 @@
       content::WebContents* source,
       const content::OpenURLParams& params) override;
 
-  void ShowCertificateViewer(scoped_refptr<net::X509Certificate> certificate);
-
   // BeforeUnload interception ////////////////////////////////////////////////
 
   // In order to preserve any edits the user may have made in devtools, the
@@ -315,9 +313,6 @@
                       const content::FileChooserParams& params) override;
   bool PreHandleGestureEvent(content::WebContents* source,
                              const blink::WebGestureEvent& event) override;
-  void ShowCertificateViewerInDevTools(
-      content::WebContents* web_contents,
-      scoped_refptr<net::X509Certificate> certificate) override;
 
   // content::DevToolsUIBindings::Delegate overrides
   void ActivateWindow() override;
@@ -335,6 +330,7 @@
   void ReadyForTest() override;
   InfoBarService* GetInfoBarService() override;
   void RenderProcessGone(bool crashed) override;
+  void ShowCertificateViewer(const std::string& cert_viewer) override;
 
   void ColorPickedInEyeDropper(int r, int g, int b, int a);
   void CreateDevToolsBrowser();
diff --git a/chrome/browser/download/DEPS b/chrome/browser/download/DEPS
index dba1ce6..32d7dc92b 100644
--- a/chrome/browser/download/DEPS
+++ b/chrome/browser/download/DEPS
@@ -1,4 +1,4 @@
 include_rules = [
   "+components/drive/drive_pref_names.h",
-  "+components/safe_browsing/csd.pb.h",
+  "+components/safe_browsing/proto/csd.pb.h",
 ]
diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc
index b3d47ee..dc37e2a 100644
--- a/chrome/browser/download/download_browsertest.cc
+++ b/chrome/browser/download/download_browsertest.cc
@@ -83,7 +83,7 @@
 #include "components/infobars/core/infobar.h"
 #include "components/prefs/pref_service.h"
 #include "components/safe_browsing/common/safe_browsing_prefs.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/browser/download_danger_type.h"
 #include "content/public/browser/download_interrupt_reasons.h"
 #include "content/public/browser/download_item.h"
@@ -502,6 +502,12 @@
     return GetDownloadDirectory(browser).Append(file.BaseName());
   }
 
+  base::FilePath TemporaryFile(const base::FilePath& file) {
+    base::FilePath tmp;
+    base::GetTempDir(&tmp);
+    return tmp.Append(file.BaseName());
+  }
+
   // Must be called after browser creation.  Creates a temporary
   // directory for downloads that is auto-deleted on destruction.
   // Returning false indicates a failure of the function, and should be asserted
@@ -2025,7 +2031,7 @@
 
   // As long as we're here, confirmed everything else is good.
   EXPECT_EQ(1, browser()->tab_strip_model()->count());
-  CheckDownload(browser(), file, file);
+  CheckDownloadFullPaths(browser(), TemporaryFile(file), OriginFile(file));
 }
 
 // Download an extension. Expect a dangerous download warning.
diff --git a/chrome/browser/download/download_commands.cc b/chrome/browser/download/download_commands.cc
index a4a6040e..40baa910 100644
--- a/chrome/browser/download/download_commands.cc
+++ b/chrome/browser/download/download_commands.cc
@@ -28,7 +28,7 @@
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/theme_resources.h"
 #include "components/google/core/browser/google_util.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "net/base/url_util.h"
 #include "ui/base/clipboard/scoped_clipboard_writer.h"
 #include "ui/base/resource/resource_bundle.h"
diff --git a/chrome/browser/download/download_danger_prompt.h b/chrome/browser/download/download_danger_prompt.h
index 55fa38e7a7..10331bed 100644
--- a/chrome/browser/download/download_danger_prompt.h
+++ b/chrome/browser/download/download_danger_prompt.h
@@ -6,7 +6,7 @@
 #define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_DANGER_PROMPT_H_
 
 #include "base/callback_forward.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 namespace content {
 class DownloadItem;
diff --git a/chrome/browser/download/download_danger_prompt_browsertest.cc b/chrome/browser/download/download_danger_prompt_browsertest.cc
index 82eab21..dbc0f6f 100644
--- a/chrome/browser/download/download_danger_prompt_browsertest.cc
+++ b/chrome/browser/download/download_danger_prompt_browsertest.cc
@@ -18,7 +18,7 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/safe_browsing_db/database_manager.h"
 #include "content/public/test/mock_download_item.h"
 #include "testing/gmock/include/gmock/gmock.h"
diff --git a/chrome/browser/download/download_prefs.cc b/chrome/browser/download/download_prefs.cc
index c6b31c58..f7a60c11 100644
--- a/chrome/browser/download/download_prefs.cc
+++ b/chrome/browser/download/download_prefs.cc
@@ -79,6 +79,7 @@
 class DefaultDownloadDirectory {
  public:
   const base::FilePath& path() const { return path_; }
+  const base::FilePath& temp_path() const { return temp_path_; }
 
  private:
   friend struct base::LazyInstanceTraitsBase<DefaultDownloadDirectory>;
@@ -87,6 +88,11 @@
     if (!PathService::Get(chrome::DIR_DEFAULT_DOWNLOADS, &path_)) {
       NOTREACHED();
     }
+
+    if (!base::GetTempDir(&temp_path_)) {
+      NOTREACHED();
+    }
+
     if (DownloadPathIsDangerous(path_)) {
       // This is only useful on platforms that support
       // DIR_DEFAULT_DOWNLOADS_SAFE.
@@ -97,6 +103,7 @@
   }
 
   base::FilePath path_;
+  base::FilePath temp_path_;
 
   DISALLOW_COPY_AND_ASSIGN(DefaultDownloadDirectory);
 };
@@ -238,6 +245,11 @@
 }
 
 // static
+const base::FilePath& DownloadPrefs::GetTempDownloadDirectory() {
+  return g_default_download_directory.Get().temp_path();
+}
+
+// static
 DownloadPrefs* DownloadPrefs::FromDownloadManager(
     DownloadManager* download_manager) {
   ChromeDownloadManagerDelegate* delegate =
diff --git a/chrome/browser/download/download_prefs.h b/chrome/browser/download/download_prefs.h
index 0499d71..58855983 100644
--- a/chrome/browser/download/download_prefs.h
+++ b/chrome/browser/download/download_prefs.h
@@ -40,6 +40,9 @@
 
   static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
 
+  // Returns the download directory for temporary files.
+  static const base::FilePath& GetTempDownloadDirectory();
+
   // Returns the default download directory.
   static const base::FilePath& GetDefaultDownloadDirectory();
 
diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/browser/download/download_target_determiner.cc
index d3677b9..faca8fe6 100644
--- a/chrome/browser/download/download_target_determiner.cc
+++ b/chrome/browser/download/download_target_determiner.cc
@@ -220,7 +220,14 @@
       // If the user is going to be prompted and the user has been prompted
       // before, then always prefer the last directory that the user selected.
       target_directory = download_prefs_->SaveFilePath();
+    } else if (download_prefs_->IsAutoOpenEnabledBasedOnExtension(
+                   generated_filename)) {
+      // If we do not need user confirmation and we are going to auto-open the
+      // file, just download it to the system temp directory.
+      target_directory = download_prefs_->GetTempDownloadDirectory();
     } else {
+      // The user has not configured this file to be auto-opened. Download it to
+      // the standard location.
       target_directory = download_prefs_->DownloadPath();
     }
     virtual_path_ = target_directory.Append(generated_filename);
diff --git a/chrome/browser/download/download_target_determiner_unittest.cc b/chrome/browser/download/download_target_determiner_unittest.cc
index 5398afe7..32476fe4 100644
--- a/chrome/browser/download/download_target_determiner_unittest.cc
+++ b/chrome/browser/download/download_target_determiner_unittest.cc
@@ -10,6 +10,7 @@
 
 #include "base/at_exit.h"
 #include "base/files/file_path.h"
+#include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/location.h"
 #include "base/macros.h"
@@ -123,6 +124,10 @@
                        // marked interrupted or cancelled.
 };
 
+// Used with DownloadTestCase. Whether the file is expected to be downloaded to
+// the default download directory or the system-wide temp directory.
+enum TestCaseExpectDirectory { DEFAULT_DIRECTORY, TEMP_DIRECTORY };
+
 // Typical download test case. Used with
 // DownloadTargetDeterminerTest::RunTestCase().
 struct DownloadTestCase {
@@ -154,6 +159,9 @@
 
   // Type of intermediate path to expect.
   TestCaseExpectIntermediate expected_intermediate;
+
+  // The destination directory where the file is expected to be downloaded to.
+  TestCaseExpectDirectory expected_directory;
 };
 
 class MockDownloadTargetDeterminerDelegate
@@ -238,10 +246,19 @@
   // Set the kPromptForDownload user preference to |prompt|.
   void SetPromptForDownload(bool prompt);
 
+  // Utility function to get the full path for |relative_path| within
+  // |base_path|.
+  base::FilePath GetPathInDir(const base::FilePath::StringType& relative_path,
+                              const base::FilePath& base_path);
+
   // Given the relative path |path|, returns the full path under the temporary
   // downloads directory.
   base::FilePath GetPathInDownloadDir(const base::FilePath::StringType& path);
 
+  // Given the relative path |path|, returns the full path under the system
+  // temporary directory where auto-open files are saved.
+  base::FilePath GetPathInTempDir(const base::FilePath::StringType& path);
+
   // Run |test_case| using |item|.
   void RunTestCase(const DownloadTestCase& test_case,
                    const base::FilePath& initial_virtual_path,
@@ -273,6 +290,8 @@
     return test_virtual_dir_;
   }
 
+  const base::FilePath& test_temp_dir() const { return test_temp_dir_; }
+
   MockDownloadTargetDeterminerDelegate* delegate() {
     return &delegate_;
   }
@@ -289,6 +308,7 @@
   NullWebContentsDelegate web_contents_delegate_;
   base::ScopedTempDir test_download_dir_;
   base::FilePath test_virtual_dir_;
+  base::FilePath test_temp_dir_;
   safe_browsing::FileTypePoliciesTestOverlay file_type_configuration_;
 };
 
@@ -299,6 +319,7 @@
   web_contents()->SetDelegate(&web_contents_delegate_);
   ASSERT_TRUE(test_download_dir_.CreateUniqueTempDir());
   test_virtual_dir_ = test_download_dir().Append(FILE_PATH_LITERAL("virtual"));
+  ASSERT_TRUE(base::GetTempDir(&test_temp_dir_));
   download_prefs_->SetDownloadPath(test_download_dir());
   delegate_.SetupDefaults();
   SetUpFileTypePolicies();
@@ -384,14 +405,25 @@
       SetBoolean(prefs::kPromptForDownload, prompt);
 }
 
-base::FilePath DownloadTargetDeterminerTest::GetPathInDownloadDir(
-    const base::FilePath::StringType& relative_path) {
+base::FilePath DownloadTargetDeterminerTest::GetPathInDir(
+    const base::FilePath::StringType& relative_path,
+    const base::FilePath& base_path) {
   if (relative_path.empty())
     return base::FilePath();
-  base::FilePath full_path(test_download_dir().Append(relative_path));
+  base::FilePath full_path(base_path.Append(relative_path));
   return full_path.NormalizePathSeparators();
 }
 
+base::FilePath DownloadTargetDeterminerTest::GetPathInDownloadDir(
+    const base::FilePath::StringType& relative_path) {
+  return GetPathInDir(relative_path, test_download_dir());
+}
+
+base::FilePath DownloadTargetDeterminerTest::GetPathInTempDir(
+    const base::FilePath::StringType& relative_path) {
+  return GetPathInDir(relative_path, test_temp_dir());
+}
+
 void DownloadTargetDeterminerTest::RunTestCase(
     const DownloadTestCase& test_case,
     const base::FilePath& initial_virtual_path,
@@ -439,8 +471,16 @@
 void DownloadTargetDeterminerTest::VerifyDownloadTarget(
     const DownloadTestCase& test_case,
     const DownloadTargetInfo* target_info) {
-  base::FilePath expected_local_path(
-      GetPathInDownloadDir(test_case.expected_local_path));
+  base::FilePath expected_local_path;
+  switch (test_case.expected_directory) {
+    case DEFAULT_DIRECTORY:
+      expected_local_path = GetPathInDownloadDir(test_case.expected_local_path);
+      break;
+    case TEMP_DIRECTORY:
+      expected_local_path = GetPathInTempDir(test_case.expected_local_path);
+      break;
+  }
+
   EXPECT_EQ(expected_local_path.value(), target_info->target_path.value());
   EXPECT_EQ(test_case.expected_disposition, target_info->target_disposition);
   EXPECT_EQ(test_case.expected_danger_type, target_info->danger_type);
@@ -561,7 +601,7 @@
 
        FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_CRDOWNLOAD},
+       EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
 
       {// Save_As Safe
        SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
@@ -570,7 +610,7 @@
 
        FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-       EXPECT_CRDOWNLOAD},
+       EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
 
       {// Automatic Dangerous
        AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE,
@@ -580,7 +620,7 @@
        FILE_PATH_LITERAL("foo.kindabad"),
        DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_UNCONFIRMED},
+       EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY},
 
       {// Forced Safe
        FORCED, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
@@ -590,7 +630,7 @@
        FILE_PATH_LITERAL("forced-foo.txt"),
        DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_LOCAL_PATH},
+       EXPECT_LOCAL_PATH, DEFAULT_DIRECTORY},
   };
 
   // The test assumes that .kindabad files have a danger level of
@@ -610,7 +650,7 @@
 
        FILE_PATH_LITERAL(""), DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-       EXPECT_LOCAL_PATH}};
+       EXPECT_LOCAL_PATH, DEFAULT_DIRECTORY}};
   ON_CALL(*delegate(), RequestConfirmation(_, _, _, _))
       .WillByDefault(WithArg<3>(ScheduleCallback2(
           DownloadConfirmationResult::CANCELED, base::FilePath())));
@@ -629,7 +669,7 @@
 
        FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_UNCONFIRMED},
+       EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY},
 
       {// 1: Save As Dangerous URL
        SAVE_AS, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL,
@@ -638,7 +678,7 @@
 
        FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-       EXPECT_UNCONFIRMED},
+       EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY},
 
       {// 2: Forced Dangerous URL
        FORCED, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL,
@@ -648,7 +688,7 @@
        FILE_PATH_LITERAL("forced-foo.txt"),
        DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_UNCONFIRMED},
+       EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY},
 
       {// 3: Automatic Dangerous URL + Dangerous file. Dangerous URL takes
        // precedence.
@@ -659,7 +699,7 @@
        FILE_PATH_LITERAL("foo.html"),
        DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_UNCONFIRMED},
+       EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY},
 
       {// 4: Save As Dangerous URL + Dangerous file
        SAVE_AS, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL,
@@ -668,7 +708,7 @@
 
        FILE_PATH_LITERAL("foo.html"), DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-       EXPECT_UNCONFIRMED},
+       EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY},
 
       {// 5: Forced Dangerous URL + Dangerous file
        FORCED, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL,
@@ -678,7 +718,7 @@
        FILE_PATH_LITERAL("forced-foo.html"),
        DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_UNCONFIRMED},
+       EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY},
   };
 
   ON_CALL(*delegate(), CheckDownloadUrl(_, _, _))
@@ -698,7 +738,8 @@
        "http://phishing.example.com/foo.kindabad", "", FILE_PATH_LITERAL(""),
 
        FILE_PATH_LITERAL("foo.kindabad"),
-       DownloadItem::TARGET_DISPOSITION_OVERWRITE, EXPECT_UNCONFIRMED},
+       DownloadItem::TARGET_DISPOSITION_OVERWRITE, EXPECT_UNCONFIRMED,
+       DEFAULT_DIRECTORY},
 
       {// 1: Automatic Maybe dangerous content with DANGEROUS type.
        AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
@@ -706,7 +747,7 @@
        FILE_PATH_LITERAL(""),
 
        FILE_PATH_LITERAL("foo.bad"), DownloadItem::TARGET_DISPOSITION_OVERWRITE,
-       EXPECT_UNCONFIRMED},
+       EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY},
 
       {// 2: Save As Maybe dangerous content
        SAVE_AS, content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
@@ -716,7 +757,7 @@
        FILE_PATH_LITERAL("foo.kindabad"),
        DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-       EXPECT_UNCONFIRMED},
+       EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY},
 
       {// 3: Forced Maybe dangerous content
        FORCED, content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
@@ -727,7 +768,7 @@
        FILE_PATH_LITERAL("forced-foo.kindabad"),
        DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_UNCONFIRMED}};
+       EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY}};
 
   // Test assumptions:
   ASSERT_EQ(DownloadFileType::ALLOW_ON_USER_GESTURE,
@@ -755,7 +796,7 @@
 
        FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-       EXPECT_CRDOWNLOAD}};
+       EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY}};
 
   // These test cases are run with a last save path set to a non-emtpy local
   // download directory.
@@ -769,7 +810,7 @@
        FILE_PATH_LITERAL("foo/foo.txt"),
        DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-       EXPECT_CRDOWNLOAD},
+       EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
 
       {// 1: Start an automatic download. This should be saved to the user's
        //    default download directory and not the last used Save As directory.
@@ -779,7 +820,7 @@
 
        FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_CRDOWNLOAD},
+       EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
   };
 
   // This test case is run with the last save path set to a non-empty virtual
@@ -791,7 +832,7 @@
 
        FILE_PATH_LITERAL("bar.txt"), DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-       EXPECT_LOCAL_PATH},
+       EXPECT_LOCAL_PATH, DEFAULT_DIRECTORY},
   };
 
   {
@@ -857,7 +898,8 @@
         FILE_PATH_LITERAL("foo-local.txt"),
         DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-        EXPECT_LOCAL_PATH};
+        EXPECT_LOCAL_PATH,
+        DEFAULT_DIRECTORY};
     EXPECT_CALL(*delegate(), DetermineLocalPath(_, _, _))
         .WillOnce(WithArg<2>(ScheduleCallback(
             GetPathInDownloadDir(FILE_PATH_LITERAL("foo-local.txt")))));
@@ -877,7 +919,8 @@
         FILE_PATH_LITERAL("foo-local.txt"),
         DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-        EXPECT_LOCAL_PATH};
+        EXPECT_LOCAL_PATH,
+        DEFAULT_DIRECTORY};
     EXPECT_CALL(*delegate(), DetermineLocalPath(_, _, _))
         .WillOnce(WithArg<2>(ScheduleCallback(
             GetPathInDownloadDir(FILE_PATH_LITERAL("foo-local.txt")))));
@@ -904,7 +947,8 @@
         FILE_PATH_LITERAL("foo-x.txt"),
         DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-        EXPECT_CRDOWNLOAD};
+        EXPECT_CRDOWNLOAD,
+        DEFAULT_DIRECTORY};
     EXPECT_CALL(*delegate(), RequestConfirmation(
                                  _, test_virtual_dir().AppendASCII("bar.txt"),
                                  DownloadConfirmationReason::SAVE_AS, _))
@@ -927,7 +971,8 @@
         FILE_PATH_LITERAL("forced-foo.txt"),
         DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-        EXPECT_LOCAL_PATH};
+        EXPECT_LOCAL_PATH,
+        DEFAULT_DIRECTORY};
     RunTestCasesWithActiveItem(&kForcedSafe, 1);
   }
 }
@@ -944,7 +989,8 @@
       FILE_PATH_LITERAL(""),
       FILE_PATH_LITERAL("foo.txt"),
       DownloadItem::TARGET_DISPOSITION_OVERWRITE,
-      EXPECT_CRDOWNLOAD};
+      EXPECT_CRDOWNLOAD,
+      DEFAULT_DIRECTORY};
 
   const struct {
     TestCaseType type;
@@ -988,7 +1034,8 @@
       FILE_PATH_LITERAL("bar.txt"),
       DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-      EXPECT_CRDOWNLOAD};
+      EXPECT_CRDOWNLOAD,
+      DEFAULT_DIRECTORY};
 
   struct TestCase {
     PathValidationResult result;
@@ -1039,7 +1086,7 @@
 
        FILE_PATH_LITERAL(""), DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_LOCAL_PATH},
+       EXPECT_LOCAL_PATH, DEFAULT_DIRECTORY},
   };
 
   // The default download directory is the virtual path.
@@ -1068,7 +1115,7 @@
        FILE_PATH_LITERAL("foo.kindabad"),
        DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_CRDOWNLOAD},
+       EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
 
       {// 1: Dangerous due to not having visited referrer before.
        AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE,
@@ -1079,7 +1126,7 @@
        FILE_PATH_LITERAL("foo.kindabad"),
        DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_UNCONFIRMED},
+       EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY},
 
       {// 2: Safe because the user is being prompted.
        SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
@@ -1090,7 +1137,7 @@
        FILE_PATH_LITERAL("foo.kindabad"),
        DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-       EXPECT_CRDOWNLOAD},
+       EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
 
       {// 3: Safe because of forced path.
        FORCED, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
@@ -1101,7 +1148,7 @@
        FILE_PATH_LITERAL("foo.kindabad"),
        DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_LOCAL_PATH},
+       EXPECT_LOCAL_PATH, DEFAULT_DIRECTORY},
   };
 
   // This test assumes that the danger level of .kindabad files is
@@ -1140,7 +1187,8 @@
       FILE_PATH_LITERAL("foo.txt"),
       DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-      EXPECT_CRDOWNLOAD};
+      EXPECT_CRDOWNLOAD,
+      DEFAULT_DIRECTORY};
 
   const DownloadTestCase kAllowOnUserGesture = {
       AUTOMATIC,
@@ -1153,7 +1201,8 @@
       FILE_PATH_LITERAL("foo.kindabad"),
       DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-      EXPECT_UNCONFIRMED};
+      EXPECT_UNCONFIRMED,
+      DEFAULT_DIRECTORY};
 
   const DownloadTestCase kDangerousFile = {
       AUTOMATIC,
@@ -1166,7 +1215,8 @@
       FILE_PATH_LITERAL("foo.bad"),
       DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-      EXPECT_UNCONFIRMED};
+      EXPECT_UNCONFIRMED,
+      DEFAULT_DIRECTORY};
 
   const struct {
     ui::PageTransition page_transition;
@@ -1263,7 +1313,8 @@
       FILE_PATH_LITERAL("automatic.txt"),
       DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-      EXPECT_CRDOWNLOAD};
+      EXPECT_CRDOWNLOAD,
+      DEFAULT_DIRECTORY};
 
   SetPromptForDownload(true);
   EXPECT_CALL(*delegate(),
@@ -1286,7 +1337,8 @@
       FILE_PATH_LITERAL("save-as.txt"),
       DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-      EXPECT_CRDOWNLOAD};
+      EXPECT_CRDOWNLOAD,
+      DEFAULT_DIRECTORY};
 
   SetPromptForDownload(true);
   EXPECT_CALL(*delegate(),
@@ -1309,7 +1361,8 @@
       FILE_PATH_LITERAL("foo.txt"),
       DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-      EXPECT_LOCAL_PATH};
+      EXPECT_LOCAL_PATH,
+      DEFAULT_DIRECTORY};
 
   SetPromptForDownload(true);
   RunTestCasesWithActiveItem(&kSafeForced, 1);
@@ -1329,13 +1382,56 @@
       FILE_PATH_LITERAL("foo.dummy"),
       DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-      EXPECT_CRDOWNLOAD};
+      EXPECT_CRDOWNLOAD,
+      TEMP_DIRECTORY};
   SetPromptForDownload(true);
   EnableAutoOpenBasedOnExtension(
       base::FilePath(FILE_PATH_LITERAL("dummy.dummy")));
   RunTestCasesWithActiveItem(&kAutoOpen, 1);
 }
 
+// In an automatic download, auto-opened files should be saved to a temp
+// directory.
+TEST_F(DownloadTargetDeterminerTest, AutoOpen_Automatic) {
+  const DownloadTestCase kTestCase = {
+      AUTOMATIC,
+      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
+      DownloadFileType::NOT_DANGEROUS,
+      "http://example.com/foo.dummy",
+      "",
+      FILE_PATH_LITERAL(""),
+
+      FILE_PATH_LITERAL("foo.dummy"),
+      DownloadItem::TARGET_DISPOSITION_OVERWRITE,
+
+      EXPECT_CRDOWNLOAD,
+      TEMP_DIRECTORY};
+  EnableAutoOpenBasedOnExtension(
+      base::FilePath(FILE_PATH_LITERAL("dummy.dummy")));
+  RunTestCasesWithActiveItem(&kTestCase, 1);
+}
+
+// Even if we are set to auto-open this file, save the file to a permanent
+// location if triggered by a Save As.
+TEST_F(DownloadTargetDeterminerTest, AutoOpen_SaveAs) {
+  const DownloadTestCase kTestCase = {
+      SAVE_AS,
+      content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
+      DownloadFileType::NOT_DANGEROUS,
+      "http://example.com/foo.dummy",
+      "",
+      FILE_PATH_LITERAL(""),
+
+      FILE_PATH_LITERAL("foo.dummy"),
+      DownloadItem::TARGET_DISPOSITION_PROMPT,
+
+      EXPECT_CRDOWNLOAD,
+      DEFAULT_DIRECTORY};
+  EnableAutoOpenBasedOnExtension(
+      base::FilePath(FILE_PATH_LITERAL("dummy.dummy")));
+  RunTestCasesWithActiveItem(&kTestCase, 1);
+}
+
 // If an embedder responds to a RequestConfirmation with a new path and a
 // CONTINUE_WITHOUT_CONFIRMATION, then we shouldn't consider the file as safe.
 TEST_F(DownloadTargetDeterminerTest, ContinueWithoutConfirmation_SaveAs) {
@@ -1350,7 +1446,8 @@
       FILE_PATH_LITERAL("foo.kindabad"),
       DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-      EXPECT_UNCONFIRMED};
+      EXPECT_UNCONFIRMED,
+      DEFAULT_DIRECTORY};
 
   EXPECT_CALL(
       *delegate(),
@@ -1378,7 +1475,8 @@
       FILE_PATH_LITERAL("foo.kindabad"),
       DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-      EXPECT_CRDOWNLOAD};
+      EXPECT_CRDOWNLOAD,
+      DEFAULT_DIRECTORY};
 
   EXPECT_CALL(
       *delegate(),
@@ -1408,7 +1506,7 @@
        FILE_PATH_LITERAL("foo.kindabad"),
        DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_UNCONFIRMED},
+       EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY},
 
       {// 1: Automatic User Script - Shouldn't prompt for user script downloads
        //    even if "Prompt for download" preference is set.
@@ -1419,7 +1517,7 @@
        FILE_PATH_LITERAL("foo.user.js"),
        DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_CRDOWNLOAD},
+       EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
   };
 
   SetPromptForDownload(true);
@@ -1439,7 +1537,7 @@
 
        FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_CRDOWNLOAD},
+       EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
 
       {// 1: Save_As Safe
        SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
@@ -1448,7 +1546,7 @@
 
        FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_CRDOWNLOAD},
+       EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
   };
 
   SetManagedDownloadPath(test_download_dir());
@@ -1469,7 +1567,7 @@
        FILE_PATH_LITERAL("overridden/foo.txt"),
        DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_CRDOWNLOAD},
+       EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
 
       {// 1: Save_As Safe
        SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
@@ -1479,7 +1577,7 @@
        FILE_PATH_LITERAL("overridden/foo.txt"),
        DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-       EXPECT_CRDOWNLOAD},
+       EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
 
       {// 2: Automatic Dangerous
        AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE,
@@ -1489,7 +1587,7 @@
        FILE_PATH_LITERAL("overridden/foo.kindabad"),
        DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_UNCONFIRMED},
+       EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY},
 
       {// 3: Forced Safe
        FORCED, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
@@ -1499,7 +1597,7 @@
        FILE_PATH_LITERAL("forced-foo.txt"),
        DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_LOCAL_PATH},
+       EXPECT_LOCAL_PATH, DEFAULT_DIRECTORY},
   };
 
   ON_CALL(*delegate(), NotifyExtensions(_, _, _))
@@ -1522,7 +1620,8 @@
       FILE_PATH_LITERAL("overridden/foo.kindabad"),
       DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-      EXPECT_UNCONFIRMED};
+      EXPECT_UNCONFIRMED,
+      DEFAULT_DIRECTORY};
 
   const DownloadTestCase kHandledBySafeBrowsing = {
       AUTOMATIC,
@@ -1535,7 +1634,8 @@
       FILE_PATH_LITERAL("overridden/foo.kindabad"),
       DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-      EXPECT_UNCONFIRMED};
+      EXPECT_UNCONFIRMED,
+      DEFAULT_DIRECTORY};
 
   ON_CALL(*delegate(), NotifyExtensions(_, _, _))
       .WillByDefault(Invoke(&NotifyExtensionsOverridePath));
@@ -1561,7 +1661,8 @@
       FILE_PATH_LITERAL("overridden/foo.txt"),
       DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-      EXPECT_CRDOWNLOAD};
+      EXPECT_CRDOWNLOAD,
+      DEFAULT_DIRECTORY};
 
   const DownloadTestCase& test_case = kNotifyExtensionsTestCase;
   std::unique_ptr<content::MockDownloadItem> item =
@@ -1610,7 +1711,8 @@
       FILE_PATH_LITERAL("overridden/foo.txt"),
       DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-      EXPECT_CRDOWNLOAD};
+      EXPECT_CRDOWNLOAD,
+      DEFAULT_DIRECTORY};
 
   const DownloadTestCase& test_case = kNotifyExtensionsTestCase;
   std::unique_ptr<content::MockDownloadItem> item =
@@ -1647,7 +1749,8 @@
       kInitialPath,
       DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-      EXPECT_CRDOWNLOAD};
+      EXPECT_CRDOWNLOAD,
+      DEFAULT_DIRECTORY};
 
   const DownloadTestCase& test_case = kInitialPathTestCase;
   std::unique_ptr<content::MockDownloadItem> item =
@@ -1680,7 +1783,7 @@
 
        FILE_PATH_LITERAL("foo.txt"), DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_CRDOWNLOAD},
+       EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
 
       {// 1: Save_As Safe: Initial path used.
        SAVE_AS, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
@@ -1689,7 +1792,7 @@
 
        kInitialPath, DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-       EXPECT_CRDOWNLOAD},
+       EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
 
       {// 2: Automatic Dangerous: Initial path is ignored since the user hasn't
        // been prompted before.
@@ -1700,7 +1803,7 @@
        FILE_PATH_LITERAL("foo.kindabad"),
        DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_UNCONFIRMED},
+       EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY},
 
       {// 3: Forced Safe: Initial path is ignored due to the forced path.
        FORCED, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
@@ -1710,7 +1813,7 @@
        FILE_PATH_LITERAL("forced-foo.txt"),
        DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-       EXPECT_LOCAL_PATH},
+       EXPECT_LOCAL_PATH, DEFAULT_DIRECTORY},
   };
 
   // The test assumes that .kindabad files have a danger level of
@@ -1759,7 +1862,8 @@
       FILE_PATH_LITERAL("forced-foo.txt"),
       DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-      EXPECT_LOCAL_PATH};
+      EXPECT_LOCAL_PATH,
+      DEFAULT_DIRECTORY};
 
   const DownloadTestCase& test_case = kResumedForcedDownload;
   base::FilePath expected_path =
@@ -1804,27 +1908,24 @@
 
        kInitialPath, DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-       EXPECT_CRDOWNLOAD},
+       EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
 
-      {
-          // 2: Automatic Dangerous
-          AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
-          DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.kindabad",
-          "", FILE_PATH_LITERAL(""),
+      {// 2: Automatic Dangerous
+       AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
+       DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.kindabad", "",
+       FILE_PATH_LITERAL(""),
 
-          FILE_PATH_LITERAL("foo.kindabad"),
-          DownloadItem::TARGET_DISPOSITION_PROMPT, EXPECT_CRDOWNLOAD,
-      },
+       FILE_PATH_LITERAL("foo.kindabad"),
+       DownloadItem::TARGET_DISPOSITION_PROMPT, EXPECT_CRDOWNLOAD,
+       DEFAULT_DIRECTORY},
 
-      {
-          // 3: Automatic Dangerous
-          AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
-          DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.bad", "",
-          FILE_PATH_LITERAL(""),
+      {// 3: Automatic Dangerous
+       AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
+       DownloadFileType::NOT_DANGEROUS, "http://example.com/foo.bad", "",
+       FILE_PATH_LITERAL(""),
 
-          FILE_PATH_LITERAL("foo.bad"), DownloadItem::TARGET_DISPOSITION_PROMPT,
-          EXPECT_CRDOWNLOAD,
-      },
+       FILE_PATH_LITERAL("foo.bad"), DownloadItem::TARGET_DISPOSITION_PROMPT,
+       EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
   };
 
   ASSERT_EQ(DownloadFileType::ALLOW_ON_USER_GESTURE,
@@ -1878,7 +1979,7 @@
         FILE_PATH_LITERAL("foo.txt"),
         DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-        EXPECT_CRDOWNLOAD},
+        EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
        FILE_PATH_LITERAL("bar.txt.crdownload"),
        FILE_PATH_LITERAL("foo.txt.crdownload")},
 
@@ -1889,7 +1990,7 @@
 
         kInitialPath, DownloadItem::TARGET_DISPOSITION_PROMPT,
 
-        EXPECT_CRDOWNLOAD},
+        EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
        FILE_PATH_LITERAL("foo.txt.crdownload"),
        FILE_PATH_LITERAL("some_path/bar.txt.crdownload")},
 
@@ -1901,7 +2002,7 @@
         FILE_PATH_LITERAL("foo.kindabad"),
         DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-        EXPECT_UNCONFIRMED},
+        EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY},
        FILE_PATH_LITERAL("Unconfirmed abcd.crdownload"),
        FILE_PATH_LITERAL("Unconfirmed abcd.crdownload")},
 
@@ -1913,7 +2014,7 @@
         FILE_PATH_LITERAL("foo.kindabad"),
         DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-        EXPECT_UNCONFIRMED},
+        EXPECT_UNCONFIRMED, DEFAULT_DIRECTORY},
        FILE_PATH_LITERAL("other_path/Unconfirmed abcd.crdownload"),
        // Rely on the EXPECT_UNCONFIRMED check in the general test settings. A
        // new intermediate path of the form "Unconfirmed <number>.crdownload"
@@ -1929,7 +2030,7 @@
         FILE_PATH_LITERAL("forced-foo.txt"),
         DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-        EXPECT_LOCAL_PATH},
+        EXPECT_LOCAL_PATH, DEFAULT_DIRECTORY},
        FILE_PATH_LITERAL("forced-foo.txt"),
        FILE_PATH_LITERAL("forced-foo.txt")},
   };
@@ -1988,7 +2089,7 @@
         FILE_PATH_LITERAL("foo.png"),
         DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-        EXPECT_CRDOWNLOAD},
+        EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
        "image/png"},
       {{// 1: Empty MIME type in response.
         AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
@@ -1998,7 +2099,7 @@
         FILE_PATH_LITERAL("foo.png"),
         DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-        EXPECT_CRDOWNLOAD},
+        EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
        "image/png"},
       {{// 2: Forced path.
         FORCED, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
@@ -2008,7 +2109,7 @@
         FILE_PATH_LITERAL("foo.png"),
         DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-        EXPECT_CRDOWNLOAD},
+        EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
        "image/png"},
       {{// 3: Unknown file type.
         AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
@@ -2018,7 +2119,7 @@
         FILE_PATH_LITERAL("foo.notarealext"),
         DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-        EXPECT_CRDOWNLOAD},
+        EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
        ""},
       {{// 4: Unknown file type.
         AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
@@ -2028,7 +2129,7 @@
         FILE_PATH_LITERAL("foo.notarealext"),
         DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-        EXPECT_CRDOWNLOAD},
+        EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
        ""},
       {{// 5: x-x509-user-cert mime-type.
         AUTOMATIC, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
@@ -2038,7 +2139,7 @@
         FILE_PATH_LITERAL("user.crt"),
         DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-        EXPECT_CRDOWNLOAD},
+        EXPECT_CRDOWNLOAD, DEFAULT_DIRECTORY},
        ""},
   };
 
@@ -2075,7 +2176,8 @@
       FILE_PATH_LITERAL(""),
       FILE_PATH_LITERAL("foo.crx"),
       DownloadItem::TARGET_DISPOSITION_OVERWRITE,
-      EXPECT_CRDOWNLOAD};
+      EXPECT_CRDOWNLOAD,
+      DEFAULT_DIRECTORY};
 
   const DownloadTestCase& test_case = kUserValidatedTestCase;
   std::unique_ptr<content::MockDownloadItem> item(
@@ -2227,7 +2329,8 @@
       FILE_PATH_LITERAL("foo.fakeext"),
       DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-      EXPECT_CRDOWNLOAD};
+      EXPECT_CRDOWNLOAD,
+      DEFAULT_DIRECTORY};
 
   content::PluginService* plugin_service =
       content::PluginService::GetInstance();
@@ -2296,7 +2399,8 @@
       FILE_PATH_LITERAL("foo.fakeext"),
       DownloadItem::TARGET_DISPOSITION_OVERWRITE,
 
-      EXPECT_CRDOWNLOAD};
+      EXPECT_CRDOWNLOAD,
+      DEFAULT_DIRECTORY};
 
   content::PluginService* plugin_service =
       content::PluginService::GetInstance();
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api.cc b/chrome/browser/extensions/api/developer_private/developer_private_api.cc
index c8a2423..44d26a7 100644
--- a/chrome/browser/extensions/api/developer_private/developer_private_api.cc
+++ b/chrome/browser/extensions/api/developer_private/developer_private_api.cc
@@ -902,6 +902,7 @@
       PackExtensionJob::StandardSuccessMessage(crx_file, pem_file));
   response.status = developer::PACK_STATUS_SUCCESS;
   Respond(OneArgument(response.ToValue()));
+  pack_job_.reset();
   Release();  // Balanced in Run().
 }
 
@@ -919,6 +920,7 @@
     response.status = developer::PACK_STATUS_ERROR;
   }
   Respond(OneArgument(response.ToValue()));
+  pack_job_.reset();
   Release();  // Balanced in Run().
 }
 
@@ -958,8 +960,8 @@
 
   AddRef();  // Balanced in OnPackSuccess / OnPackFailure.
 
-  // TODO(devlin): Why is PackExtensionJob ref-counted?
-  pack_job_ = new PackExtensionJob(this, root_directory, key_file, flags);
+  pack_job_ =
+      base::MakeUnique<PackExtensionJob>(this, root_directory, key_file, flags);
   pack_job_->Start();
   return RespondLater();
 }
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api.h b/chrome/browser/extensions/api/developer_private/developer_private_api.h
index 7580156..84e0e8c 100644
--- a/chrome/browser/extensions/api/developer_private/developer_private_api.h
+++ b/chrome/browser/extensions/api/developer_private/developer_private_api.h
@@ -466,7 +466,7 @@
   ResponseAction Run() override;
 
  private:
-  scoped_refptr<PackExtensionJob> pack_job_;
+  std::unique_ptr<PackExtensionJob> pack_job_;
   std::string item_path_str_;
   std::string key_path_str_;
 };
diff --git a/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc b/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc
index 13c4e52..3e925eae 100644
--- a/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc
+++ b/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc
@@ -9,7 +9,9 @@
 #include "base/memory/ptr_util.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/feedback/system_logs/chrome_system_logs_fetcher.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/feedback/system_logs/system_logs_fetcher.h"
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/browser_context.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -86,4 +88,10 @@
   return dict;
 }
 
+system_logs::SystemLogsFetcher*
+ChromeFeedbackPrivateDelegate::CreateSystemLogsFetcher(
+    content::BrowserContext* context) const {
+  return system_logs::BuildChromeSystemLogsFetcher();
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.h b/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.h
index 0e02e5b..27a881e 100644
--- a/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.h
+++ b/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.h
@@ -22,6 +22,8 @@
   std::unique_ptr<base::DictionaryValue> GetStrings(
       content::BrowserContext* browser_context,
       bool from_crash) const override;
+  system_logs::SystemLogsFetcher* CreateSystemLogsFetcher(
+      content::BrowserContext* context) const override;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(ChromeFeedbackPrivateDelegate);
diff --git a/chrome/browser/extensions/api/feedback_private/feedback_private_api.cc b/chrome/browser/extensions/api/feedback_private/feedback_private_api.cc
index 534533b..993f9dc 100644
--- a/chrome/browser/extensions/api/feedback_private/feedback_private_api.cc
+++ b/chrome/browser/extensions/api/feedback_private/feedback_private_api.cc
@@ -27,6 +27,7 @@
 #include "chrome/common/extensions/api/feedback_private.h"
 #include "chrome/common/extensions/extension_constants.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/feedback/system_logs/system_logs_fetcher.h"
 #include "components/feedback/tracing_manager.h"
 #include "components/signin/core/browser/signin_manager.h"
 #include "extensions/browser/api/extensions_api_client.h"
@@ -92,9 +93,9 @@
 FeedbackPrivateAPI::FeedbackPrivateAPI(content::BrowserContext* context)
     : browser_context_(context),
 #if !defined(OS_CHROMEOS)
-      service_(new FeedbackService()) {
+      service_(new FeedbackService(context)) {
 #else
-      service_(new FeedbackService()),
+      service_(new FeedbackService(context)),
       log_source_access_manager_(new LogSourceAccessManager(context)){
 #endif  // defined(OS_CHROMEOS)
 }
@@ -211,13 +212,16 @@
 
 ExtensionFunction::ResponseAction
 FeedbackPrivateGetSystemInformationFunction::Run() {
-  FeedbackService* service = FeedbackPrivateAPI::GetFactoryInstance()
-                                 ->Get(browser_context())
-                                 ->GetService();
-  DCHECK(service);
-  service->GetSystemInformation(
-      base::Bind(
-          &FeedbackPrivateGetSystemInformationFunction::OnCompleted, this));
+  FeedbackPrivateDelegate* feedback_private_delegate =
+      ExtensionsAPIClient::Get()->GetFeedbackPrivateDelegate();
+  DCHECK(feedback_private_delegate);
+
+  // Self-deleting object.
+  system_logs::SystemLogsFetcher* fetcher =
+      feedback_private_delegate->CreateSystemLogsFetcher(browser_context());
+  fetcher->Fetch(base::Bind(
+      &FeedbackPrivateGetSystemInformationFunction::OnCompleted, this));
+
   return RespondLater();
 }
 
@@ -329,7 +333,7 @@
   }
 
   service->SendFeedback(
-      browser_context(), feedback_data,
+      feedback_data,
       base::Bind(&FeedbackPrivateSendFeedbackFunction::OnCompleted, this));
 
   return RespondLater();
diff --git a/chrome/browser/extensions/api/feedback_private/feedback_service.cc b/chrome/browser/extensions/api/feedback_private/feedback_service.cc
index 8d1fcef..7baa7cfd 100644
--- a/chrome/browser/extensions/api/feedback_private/feedback_service.cc
+++ b/chrome/browser/extensions/api/feedback_private/feedback_service.cc
@@ -9,7 +9,6 @@
 #include "base/callback.h"
 #include "base/memory/weak_ptr.h"
 #include "base/strings/string_number_conversions.h"
-#include "chrome/browser/feedback/system_logs/chrome_system_logs_fetcher.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "extensions/browser/blob_reader.h"
@@ -22,14 +21,13 @@
 
 namespace extensions {
 
-FeedbackService::FeedbackService() {
-}
+FeedbackService::FeedbackService(content::BrowserContext* browser_context)
+    : browser_context_(browser_context) {}
 
 FeedbackService::~FeedbackService() {
 }
 
-void FeedbackService::SendFeedback(content::BrowserContext* browser_context,
-                                   scoped_refptr<FeedbackData> feedback_data,
+void FeedbackService::SendFeedback(scoped_refptr<FeedbackData> feedback_data,
                                    const SendFeedbackCallback& callback) {
   feedback_data->set_locale(
       ExtensionsBrowserClient::Get()->GetApplicationLocale());
@@ -38,7 +36,7 @@
   if (!feedback_data->attached_file_uuid().empty()) {
     // Self-deleting object.
     BlobReader* attached_file_reader =
-        new BlobReader(browser_context, feedback_data->attached_file_uuid(),
+        new BlobReader(browser_context_, feedback_data->attached_file_uuid(),
                        base::Bind(&FeedbackService::AttachedFileCallback,
                                   AsWeakPtr(), feedback_data, callback));
     attached_file_reader->Start();
@@ -47,7 +45,7 @@
   if (!feedback_data->screenshot_uuid().empty()) {
     // Self-deleting object.
     BlobReader* screenshot_reader =
-        new BlobReader(browser_context, feedback_data->screenshot_uuid(),
+        new BlobReader(browser_context_, feedback_data->screenshot_uuid(),
                        base::Bind(&FeedbackService::ScreenshotCallback,
                                   AsWeakPtr(), feedback_data, callback));
     screenshot_reader->Start();
@@ -56,14 +54,6 @@
   CompleteSendFeedback(feedback_data, callback);
 }
 
-void FeedbackService::GetSystemInformation(
-    const system_logs::SysLogsFetcherCallback& callback) {
-  // Self-deleting object.
-  system_logs::SystemLogsFetcher* fetcher =
-      system_logs::BuildChromeSystemLogsFetcher();
-  fetcher->Fetch(callback);
-}
-
 void FeedbackService::AttachedFileCallback(
     scoped_refptr<feedback::FeedbackData> feedback_data,
     const SendFeedbackCallback& callback,
diff --git a/chrome/browser/extensions/api/feedback_private/feedback_service.h b/chrome/browser/extensions/api/feedback_private/feedback_service.h
index d51ca86f..f6530de 100644
--- a/chrome/browser/extensions/api/feedback_private/feedback_service.h
+++ b/chrome/browser/extensions/api/feedback_private/feedback_service.h
@@ -13,11 +13,10 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "components/feedback/feedback_data.h"
-#include "components/feedback/system_logs/system_logs_fetcher.h"
 
 namespace content {
 class BrowserContext;
-}
+}  // namespace content
 
 namespace extensions {
 
@@ -32,19 +31,13 @@
   // offline).
   using SendFeedbackCallback = base::Callback<void(bool)>;
 
-  FeedbackService();
+  explicit FeedbackService(content::BrowserContext* browser_context);
   virtual ~FeedbackService();
 
   // Sends a feedback report.
-  void SendFeedback(content::BrowserContext* browser_context,
-                    scoped_refptr<feedback::FeedbackData> feedback_data,
+  void SendFeedback(scoped_refptr<feedback::FeedbackData> feedback_data,
                     const SendFeedbackCallback& callback);
 
-  // Start to gather system information.
-  // The |callback| will be invoked once the query is completed.
-  void GetSystemInformation(
-      const system_logs::SysLogsFetcherCallback& callback);
-
  private:
   // Callbacks to receive blob data.
   void AttachedFileCallback(scoped_refptr<feedback::FeedbackData> feedback_data,
@@ -61,6 +54,8 @@
   void CompleteSendFeedback(scoped_refptr<feedback::FeedbackData> feedback_data,
                             const SendFeedbackCallback& callback);
 
+  content::BrowserContext* browser_context_;
+
   DISALLOW_COPY_AND_ASSIGN(FeedbackService);
 };
 
diff --git a/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc b/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc
index 103a946..cf7da480 100644
--- a/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc
+++ b/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc
@@ -152,8 +152,11 @@
   drive::DriveIntegrationService* CreateDriveIntegrationService(
       Profile* profile) {
     // Ignore signin profile.
-    if (profile->GetPath() == chromeos::ProfileHelper::GetSigninProfileDir())
+    if (profile->GetPath() == chromeos::ProfileHelper::GetSigninProfileDir() ||
+        profile->GetPath() ==
+            chromeos::ProfileHelper::GetLockScreenAppProfilePath()) {
       return nullptr;
+    }
 
     // FileSystemApiTestForDrive doesn't expect that several user profiles could
     // exist simultaneously.
diff --git a/chrome/browser/extensions/extension_context_menu_browsertest.cc b/chrome/browser/extensions/extension_context_menu_browsertest.cc
index ec76b112..30e3ef8 100644
--- a/chrome/browser/extensions/extension_context_menu_browsertest.cc
+++ b/chrome/browser/extensions/extension_context_menu_browsertest.cc
@@ -76,13 +76,11 @@
     const extensions::ExtensionSet& extensions =
         extensions::ExtensionRegistry::Get(
             browser()->profile())->enabled_extensions();
-    for (extensions::ExtensionSet::const_iterator i = extensions.begin();
-         i != extensions.end(); ++i) {
-      if ((*i)->name() == name) {
-        return i->get();
-      }
+    for (const auto& ext : extensions) {
+      if (ext->name() == name)
+        return ext.get();
     }
-    return NULL;
+    return nullptr;
   }
 
   // This gets all the items that any extension has registered for possible
@@ -178,10 +176,8 @@
   bool MenuHasExtensionItemWithLabel(TestRenderViewContextMenu* menu,
                                      const std::string& label) {
     base::string16 label16 = base::UTF8ToUTF16(label);
-    std::map<int, MenuItem::Id>::iterator i;
-    for (i = menu->extension_items().extension_item_map_.begin();
-         i != menu->extension_items().extension_item_map_.end(); ++i) {
-      const MenuItem::Id& id = i->second;
+    for (const auto& it : menu->extension_items().extension_item_map_) {
+      const MenuItem::Id& id = it.second;
       base::string16 tmp_label;
       EXPECT_TRUE(GetItemLabel(menu, id, &tmp_label));
       if (tmp_label == label16)
@@ -195,12 +191,12 @@
   // false.
   bool GetItemLabel(TestRenderViewContextMenu* menu,
                     const MenuItem::Id& id,
-                    base::string16* result) {
+                    base::string16* result) const {
     int command_id = 0;
     if (!FindCommandId(menu, id, &command_id))
       return false;
 
-    MenuModel* model = NULL;
+    MenuModel* model = nullptr;
     int index = -1;
     if (!menu->GetMenuModelAndItemIndex(command_id, &model, &index)) {
       return false;
@@ -213,12 +209,10 @@
   // in the menu.
   bool FindCommandId(TestRenderViewContextMenu* menu,
                      const MenuItem::Id& id,
-                     int* command_id) {
-    std::map<int, MenuItem::Id>::const_iterator i;
-    for (i = menu->extension_items().extension_item_map_.begin();
-         i != menu->extension_items().extension_item_map_.end(); ++i) {
-      if (i->second == id) {
-        *command_id = i->first;
+                     int* command_id) const {
+    for (const auto& it : menu->extension_items().extension_item_map_) {
+      if (it.second == id) {
+        *command_id = it.first;
         return true;
       }
     }
@@ -312,8 +306,8 @@
   ASSERT_TRUE(listener_update2.WaitUntilSatisfied());
 
   // Rebuild the context menu and click on the second extension item.
-  menu.reset(TestRenderViewContextMenu::Create(GetWebContents(), page_url,
-                                               GURL(), GURL()));
+  menu = TestRenderViewContextMenu::Create(GetWebContents(), page_url, GURL(),
+                                           GURL());
   id.string_uid = "id2";
   ASSERT_TRUE(FindCommandId(menu.get(), id, &command_id));
   menu->ExecuteCommand(command_id, 0);
@@ -542,7 +536,7 @@
       TestRenderViewContextMenu::Create(GetWebContents(), url, GURL(), GURL()));
 
   int index = 0;
-  MenuModel* model = NULL;
+  MenuModel* model = nullptr;
 
   ASSERT_TRUE(menu->GetMenuModelAndItemIndex(
       ContextMenuMatcher::ConvertToExtensionsCustomCommandId(0),
@@ -612,7 +606,7 @@
   // Load the extension.
   ASSERT_TRUE(LoadContextMenuExtension("separators"));
   const extensions::Extension* extension = GetExtensionNamed("Separators Test");
-  ASSERT_TRUE(extension != NULL);
+  ASSERT_TRUE(extension);
 
   // Navigate to test1.html inside the extension, which should create a bunch
   // of items at the top-level (but they'll get pushed into an auto-generated
@@ -628,7 +622,7 @@
 
   // The top-level item should be an "automagic parent" with the extension's
   // name.
-  MenuModel* model = NULL;
+  MenuModel* model = nullptr;
   int index = 0;
   base::string16 label;
   ASSERT_TRUE(menu->GetMenuModelAndItemIndex(
@@ -640,7 +634,7 @@
 
   // Get the submenu and verify the items there.
   MenuModel* submenu = model->GetSubmenuModelAt(index);
-  ASSERT_TRUE(submenu != NULL);
+  ASSERT_TRUE(submenu);
   VerifyMenuForSeparatorsTest(*submenu);
 
   // Now run our second test - navigate to test2.html which creates an explicit
@@ -649,15 +643,15 @@
   ui_test_utils::NavigateToURL(browser(),
                                GURL(extension->GetResourceURL("test2.html")));
   listener2.WaitUntilSatisfied();
-  menu.reset(
-      TestRenderViewContextMenu::Create(GetWebContents(), url, GURL(), GURL()));
+  menu =
+      TestRenderViewContextMenu::Create(GetWebContents(), url, GURL(), GURL());
   ASSERT_TRUE(menu->GetMenuModelAndItemIndex(
       ContextMenuMatcher::ConvertToExtensionsCustomCommandId(0),
       &model,
       &index));
   EXPECT_EQ(base::UTF8ToUTF16("parent"), model->GetLabelAt(index));
   submenu = model->GetSubmenuModelAt(index);
-  ASSERT_TRUE(submenu != NULL);
+  ASSERT_TRUE(submenu);
   VerifyMenuForSeparatorsTest(*submenu);
 }
 
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index 9be8d26..07c82e0 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -1912,18 +1912,20 @@
         temp_dir.GetPath().Append(expected_private_key_names[i]);
     PackExtensionTestClient pack_client(expected_crx_path,
                                         expected_private_key_path);
-    scoped_refptr<extensions::PackExtensionJob> packer(
-        new extensions::PackExtensionJob(&pack_client, output_dir,
-                                         base::FilePath(),
-                                         ExtensionCreator::kOverwriteCRX));
-    packer->Start();
+    {
+      extensions::PackExtensionJob packer(&pack_client, output_dir,
+                                          base::FilePath(),
+                                          ExtensionCreator::kOverwriteCRX);
+      packer.Start();
 
-    // The packer will post a notification task to the current thread's message
-    // loop when it is finished.  We manually run the loop here so that we
-    // block and catch the notification; otherwise, the process would exit.
-    // This call to |Run()| is matched by a call to |Quit()| in the
-    // |PackExtensionTestClient|'s notification handling code.
-    base::RunLoop().Run();
+      // The packer will post a notification task to the current thread's
+      // message loop when it is finished.  We manually run the loop here so
+      // that we block and catch the notification; otherwise, the process would
+      // exit.
+      // This call to |Run()| is matched by a call to |Quit()| in the
+      // |PackExtensionTestClient|'s notification handling code.
+      base::RunLoop().Run();
+    }
 
     if (HasFatalFailure())
       return;
diff --git a/chrome/browser/extensions/pack_extension_job.cc b/chrome/browser/extensions/pack_extension_job.cc
index 330b028..87d07d9 100644
--- a/chrome/browser/extensions/pack_extension_job.cc
+++ b/chrome/browser/extensions/pack_extension_job.cc
@@ -8,8 +8,11 @@
 #include "base/message_loop/message_loop.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/threading/sequenced_task_runner_handle.h"
 #include "chrome/browser/extensions/extension_creator.h"
 #include "chrome/grit/generated_resources.h"
+#include "content/public/browser/browser_thread.h"
+#include "extensions/browser/extension_file_task_runner.h"
 #include "extensions/common/constants.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -21,70 +24,92 @@
                                    const base::FilePath& root_directory,
                                    const base::FilePath& key_file,
                                    int run_flags)
-    : client_(client), key_file_(key_file), asynchronous_(true),
+    : client_(client),
+      key_file_(key_file),
       run_flags_(run_flags | ExtensionCreator::kRequireModernManifestVersion) {
   root_directory_ = root_directory.StripTrailingSeparators();
-  CHECK(BrowserThread::GetCurrentThreadIdentifier(&client_thread_id_));
-}
-
-void PackExtensionJob::Start() {
-  if (asynchronous_) {
-    BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
-                            base::BindOnce(&PackExtensionJob::Run, this));
-  } else {
-    Run();
-  }
-}
-
-void PackExtensionJob::ClearClient() {
-  client_ = NULL;
 }
 
 PackExtensionJob::~PackExtensionJob() {}
 
-void PackExtensionJob::Run() {
-  crx_file_out_ = base::FilePath(root_directory_.value() +
-                                 kExtensionFileExtension);
+void PackExtensionJob::Start() {
+  if (run_mode_ == RunMode::ASYNCHRONOUS) {
+    scoped_refptr<base::SequencedTaskRunner> task_runner =
+        base::SequencedTaskRunnerHandle::Get();
+    GetExtensionFileTaskRunner()->PostTask(
+        FROM_HERE,
+        base::BindOnce(&PackExtensionJob::Run,
+                       // See class level comments for why Unretained is safe.
+                       base::Unretained(this), std::move(task_runner)));
+  } else {
+    DCHECK_EQ(RunMode::SYNCHRONOUS, run_mode_);
+    Run(nullptr);
+  }
+}
 
-  if (key_file_.empty())
-    key_file_out_ = base::FilePath(root_directory_.value() +
-                                   kExtensionKeyFileExtension);
+void PackExtensionJob::Run(
+    scoped_refptr<base::SequencedTaskRunner> async_reply_task_runner) {
+  DCHECK_EQ(!!async_reply_task_runner, run_mode_ == RunMode::ASYNCHRONOUS)
+      << "Provide task runner iff we are running in asynchronous mode.";
+  // TODO(lazyboy): Use root_directory_.AddExtension(kExtensionFileExtension).
+  auto crx_file_out = base::MakeUnique<base::FilePath>(root_directory_.value() +
+                                                       kExtensionFileExtension);
+
+  auto key_file_out = base::MakeUnique<base::FilePath>();
+  if (key_file_.empty()) {
+    // TODO(lazyboy): Use
+    // root_directory_.AddExtension(kExtensionKeyFileExtension).
+    *key_file_out =
+        base::FilePath(root_directory_.value() + kExtensionKeyFileExtension);
+  }
 
   // TODO(aa): Need to internationalize the errors that ExtensionCreator
   // returns. See bug 20734.
   ExtensionCreator creator;
-  if (creator.Run(root_directory_, crx_file_out_, key_file_, key_file_out_,
+  if (creator.Run(root_directory_, *crx_file_out, key_file_, *key_file_out,
                   run_flags_)) {
-    if (asynchronous_) {
-      BrowserThread::PostTask(
-          client_thread_id_, FROM_HERE,
-          base::BindOnce(&PackExtensionJob::ReportSuccessOnClientThread, this));
+    if (run_mode_ == RunMode::ASYNCHRONOUS) {
+      async_reply_task_runner->PostTask(
+          FROM_HERE,
+          base::BindOnce(&PackExtensionJob::ReportSuccessOnClientSequence,
+                         // See class level comments for why Unretained is safe.
+                         base::Unretained(this), std::move(crx_file_out),
+                         std::move(key_file_out)));
+
     } else {
-      ReportSuccessOnClientThread();
+      ReportSuccessOnClientSequence(std::move(crx_file_out),
+                                    std::move(key_file_out));
     }
   } else {
-    if (asynchronous_) {
-      BrowserThread::PostTask(
-          client_thread_id_, FROM_HERE,
-          base::BindOnce(&PackExtensionJob::ReportFailureOnClientThread, this,
-                         creator.error_message(), creator.error_type()));
+    if (run_mode_ == RunMode::ASYNCHRONOUS) {
+      async_reply_task_runner->PostTask(
+          FROM_HERE,
+          base::BindOnce(&PackExtensionJob::ReportFailureOnClientSequence,
+                         // See class level comments for why Unretained is safe.
+                         base::Unretained(this), creator.error_message(),
+                         creator.error_type()));
     } else {
-      ReportFailureOnClientThread(creator.error_message(),
-          creator.error_type());
+      DCHECK_EQ(RunMode::SYNCHRONOUS, run_mode_);
+      ReportFailureOnClientSequence(creator.error_message(),
+                                    creator.error_type());
     }
   }
 }
 
-void PackExtensionJob::ReportSuccessOnClientThread() {
-  if (client_)
-    client_->OnPackSuccess(crx_file_out_, key_file_out_);
+void PackExtensionJob::ReportSuccessOnClientSequence(
+    std::unique_ptr<base::FilePath> crx_file_out,
+    std::unique_ptr<base::FilePath> key_file_out) {
+  DCHECK(client_);
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  client_->OnPackSuccess(*crx_file_out, *key_file_out);
 }
 
-void PackExtensionJob::ReportFailureOnClientThread(
+void PackExtensionJob::ReportFailureOnClientSequence(
     const std::string& error,
     ExtensionCreator::ErrorType error_type) {
-  if (client_)
-    client_->OnPackFailure(error, error_type);
+  DCHECK(client_);
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  client_->OnPackFailure(error, error_type);
 }
 
 // static
diff --git a/chrome/browser/extensions/pack_extension_job.h b/chrome/browser/extensions/pack_extension_job.h
index 7d663b0f..62fdc254 100644
--- a/chrome/browser/extensions/pack_extension_job.h
+++ b/chrome/browser/extensions/pack_extension_job.h
@@ -9,16 +9,20 @@
 
 #include "base/files/file_path.h"
 #include "base/macros.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/ptr_util.h"
+#include "base/sequenced_task_runner.h"
 #include "base/strings/string16.h"
 #include "chrome/browser/extensions/extension_creator.h"
-#include "content/public/browser/browser_thread.h"
 
 namespace extensions {
 
 // Manages packing an extension on the file thread and reporting the result
 // back to the UI.
-class PackExtensionJob : public base::RefCountedThreadSafe<PackExtensionJob> {
+// Ownership note: In "asynchronous" mode, |Client| has to make sure this
+// class's instances are kept alive until OnPackSuccess|OnPackFailure is called.
+// Therefore this class assumes that posting task with base::Unretained(this)
+// is safe.
+class PackExtensionJob {
  public:
   // Interface for people who want to use PackExtensionJob to implement.
   class Client {
@@ -36,41 +40,38 @@
                    const base::FilePath& root_directory,
                    const base::FilePath& key_file,
                    int run_flags);
+  ~PackExtensionJob();
 
   // Starts the packing job.
   void Start();
 
-  // The client should call this when it is destroyed to prevent
-  // PackExtensionJob from attempting to access it.
-  void ClearClient();
-
   // The standard packing success message.
   static base::string16 StandardSuccessMessage(const base::FilePath& crx_file,
                                          const base::FilePath& key_file);
 
-  void set_asynchronous(bool async) { asynchronous_ = async; }
+  void set_synchronous() { run_mode_ = RunMode::SYNCHRONOUS; }
 
  private:
-  friend class base::RefCountedThreadSafe<PackExtensionJob>;
+  enum class RunMode { SYNCHRONOUS, ASYNCHRONOUS };
 
-  virtual ~PackExtensionJob();
+  // If |run_mode_| is SYNCHRONOUS, this is run on whichever thread calls it.
+  void Run(scoped_refptr<base::SequencedTaskRunner> async_reply_task_runner);
+  void ReportSuccessOnClientSequence(
+      std::unique_ptr<base::FilePath> crx_file_out,
+      std::unique_ptr<base::FilePath> key_file_out);
+  void ReportFailureOnClientSequence(const std::string& error,
+                                     ExtensionCreator::ErrorType error_type);
 
-  // If |asynchronous_| is false, this is run on whichever thread calls it.
-  void Run();
-  void ReportSuccessOnClientThread();
-  void ReportFailureOnClientThread(const std::string& error,
-                                   ExtensionCreator::ErrorType error_type);
-
-  content::BrowserThread::ID client_thread_id_;
-  Client* client_;
+  Client* const client_;  // Owns us.
   base::FilePath root_directory_;
   base::FilePath key_file_;
-  base::FilePath crx_file_out_;
-  base::FilePath key_file_out_;
-  bool asynchronous_;
+  RunMode run_mode_ = RunMode::ASYNCHRONOUS;
   int run_flags_;  // Bitset of ExtensionCreator::RunFlags values - we always
                    // assume kRequireModernManifestVersion, though.
 
+  // Used to check methods that run on |client_|'s sequence.
+  SEQUENCE_CHECKER(sequence_checker_);
+
   DISALLOW_COPY_AND_ASSIGN(PackExtensionJob);
 };
 
diff --git a/chrome/browser/extensions/startup_helper.cc b/chrome/browser/extensions/startup_helper.cc
index fef26b7..4bfaaa1 100644
--- a/chrome/browser/extensions/startup_helper.cc
+++ b/chrome/browser/extensions/startup_helper.cc
@@ -62,12 +62,12 @@
     private_key_path = cmd_line.GetSwitchValuePath(switches::kPackExtensionKey);
   }
 
-  // Launch a job to perform the packing on the file thread.  Ignore warnings
-  // from the packing process. (e.g. Overwrite any existing crx file.)
-  pack_job_ = new PackExtensionJob(this, src_dir, private_key_path,
-                                   ExtensionCreator::kOverwriteCRX);
-  pack_job_->set_asynchronous(false);
-  pack_job_->Start();
+  // Launch a job to perform the packing on the blocking thread.  Ignore
+  // warnings from the packing process. (e.g. Overwrite any existing crx file.)
+  PackExtensionJob pack_job(this, src_dir, private_key_path,
+                            ExtensionCreator::kOverwriteCRX);
+  pack_job.set_synchronous();
+  pack_job.Start();
 
   return pack_job_succeeded_;
 }
@@ -186,9 +186,6 @@
   return success;
 }
 
-StartupHelper::~StartupHelper() {
-  if (pack_job_.get())
-    pack_job_->ClearClient();
-}
+StartupHelper::~StartupHelper() {}
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/startup_helper.h b/chrome/browser/extensions/startup_helper.h
index 43a0d2e..f1f8e37 100644
--- a/chrome/browser/extensions/startup_helper.h
+++ b/chrome/browser/extensions/startup_helper.h
@@ -37,7 +37,6 @@
   bool ValidateCrx(const base::CommandLine& cmd_line, std::string* error);
 
  private:
-  scoped_refptr<PackExtensionJob> pack_job_;
   bool pack_job_succeeded_;
 
   DISALLOW_COPY_AND_ASSIGN(StartupHelper);
diff --git a/chrome/browser/feature_engagement/feature_tracker.cc b/chrome/browser/feature_engagement/feature_tracker.cc
new file mode 100644
index 0000000..f98a607
--- /dev/null
+++ b/chrome/browser/feature_engagement/feature_tracker.cc
@@ -0,0 +1,54 @@
+// 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/feature_engagement/feature_tracker.h"
+
+#include "base/time/time.h"
+#include "chrome/browser/feature_engagement/tracker_factory.h"
+#include "components/feature_engagement/public/event_constants.h"
+#include "components/feature_engagement/public/feature_constants.h"
+#include "components/feature_engagement/public/tracker.h"
+
+namespace feature_engagement {
+
+FeatureTracker::FeatureTracker(Profile* profile,
+                               SessionDurationUpdater* session_duration_updater)
+    : profile_(profile),
+      session_duration_updater_(session_duration_updater),
+      session_duration_observer_(this) {
+  AddSessionDurationObserver();
+}
+
+FeatureTracker::~FeatureTracker() = default;
+
+void FeatureTracker::AddSessionDurationObserver() {
+  session_duration_observer_.Add(session_duration_updater_);
+}
+
+void FeatureTracker::RemoveSessionDurationObserver() {
+  session_duration_observer_.Remove(session_duration_updater_);
+}
+
+bool FeatureTracker::IsObserving() {
+  return session_duration_observer_.IsObserving(session_duration_updater_);
+}
+
+Tracker* FeatureTracker::GetTracker() const {
+  return TrackerFactory::GetForBrowserContext(profile_);
+}
+
+void FeatureTracker::OnSessionEnded(base::TimeDelta total_session_time) {
+  if (HasEnoughSessionTimeElapsed(total_session_time)) {
+    OnSessionTimeMet();
+    RemoveSessionDurationObserver();
+  }
+}
+
+bool FeatureTracker::HasEnoughSessionTimeElapsed(
+    base::TimeDelta total_session_time) {
+  return total_session_time.InMinutes() >=
+         GetSessionTimeRequiredToShowInMinutes();
+}
+
+}  // namespace feature_engagement
diff --git a/chrome/browser/feature_engagement/feature_tracker.h b/chrome/browser/feature_engagement/feature_tracker.h
new file mode 100644
index 0000000..295f8c36
--- /dev/null
+++ b/chrome/browser/feature_engagement/feature_tracker.h
@@ -0,0 +1,81 @@
+// 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_FEATURE_ENGAGEMENT_FEATURE_TRACKER_H_
+#define CHROME_BROWSER_FEATURE_ENGAGEMENT_FEATURE_TRACKER_H_
+
+#include "base/scoped_observer.h"
+#include "chrome/browser/feature_engagement/session_duration_updater.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/keyed_service/core/keyed_service.h"
+
+namespace feature_engagement {
+
+class Tracker;
+
+// The rFeatureTracker provides a backend for displaying in-product help for the
+// various features by collecting all common funcitonality. All subclasses of
+// FeatureTracker's factories depend on
+// SessionDurationUpdaterFactory::GetInstance() as SessionDurationUpdater is
+// responsible for letting all FeatureTrackers know how much active session time
+// has passed.
+//
+// SessionDurationUpdater keeps track of the observed session time and, upon
+// each session ending, updates all of the FeatureTrackers with the new total
+// observed session time. Once the observed session time exceeds the time
+// requirement provided by GetSessionTimeRequiredToShowInMinutes(), the
+// FeatureTracker unregisters itself as an obsever of SessionDurationUpdater.
+// SessionDurationUpdater stops updating the observed session time if no
+// features are observing it, and will start tracking the observed sesion time
+// again if another feature is added as an observer later.
+class FeatureTracker : public SessionDurationUpdater::Observer,
+                       public KeyedService {
+ public:
+  FeatureTracker(Profile* profile,
+                 SessionDurationUpdater* session_duration_updater);
+
+  // Adds the SessionDurationUpdater observer.
+  void AddSessionDurationObserver();
+  // Removes the SessionDurationUpdater observer.
+  void RemoveSessionDurationObserver();
+
+  // Returns the whether |session_duration_observer_| is observing sources for
+  // testing purposes.
+  bool IsObserving();
+
+  // SessionDurationUpdater::Observer:
+  void OnSessionEnded(base::TimeDelta total_session_time) override;
+
+ protected:
+  ~FeatureTracker() override;
+  // Returns the required session time in minutes for the FeatureTracker's
+  // subclass to show its promo.
+  virtual int GetSessionTimeRequiredToShowInMinutes() = 0;
+  // Alerts the feature tracker that the session time is up.
+  virtual void OnSessionTimeMet() = 0;
+  // Returns the Tracker associated with this FeatureTracker.
+  virtual Tracker* GetTracker() const;
+
+ private:
+  // Returns whether the active session time of a user has elapsed more than the
+  // required active session time for the feature.
+  bool HasEnoughSessionTimeElapsed(base::TimeDelta total_session_time);
+
+  // Owned by the ProfileManager.
+  Profile* const profile_;
+
+  // Singleton instance of KeyedService.
+  SessionDurationUpdater* const session_duration_updater_;
+
+  // Observes the SessionDurationUpdater and notifies when a desktop session
+  // starts and ends.
+  ScopedObserver<SessionDurationUpdater, SessionDurationUpdater::Observer>
+      session_duration_observer_;
+
+  DISALLOW_COPY_AND_ASSIGN(FeatureTracker);
+};
+
+}  // namespace feature_engagement
+
+#endif  // CHROME_BROWSER_FEATURE_ENGAGEMENT_FEATURE_TRACKER_H_
diff --git a/chrome/browser/feature_engagement/feature_tracker_unittest.cc b/chrome/browser/feature_engagement/feature_tracker_unittest.cc
new file mode 100644
index 0000000..85ef03d
--- /dev/null
+++ b/chrome/browser/feature_engagement/feature_tracker_unittest.cc
@@ -0,0 +1,131 @@
+// 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/feature_engagement/feature_tracker.h"
+
+#include "base/feature_list.h"
+#include "base/metrics/field_trial.h"
+#include "base/metrics/field_trial_param_associator.h"
+#include "base/metrics/field_trial_params.h"
+#include "base/run_loop.h"
+#include "base/sequenced_task_runner.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/feature_engagement/session_duration_updater.h"
+#include "chrome/browser/feature_engagement/session_duration_updater_factory.h"
+#include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "chrome/test/base/testing_profile_manager.h"
+#include "components/feature_engagement/public/event_constants.h"
+#include "components/feature_engagement/public/feature_constants.h"
+#include "components/sync_preferences/testing_pref_service_syncable.h"
+#include "components/variations/variations_params_manager.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace feature_engagement {
+
+namespace {
+
+const int kTestTimeInMinutes = 100;
+const int kTestTimeSufficentInMinutes = 110;
+const int kTestTimeInsufficientInMinutes = 90;
+const char kTestProfileName[] = "test-profile";
+
+class TestFeatureTracker : public FeatureTracker {
+ public:
+  explicit TestFeatureTracker(Profile* profile)
+      : FeatureTracker(
+            profile,
+            feature_engagement::SessionDurationUpdaterFactory::GetInstance()
+                ->GetForProfile(profile)),
+        pref_service_(
+            base::MakeUnique<sync_preferences::TestingPrefServiceSyncable>()) {
+    SessionDurationUpdater::RegisterProfilePrefs(pref_service_->registry());
+  }
+
+  int GetSessionTimeRequiredToShowInMinutes() override {
+    return kTestTimeInMinutes;
+  }
+
+  void OnSessionTimeMet() override {}
+
+ private:
+  const std::unique_ptr<sync_preferences::TestingPrefServiceSyncable>
+      pref_service_;
+};
+
+class MockTestFeatureTracker : public TestFeatureTracker {
+ public:
+  explicit MockTestFeatureTracker(Profile* profile)
+      : TestFeatureTracker(profile) {}
+  MOCK_METHOD0(OnSessionTimeMet, void());
+};
+
+class FeatureTrackerTest : public testing::Test {
+ public:
+  FeatureTrackerTest() = default;
+  ~FeatureTrackerTest() override = default;
+
+  // testing::Test:
+  void SetUp() override {
+    // Start the DesktopSessionDurationTracker to track active session time.
+    metrics::DesktopSessionDurationTracker::Initialize();
+    testing_profile_manager_ = base::MakeUnique<TestingProfileManager>(
+        TestingBrowserProcess::GetGlobal());
+    ASSERT_TRUE(testing_profile_manager_->SetUp());
+    mock_feature_tracker_ =
+        base::MakeUnique<testing::StrictMock<MockTestFeatureTracker>>(
+            testing_profile_manager_->CreateTestingProfile(kTestProfileName));
+  }
+
+  void TearDown() override {
+    metrics::DesktopSessionDurationTracker::CleanupForTesting();
+    testing_profile_manager_.reset();
+  }
+
+ protected:
+  std::unique_ptr<TestingProfileManager> testing_profile_manager_;
+  std::unique_ptr<MockTestFeatureTracker> mock_feature_tracker_;
+
+ private:
+  content::TestBrowserThreadBundle thread_bundle_;
+
+  DISALLOW_COPY_AND_ASSIGN(FeatureTrackerTest);
+};
+
+// If OnSessionEnded parameter is greater than HasEnoughSessionTimeElapsed
+// then OnSessionTimeMet should be called.
+//
+// Note: in this case, RemoveSessionDurationObserver is called inside of
+// OnSessionTimeMet, so it doesn't need to be called after the fact.
+TEST_F(FeatureTrackerTest, TestExpectOnSessionTimeMet) {
+  EXPECT_CALL(*mock_feature_tracker_, OnSessionTimeMet());
+  mock_feature_tracker_.get()->OnSessionEnded(
+      base::TimeDelta::FromMinutes(kTestTimeSufficentInMinutes));
+}
+
+// If OnSessionEnded parameter is less than than HasEnoughSessionTimeElapsed
+// then OnSessionTimeMet should not be called.
+TEST_F(FeatureTrackerTest, TestDontExpectOnSessionTimeMet) {
+  mock_feature_tracker_.get()->OnSessionEnded(
+      base::TimeDelta::FromMinutes(kTestTimeInsufficientInMinutes));
+  mock_feature_tracker_.get()->RemoveSessionDurationObserver();
+}
+
+// The FeatureTracker should be observing sources until the
+// RemoveSessionDurationObserver is called.
+TEST_F(FeatureTrackerTest, TestAddAndRemoveObservers) {
+  // AddSessionDurationObserver is called on initialization.
+  ASSERT_TRUE(mock_feature_tracker_->IsObserving());
+
+  mock_feature_tracker_.get()->RemoveSessionDurationObserver();
+
+  EXPECT_FALSE(mock_feature_tracker_->IsObserving());
+}
+
+}  // namespace
+
+}  // namespace feature_engagement
diff --git a/chrome/browser/feature_engagement/new_tab/new_tab_tracker.cc b/chrome/browser/feature_engagement/new_tab/new_tab_tracker.cc
index e735dde..fc57d4f0 100644
--- a/chrome/browser/feature_engagement/new_tab/new_tab_tracker.cc
+++ b/chrome/browser/feature_engagement/new_tab/new_tab_tracker.cc
@@ -14,8 +14,6 @@
 #include "components/feature_engagement/public/event_constants.h"
 #include "components/feature_engagement/public/feature_constants.h"
 #include "components/feature_engagement/public/tracker.h"
-#include "components/pref_registry/pref_registry_syncable.h"
-#include "components/prefs/pref_service.h"
 
 namespace {
 
@@ -25,31 +23,21 @@
 
 namespace feature_engagement {
 
-NewTabTracker::NewTabTracker(Profile* profile)
-    : profile_(profile), duration_tracker_observer_(this) {
-  AddDurationTrackerObserver();
-}
+NewTabTracker::NewTabTracker(Profile* profile,
+                             SessionDurationUpdater* session_duration_updater)
+    : FeatureTracker(profile, session_duration_updater) {}
 
-NewTabTracker::NewTabTracker() : NewTabTracker(nullptr) {}
+NewTabTracker::NewTabTracker(SessionDurationUpdater* session_duration_updater)
+    : NewTabTracker(nullptr, session_duration_updater) {}
 
 NewTabTracker::~NewTabTracker() = default;
 
-// static
-void NewTabTracker::RegisterProfilePrefs(
-    user_prefs::PrefRegistrySyncable* registry) {
-  registry->RegisterIntegerPref(prefs::kSessionTimeTotal, 0);
-}
-
 void NewTabTracker::OnNewTabOpened() {
-  GetFeatureTracker()->NotifyEvent(events::kNewTabOpened);
+  GetTracker()->NotifyEvent(events::kNewTabOpened);
 }
 
 void NewTabTracker::OnOmniboxNavigation() {
-  GetFeatureTracker()->NotifyEvent(events::kOmniboxInteraction);
-}
-
-void NewTabTracker::OnSessionTimeMet() {
-  GetFeatureTracker()->NotifyEvent(events::kSessionTime);
+  GetTracker()->NotifyEvent(events::kOmniboxInteraction);
 }
 
 void NewTabTracker::OnOmniboxFocused() {
@@ -58,61 +46,23 @@
 }
 
 void NewTabTracker::OnPromoClosed() {
-  GetFeatureTracker()->Dismissed(kIPHNewTabFeature);
+  GetTracker()->Dismissed(kIPHNewTabFeature);
 }
 
 bool NewTabTracker::ShouldShowPromo() {
-  return GetFeatureTracker()->ShouldTriggerHelpUI(kIPHNewTabFeature);
+  return GetTracker()->ShouldTriggerHelpUI(kIPHNewTabFeature);
 }
 
-void NewTabTracker::AddDurationTrackerObserver() {
-  duration_tracker_observer_.Add(metrics::DesktopSessionDurationTracker::Get());
+void NewTabTracker::OnSessionTimeMet() {
+  GetTracker()->NotifyEvent(events::kNewTabSessionTimeMet);
 }
 
-void NewTabTracker::RemoveDurationTrackerObserver() {
-  duration_tracker_observer_.Remove(
-      metrics::DesktopSessionDurationTracker::Get());
-}
-
-bool NewTabTracker::HasEnoughSessionTimeElapsed() {
-  return GetPrefs()->GetInteger(prefs::kSessionTimeTotal) >= kTwoHoursInMinutes;
+int NewTabTracker::GetSessionTimeRequiredToShowInMinutes() {
+  return kTwoHoursInMinutes;
 }
 
 void NewTabTracker::ShowPromo() {
   NewTabButton::ShowPromoForLastActiveBrowser();
 }
 
-Tracker* NewTabTracker::GetFeatureTracker() {
-  return TrackerFactory::GetForBrowserContext(profile_);
-}
-
-PrefService* NewTabTracker::GetPrefs() {
-  return profile_->GetPrefs();
-}
-
-void NewTabTracker::UpdateSessionTime(base::TimeDelta elapsed) {
-  // Session time does not need to be tracked anymore if the
-  // in-product help has been shown already.
-  // This prevents unnecessary interaction with prefs.
-  if (GetFeatureTracker()->GetTriggerState(kIPHNewTabFeature) ==
-      Tracker::TriggerState::HAS_BEEN_DISPLAYED) {
-    return;
-  }
-
-  base::TimeDelta elapsed_session_time;
-  elapsed_session_time += base::TimeDelta::FromMinutes(GetPrefs()->GetInteger(
-                              prefs::kSessionTimeTotal)) +
-                          elapsed;
-  GetPrefs()->SetInteger(prefs::kSessionTimeTotal,
-                         elapsed_session_time.InMinutes());
-}
-
-void NewTabTracker::OnSessionEnded(base::TimeDelta delta) {
-  UpdateSessionTime(delta);
-  if (HasEnoughSessionTimeElapsed()) {
-    OnSessionTimeMet();
-    RemoveDurationTrackerObserver();
-  }
-}
-
 }  // namespace feature_engagement
diff --git a/chrome/browser/feature_engagement/new_tab/new_tab_tracker.h b/chrome/browser/feature_engagement/new_tab/new_tab_tracker.h
index 5cb02f8..19d8f7cc 100644
--- a/chrome/browser/feature_engagement/new_tab/new_tab_tracker.h
+++ b/chrome/browser/feature_engagement/new_tab/new_tab_tracker.h
@@ -5,33 +5,34 @@
 #ifndef CHROME_BROWSER_FEATURE_ENGAGEMENT_NEW_TAB_NEW_TAB_TRACKER_H_
 #define CHROME_BROWSER_FEATURE_ENGAGEMENT_NEW_TAB_NEW_TAB_TRACKER_H_
 
-#include "base/scoped_observer.h"
-#include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h"
-#include "chrome/browser/profiles/profile.h"
-#include "components/feature_engagement/public/tracker.h"
-#include "components/keyed_service/core/keyed_service.h"
+#include "chrome/browser/feature_engagement/feature_tracker.h"
 
-namespace user_prefs {
-class PrefRegistrySyncable;
-}  // namespace user_prefs
+#include "chrome/browser/feature_engagement/session_duration_updater.h"
+#include "chrome/browser/feature_engagement/session_duration_updater_factory.h"
 
 namespace feature_engagement {
 
-// The NewTabTracker provides a backend for displaying
-// in-product help for the new tab button.
-class NewTabTracker : public metrics::DesktopSessionDurationTracker::Observer,
-                      public KeyedService {
+// The NewTabTracker provides a backend for displaying in-product help for the
+// new tab button. NewTabTracker is the interface through which the event
+// constants for the NewTab feature can be be altered. Once all of the event
+// constants are met, NewTabTracker calls for the NewTabPromo to be shown, along
+// with recording when the NewTabPromo is dimissed. The requirements to show
+// the NewTabPromo are as follows:
+//
+// - At least two hours of observed session time have elapsed.
+// - The user has never opened another tab through any means.
+// - The user has navigated away from the start home screen.
+// - The omnibox is in focus, which implies the user is intending on navigating
+//   to a new page.
+class NewTabTracker : public FeatureTracker {
  public:
-  explicit NewTabTracker(Profile* profile);
-
-  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
+  NewTabTracker(Profile* profile,
+                SessionDurationUpdater* session_duration_updater);
 
   // Alerts the new tab tracker that a new tab was opened.
   void OnNewTabOpened();
   // Alerts the new tab tracker that the omnibox has been used.
   void OnOmniboxNavigation();
-  // Alerts the new tab tracker that the session time is up.
-  void OnSessionTimeMet();
   // Checks if the promo should be displayed since the omnibox is on focus.
   void OnOmniboxFocused();
   // Clears the flag for whether there is any in-product help being displayed.
@@ -39,44 +40,24 @@
   // Returns whether or not the promo should be displayed.
   bool ShouldShowPromo();
 
-  // Adding the DesktopSessionDurationTracker observer.
-  void AddDurationTrackerObserver();
-  // Removing the DesktopSessionDurationTracker observer.
-  void RemoveDurationTrackerObserver();
-
  protected:
-  NewTabTracker();
+  // Alternate constructor to support unit testing.
+  explicit NewTabTracker(SessionDurationUpdater* session_duration_updater);
   ~NewTabTracker() override;
 
  private:
-  // Returns whether the active session time of a user has elapsed
-  // more than two hours.
-  bool HasEnoughSessionTimeElapsed();
+  FRIEND_TEST_ALL_PREFIXES(NewTabTrackerEventTest, TestOnSessionTimeMet);
+  FRIEND_TEST_ALL_PREFIXES(NewTabTrackerTest, TestShouldNotShowPromo);
+  FRIEND_TEST_ALL_PREFIXES(NewTabTrackerTest, TestShouldShowPromo);
+  FRIEND_TEST_ALL_PREFIXES(NewTabTrackerBrowserTest, TestShowPromo);
+
+  // FeatureTracker:
+  int GetSessionTimeRequiredToShowInMinutes() override;
+  void OnSessionTimeMet() override;
 
   // Sets the NewTabInProductHelp pref to true and calls the New Tab Promo.
   void ShowPromo();
 
-  // Virtual to support mocking by unit tests.
-  virtual Tracker* GetFeatureTracker();
-
-  virtual PrefService* GetPrefs();
-
-  // Updates the pref that stores active session time per user unless the
-  // new tab in-product help has been displayed already.
-  void UpdateSessionTime(base::TimeDelta elapsed);
-
-  // metrics::DesktopSessionDurationTracker::Observer::
-  void OnSessionEnded(base::TimeDelta delta) override;
-
-  // Owned by ProfileManager.
-  Profile* const profile_;
-
-  // Observes the DesktopSessionDurationTracker and notifies when a desktop
-  // session starts and ends.
-  ScopedObserver<metrics::DesktopSessionDurationTracker,
-                 metrics::DesktopSessionDurationTracker::Observer>
-      duration_tracker_observer_;
-
   DISALLOW_COPY_AND_ASSIGN(NewTabTracker);
 };
 
diff --git a/chrome/browser/feature_engagement/new_tab/new_tab_tracker_browsertest.cc b/chrome/browser/feature_engagement/new_tab/new_tab_tracker_browsertest.cc
index 9c638fb..ca4c502 100644
--- a/chrome/browser/feature_engagement/new_tab/new_tab_tracker_browsertest.cc
+++ b/chrome/browser/feature_engagement/new_tab/new_tab_tracker_browsertest.cc
@@ -89,7 +89,8 @@
 
 IN_PROC_BROWSER_TEST_F(NewTabTrackerBrowserTest, TestShowPromo) {
   // Bypassing the 2 hour active session time requirement.
-  EXPECT_CALL(*feature_engagement_tracker_, NotifyEvent(events::kSessionTime));
+  EXPECT_CALL(*feature_engagement_tracker_,
+              NotifyEvent(events::kNewTabSessionTimeMet));
   NewTabTrackerFactory::GetInstance()
       ->GetForProfile(browser()->profile())
       ->OnSessionTimeMet();
diff --git a/chrome/browser/feature_engagement/new_tab/new_tab_tracker_factory.cc b/chrome/browser/feature_engagement/new_tab/new_tab_tracker_factory.cc
index 91f85ea..1f48ca5 100644
--- a/chrome/browser/feature_engagement/new_tab/new_tab_tracker_factory.cc
+++ b/chrome/browser/feature_engagement/new_tab/new_tab_tracker_factory.cc
@@ -6,6 +6,8 @@
 
 #include "base/memory/singleton.h"
 #include "chrome/browser/feature_engagement/new_tab/new_tab_tracker.h"
+#include "chrome/browser/feature_engagement/session_duration_updater.h"
+#include "chrome/browser/feature_engagement/session_duration_updater_factory.h"
 #include "chrome/browser/feature_engagement/tracker_factory.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
 #include "chrome/browser/profiles/profile.h"
@@ -28,6 +30,7 @@
     : BrowserContextKeyedServiceFactory(
           "NewTabTracker",
           BrowserContextDependencyManager::GetInstance()) {
+  DependsOn(SessionDurationUpdaterFactory::GetInstance());
   DependsOn(TrackerFactory::GetInstance());
 }
 
@@ -35,7 +38,10 @@
 
 KeyedService* NewTabTrackerFactory::BuildServiceInstanceFor(
     content::BrowserContext* context) const {
-  return new NewTabTracker(Profile::FromBrowserContext(context));
+  return new NewTabTracker(
+      Profile::FromBrowserContext(context),
+      feature_engagement::SessionDurationUpdaterFactory::GetInstance()
+          ->GetForProfile(Profile::FromBrowserContext(context)));
 }
 
 content::BrowserContext* NewTabTrackerFactory::GetBrowserContextToUse(
diff --git a/chrome/browser/feature_engagement/new_tab/new_tab_tracker_unittest.cc b/chrome/browser/feature_engagement/new_tab/new_tab_tracker_unittest.cc
index d5e12872..c838edf 100644
--- a/chrome/browser/feature_engagement/new_tab/new_tab_tracker_unittest.cc
+++ b/chrome/browser/feature_engagement/new_tab/new_tab_tracker_unittest.cc
@@ -11,8 +11,14 @@
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
 #include "base/test/scoped_feature_list.h"
+#include "chrome/browser/feature_engagement/feature_tracker.h"
+#include "chrome/browser/feature_engagement/session_duration_updater.h"
+#include "chrome/browser/feature_engagement/session_duration_updater_factory.h"
 #include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/common/pref_names.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "chrome/test/base/testing_profile_manager.h"
 #include "components/feature_engagement/public/event_constants.h"
 #include "components/feature_engagement/public/feature_constants.h"
 #include "components/feature_engagement/public/tracker.h"
@@ -29,6 +35,7 @@
 
 const char kGroupName[] = "Enabled";
 const char kNewTabTrialName[] = "NewTabTrial";
+const char kTestProfileName[] = "test-profile";
 
 class MockTracker : public Tracker {
  public:
@@ -44,17 +51,20 @@
 
 class FakeNewTabTracker : public NewTabTracker {
  public:
-  explicit FakeNewTabTracker(Tracker* feature_tracker)
-      : feature_tracker_(feature_tracker),
+  FakeNewTabTracker(Tracker* feature_tracker, Profile* profile)
+      : NewTabTracker(
+            feature_engagement::SessionDurationUpdaterFactory::GetInstance()
+                ->GetForProfile(profile)),
+        feature_tracker_(feature_tracker),
         pref_service_(
             base::MakeUnique<sync_preferences::TestingPrefServiceSyncable>()) {
-    NewTabTracker::RegisterProfilePrefs(pref_service_->registry());
+    SessionDurationUpdater::RegisterProfilePrefs(pref_service_->registry());
   }
 
-  // feature_engagement::NewTabTracker::
-  Tracker* GetFeatureTracker() override { return feature_tracker_; }
+  PrefService* GetPrefs() { return pref_service_.get(); }
 
-  PrefService* GetPrefs() override { return pref_service_.get(); }
+  // feature_engagement::NewTabTracker:
+  Tracker* GetTracker() const override { return feature_tracker_; }
 
  private:
   Tracker* const feature_tracker_;
@@ -71,18 +81,25 @@
   void SetUp() override {
     // Start the DesktopSessionDurationTracker to track active session time.
     metrics::DesktopSessionDurationTracker::Initialize();
+    testing_profile_manager_ = base::MakeUnique<TestingProfileManager>(
+        TestingBrowserProcess::GetGlobal());
+    ASSERT_TRUE(testing_profile_manager_->SetUp());
     mock_tracker_ = base::MakeUnique<testing::StrictMock<MockTracker>>();
-    new_tab_tracker_ = base::MakeUnique<FakeNewTabTracker>(mock_tracker_.get());
+    new_tab_tracker_ = base::MakeUnique<FakeNewTabTracker>(
+        mock_tracker_.get(),
+        testing_profile_manager_->CreateTestingProfile(kTestProfileName));
   }
 
   void TearDown() override {
-    new_tab_tracker_->RemoveDurationTrackerObserver();
+    new_tab_tracker_->RemoveSessionDurationObserver();
     metrics::DesktopSessionDurationTracker::CleanupForTesting();
+    testing_profile_manager_.reset();
   }
 
  protected:
-  std::unique_ptr<FakeNewTabTracker> new_tab_tracker_;
+  std::unique_ptr<TestingProfileManager> testing_profile_manager_;
   std::unique_ptr<MockTracker> mock_tracker_;
+  std::unique_ptr<FakeNewTabTracker> new_tab_tracker_;
 
  private:
   content::TestBrowserThreadBundle thread_bundle_;
@@ -111,7 +128,7 @@
 // If OnSessionTimeMet() is called, the feature_engagement::Tracker
 // receives the kSessionTime event.
 TEST_F(NewTabTrackerEventTest, TestOnSessionTimeMet) {
-  EXPECT_CALL(*mock_tracker_, NotifyEvent(events::kSessionTime));
+  EXPECT_CALL(*mock_tracker_, NotifyEvent(events::kNewTabSessionTimeMet));
   new_tab_tracker_->OnSessionTimeMet();
 }
 
@@ -144,8 +161,8 @@
         "name:new_tab_opened;comparator:==0;window:3650;storage:3650";
     new_tab_params["event_omnibox_used"] =
         "name:omnibox_used;comparator:>=1;window:3650;storage:3650";
-    new_tab_params["event_session_time"] =
-        "name:session_time;comparator:>=1;window:3650;storage:3650";
+    new_tab_params["event_new_tab_session_time_met"] =
+        "name:new_tab_session_time_met;comparator:>=1;window:3650;storage:3650";
     new_tab_params["event_trigger"] =
         "name:new_tab_trigger;comparator:any;window:3650;storage:3650";
     new_tab_params["event_used"] =
@@ -158,10 +175,15 @@
     // Start the DesktopSessionDurationTracker to track active session time.
     metrics::DesktopSessionDurationTracker::Initialize();
 
+    testing_profile_manager_ = base::MakeUnique<TestingProfileManager>(
+        TestingBrowserProcess::GetGlobal());
+    ASSERT_TRUE(testing_profile_manager_->SetUp());
+
     feature_engagement_tracker_ = CreateTestTracker();
 
-    new_tab_tracker_ =
-        base::MakeUnique<FakeNewTabTracker>(feature_engagement_tracker_.get());
+    new_tab_tracker_ = base::MakeUnique<FakeNewTabTracker>(
+        feature_engagement_tracker_.get(),
+        testing_profile_manager_->CreateTestingProfile(kTestProfileName));
 
     // The feature engagement tracker does async initialization.
     base::RunLoop().RunUntilIdle();
@@ -169,7 +191,8 @@
   }
 
   void TearDown() override {
-    new_tab_tracker_->RemoveDurationTrackerObserver();
+    new_tab_tracker_->RemoveSessionDurationObserver();
+    testing_profile_manager_->DeleteTestingProfile(kTestProfileName);
     metrics::DesktopSessionDurationTracker::CleanupForTesting();
 
     // This is required to ensure each test can define its own params.
@@ -194,6 +217,7 @@
   variations::testing::VariationParamsManager params_manager_;
 
  private:
+  std::unique_ptr<TestingProfileManager> testing_profile_manager_;
   base::test::ScopedFeatureList scoped_feature_list_;
   content::TestBrowserThreadBundle thread_bundle_;
   std::map<std::string, base::FieldTrial*> trials_;
@@ -232,22 +256,4 @@
   EXPECT_TRUE(new_tab_tracker_->ShouldShowPromo());
 }
 
-// Test that the correct duration of session is being recorded.
-TEST_F(NewTabTrackerTest, TestOnSessionEnded) {
-  metrics::DesktopSessionDurationTracker::Observer* observer =
-      dynamic_cast<FakeNewTabTracker*>(new_tab_tracker_.get());
-
-  // Simulate passing 30 active minutes.
-  observer->OnSessionEnded(base::TimeDelta::FromMinutes(30));
-
-  EXPECT_EQ(30,
-            new_tab_tracker_->GetPrefs()->GetInteger(prefs::kSessionTimeTotal));
-
-  // Simulate passing 50 minutes.
-  observer->OnSessionEnded(base::TimeDelta::FromMinutes(50));
-
-  EXPECT_EQ(80,
-            new_tab_tracker_->GetPrefs()->GetInteger(prefs::kSessionTimeTotal));
-}
-
 }  // namespace feature_engagement
diff --git a/chrome/browser/feature_engagement/session_duration_updater.cc b/chrome/browser/feature_engagement/session_duration_updater.cc
new file mode 100644
index 0000000..46468ac
--- /dev/null
+++ b/chrome/browser/feature_engagement/session_duration_updater.cc
@@ -0,0 +1,85 @@
+// 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/feature_engagement/session_duration_updater.h"
+
+#include "base/observer_list.h"
+#include "base/time/time.h"
+#include "chrome/browser/feature_engagement/tracker_factory.h"
+#include "chrome/common/pref_names.h"
+#include "components/feature_engagement/public/event_constants.h"
+#include "components/feature_engagement/public/feature_constants.h"
+#include "components/pref_registry/pref_registry_syncable.h"
+#include "components/prefs/pref_service.h"
+
+namespace feature_engagement {
+
+SessionDurationUpdater::SessionDurationUpdater(PrefService* pref_service)
+    : duration_tracker_observer_(this), pref_service_(pref_service) {
+  AddDurationTrackerObserver();
+}
+
+SessionDurationUpdater::~SessionDurationUpdater() = default;
+
+// static
+void SessionDurationUpdater::RegisterProfilePrefs(
+    user_prefs::PrefRegistrySyncable* registry) {
+  registry->RegisterIntegerPref(prefs::kObservedSessionTime, 0);
+}
+
+void SessionDurationUpdater::AddObserver(Observer* observer) {
+  observer_list_.AddObserver(observer);
+
+  // Re-adds SessionDurationUpdater as an observer of
+  // DesktopSessionDurationTracker if another feature is added after
+  // SessionDurationUpdater was removed.
+  if (!duration_tracker_observer_.IsObserving(
+          metrics::DesktopSessionDurationTracker::Get()))
+    AddDurationTrackerObserver();
+}
+
+void SessionDurationUpdater::RemoveObserver(Observer* observer) {
+  observer_list_.RemoveObserver(observer);
+  // If all the observer Features have removed themselves due to their active
+  // time limits have been reached, the SessionDurationUpdater removes itself
+  // as an observer of DesktopSessionDurationTracker.
+  if (!observer_list_.might_have_observers())
+    RemoveDurationTrackerObserver();
+}
+
+void SessionDurationUpdater::OnSessionEnded(base::TimeDelta elapsed) {
+  // This case is only used during testing as that is the only case that
+  // DesktopSessionDurationTracker isn't calling this on its observer.
+  if (!duration_tracker_observer_.IsObserving(
+          metrics::DesktopSessionDurationTracker::Get())) {
+    return;
+  }
+
+  base::TimeDelta elapsed_session_time;
+
+  elapsed_session_time +=
+      base::TimeDelta::FromMinutes(
+          pref_service_->GetInteger(prefs::kObservedSessionTime)) +
+      elapsed;
+  pref_service_->SetInteger(prefs::kObservedSessionTime,
+                            elapsed_session_time.InMinutes());
+
+  for (Observer& observer : observer_list_)
+    observer.OnSessionEnded(elapsed_session_time);
+}
+
+void SessionDurationUpdater::AddDurationTrackerObserver() {
+  duration_tracker_observer_.Add(metrics::DesktopSessionDurationTracker::Get());
+}
+
+void SessionDurationUpdater::RemoveDurationTrackerObserver() {
+  duration_tracker_observer_.Remove(
+      metrics::DesktopSessionDurationTracker::Get());
+}
+
+PrefService* SessionDurationUpdater::GetPrefs() {
+  return pref_service_;
+}
+
+}  // namespace feature_engagement
diff --git a/chrome/browser/feature_engagement/session_duration_updater.h b/chrome/browser/feature_engagement/session_duration_updater.h
new file mode 100644
index 0000000..df41ac31
--- /dev/null
+++ b/chrome/browser/feature_engagement/session_duration_updater.h
@@ -0,0 +1,87 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_FEATURE_ENGAGEMENT_SESSION_DURATION_UPDATER_H_
+#define CHROME_BROWSER_FEATURE_ENGAGEMENT_SESSION_DURATION_UPDATER_H_
+
+#include "base/scoped_observer.h"
+#include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h"
+#include "components/keyed_service/core/keyed_service.h"
+#include "components/prefs/pref_service.h"
+
+namespace user_prefs {
+class PrefRegistrySyncable;
+}  // namespace user_prefs
+
+namespace feature_engagement {
+
+// The SessionDurationUpdater tracks the total amount of observed time across
+// Chrome restarts. Observed time in this context is active session time that
+// occurs while there is a FeatureTracker whose active session time requirement
+// has not been satisfied. This allows subclasses of FeatureTracker to check how
+// much active time has passed, and decide whether to show their respective
+// promos accordingly.
+//
+// When an active session is closed, DesktopSessionDurationTracker calls
+// OnSessionEnded and the observed time is incremented and persisted. Then,
+// OnSessionEnded is called on all of Features observing SessionDurationUpdater.
+// If the feature has its time limit exceeded, it should remove itself as an
+// observer of SessionDurationUpdater. If SessionDurationUpdater has no
+// observers, it means that the time limits of all the observing features has
+// been exceeded, so the SessionDurationUpdater removes itself as an observer of
+// DesktopSessionDurationTracker and stops updating observed session time.
+//
+// If all observers are removed, SessionDurationUpdater doesn't continue
+// updating the observed session time. However, if another feature is added as
+// an observer later, SessionDurationUpdater starts incrementing the observed
+// session time again.
+
+class SessionDurationUpdater
+    : public metrics::DesktopSessionDurationTracker::Observer,
+      public KeyedService {
+ public:
+  // The methods for the observer will be called on the UI thread.
+  class Observer {
+   public:
+    virtual ~Observer() = default;
+    virtual void OnSessionEnded(base::TimeDelta total_session_time) = 0;
+  };
+
+  explicit SessionDurationUpdater(PrefService* pref_service);
+  ~SessionDurationUpdater() override;
+
+  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
+
+  // For observing the status of the session tracker.
+  void AddObserver(Observer* observer);
+  void RemoveObserver(Observer* observer);
+
+  // metrics::DesktopSessionDurationtracker::Observer:
+  void OnSessionEnded(base::TimeDelta delta) override;
+
+ private:
+  // Adds the DesktopSessionDurationTracker observer.
+  void AddDurationTrackerObserver();
+  // Removes the DesktopSessionDurationTracker observer.
+  void RemoveDurationTrackerObserver();
+  // Returns the pref service associated with this SessionDurationUpdater.
+  virtual PrefService* GetPrefs();
+
+  // Observes the DesktopSessionDurationTracker and notifies when a desktop
+  // session starts and ends.
+  ScopedObserver<metrics::DesktopSessionDurationTracker,
+                 metrics::DesktopSessionDurationTracker::Observer>
+      duration_tracker_observer_;
+
+  // Owned by Profile manager.
+  PrefService* const pref_service_;
+
+  base::ObserverList<Observer> observer_list_;
+
+  DISALLOW_COPY_AND_ASSIGN(SessionDurationUpdater);
+};
+
+}  // namespace feature_engagement
+
+#endif  // CHROME_BROWSER_FEATURE_ENGAGEMENT_SESSION_DURATION_UPDATER_H_
diff --git a/chrome/browser/feature_engagement/session_duration_updater_factory.cc b/chrome/browser/feature_engagement/session_duration_updater_factory.cc
new file mode 100644
index 0000000..8e78ac8c
--- /dev/null
+++ b/chrome/browser/feature_engagement/session_duration_updater_factory.cc
@@ -0,0 +1,46 @@
+// 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/feature_engagement/session_duration_updater_factory.h"
+
+#include "base/memory/singleton.h"
+#include "chrome/browser/feature_engagement/session_duration_updater.h"
+#include "chrome/browser/feature_engagement/tracker_factory.h"
+#include "chrome/browser/profiles/incognito_helpers.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "content/public/browser/browser_context.h"
+
+namespace feature_engagement {
+
+// static
+SessionDurationUpdaterFactory* SessionDurationUpdaterFactory::GetInstance() {
+  return base::Singleton<SessionDurationUpdaterFactory>::get();
+}
+
+SessionDurationUpdater* SessionDurationUpdaterFactory::GetForProfile(
+    Profile* profile) {
+  return static_cast<SessionDurationUpdater*>(
+      GetInstance()->GetServiceForBrowserContext(profile, true));
+}
+
+SessionDurationUpdaterFactory::SessionDurationUpdaterFactory()
+    : BrowserContextKeyedServiceFactory(
+          "SessionDurationUpdater",
+          BrowserContextDependencyManager::GetInstance()) {}
+
+SessionDurationUpdaterFactory::~SessionDurationUpdaterFactory() = default;
+
+KeyedService* SessionDurationUpdaterFactory::BuildServiceInstanceFor(
+    content::BrowserContext* context) const {
+  return new SessionDurationUpdater(
+      Profile::FromBrowserContext(context)->GetPrefs());
+}
+
+content::BrowserContext* SessionDurationUpdaterFactory::GetBrowserContextToUse(
+    content::BrowserContext* context) const {
+  return chrome::GetBrowserContextRedirectedInIncognito(context);
+}
+
+}  // namespace feature_engagement
diff --git a/chrome/browser/feature_engagement/session_duration_updater_factory.h b/chrome/browser/feature_engagement/session_duration_updater_factory.h
new file mode 100644
index 0000000..55f1f2be
--- /dev/null
+++ b/chrome/browser/feature_engagement/session_duration_updater_factory.h
@@ -0,0 +1,53 @@
+// 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_FEATURE_ENGAGEMENT_SESSION_DURATION_UPDATER_FACTORY_H_
+#define CHROME_BROWSER_FEATURE_ENGAGEMENT_SESSION_DURATION_UPDATER_FACTORY_H_
+
+#include "base/macros.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+
+class Profile;
+
+namespace base {
+template <typename T>
+struct DefaultSingletonTraits;
+}  // namespace base
+
+namespace content {
+class BrowserContext;
+}  // namespace content
+
+namespace feature_engagement {
+
+class SessionDurationUpdater;
+
+// SessionDurationUpdaterFactory is the main client class for interaction with
+// the SessionDurationUpdater component.
+class SessionDurationUpdaterFactory : public BrowserContextKeyedServiceFactory {
+ public:
+  // Returns singleton instance of SessionDurationUpdaterFactory.
+  static SessionDurationUpdaterFactory* GetInstance();
+
+  // Returns the SessionDurationUpdater associated with the profile.
+  SessionDurationUpdater* GetForProfile(Profile* profile);
+
+ private:
+  friend struct base::DefaultSingletonTraits<SessionDurationUpdaterFactory>;
+
+  SessionDurationUpdaterFactory();
+  ~SessionDurationUpdaterFactory() override;
+
+  // BrowserContextKeyedServiceFactory overrides:
+  KeyedService* BuildServiceInstanceFor(
+      content::BrowserContext* context) const override;
+  content::BrowserContext* GetBrowserContextToUse(
+      content::BrowserContext* context) const override;
+
+  DISALLOW_COPY_AND_ASSIGN(SessionDurationUpdaterFactory);
+};
+
+}  // namespace feature_engagement
+
+#endif  // CHROME_BROWSER_FEATURE_ENGAGEMENT_SESSION_DURATION_UPDATER_FACTORY_H_
diff --git a/chrome/browser/feature_engagement/session_duration_updater_unittest.cc b/chrome/browser/feature_engagement/session_duration_updater_unittest.cc
new file mode 100644
index 0000000..b0740cb5
--- /dev/null
+++ b/chrome/browser/feature_engagement/session_duration_updater_unittest.cc
@@ -0,0 +1,146 @@
+// 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/feature_engagement/session_duration_updater.h"
+
+#include "base/feature_list.h"
+#include "base/metrics/field_trial.h"
+#include "base/metrics/field_trial_param_associator.h"
+#include "base/metrics/field_trial_params.h"
+#include "base/run_loop.h"
+#include "base/sequenced_task_runner.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/feature_engagement/feature_tracker.h"
+#include "chrome/browser/feature_engagement/session_duration_updater.h"
+#include "chrome/browser/feature_engagement/session_duration_updater_factory.h"
+#include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "components/feature_engagement/public/event_constants.h"
+#include "components/feature_engagement/public/feature_constants.h"
+#include "components/feature_engagement/test/test_tracker.h"
+#include "components/pref_registry/pref_registry_syncable.h"
+#include "components/prefs/pref_service.h"
+#include "components/sync_preferences/testing_pref_service_syncable.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace feature_engagement {
+
+namespace {
+
+class TestObserver : public SessionDurationUpdater::Observer {
+ public:
+  TestObserver()
+      : pref_service_(
+            base::MakeUnique<sync_preferences::TestingPrefServiceSyncable>()),
+        session_duration_updater_(
+            new SessionDurationUpdater(pref_service_.get())),
+        session_duration_observer_(this) {
+    SessionDurationUpdater::RegisterProfilePrefs(pref_service_->registry());
+  }
+
+  void AddSessionDurationObserver() {
+    session_duration_observer_.Add(session_duration_updater_.get());
+  }
+
+  void RemoveSessionDurationObserver() {
+    session_duration_observer_.Remove(session_duration_updater_.get());
+  }
+
+  // SessionDurationUpdater::Observer:
+  void OnSessionEnded(base::TimeDelta total_session_time) override {}
+
+  PrefService* GetPrefs() { return pref_service_.get(); }
+
+  SessionDurationUpdater* GetSessionDurationUpdater() {
+    return session_duration_updater_.get();
+  }
+
+ private:
+  const std::unique_ptr<sync_preferences::TestingPrefServiceSyncable>
+      pref_service_;
+  std::unique_ptr<SessionDurationUpdater> session_duration_updater_;
+  ScopedObserver<SessionDurationUpdater, SessionDurationUpdater::Observer>
+      session_duration_observer_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestObserver);
+};
+
+class SessionDurationUpdaterTest : public testing::Test {
+ public:
+  SessionDurationUpdaterTest() = default;
+  ~SessionDurationUpdaterTest() override = default;
+
+  // testing::Test:
+  void SetUp() override {
+    // Start the DesktopSessionDurationTracker to track active session time.
+    metrics::DesktopSessionDurationTracker::Initialize();
+
+    test_observer_ = base::MakeUnique<TestObserver>();
+    test_observer_->AddSessionDurationObserver();
+  }
+
+  void TearDown() override {
+    test_observer_->RemoveSessionDurationObserver();
+    metrics::DesktopSessionDurationTracker::CleanupForTesting();
+  }
+
+ protected:
+  std::unique_ptr<TestObserver> test_observer_;
+
+ private:
+  content::TestBrowserThreadBundle thread_bundle_;
+
+  DISALLOW_COPY_AND_ASSIGN(SessionDurationUpdaterTest);
+};
+
+}  // namespace
+
+// kObservedSessionTime should be 0 on initalization and 50 after simulation.
+TEST_F(SessionDurationUpdaterTest, TestTimeAdded) {
+  // Tests the pref is registered to 0 before any session time passes.
+  EXPECT_EQ(
+      0, test_observer_->GetPrefs()->GetInteger(prefs::kObservedSessionTime));
+
+  // Tests 50 minutes passing with an observer added.
+  test_observer_->GetSessionDurationUpdater()->OnSessionEnded(
+      base::TimeDelta::FromMinutes(50));
+
+  EXPECT_EQ(
+      50, test_observer_->GetPrefs()->GetInteger(prefs::kObservedSessionTime));
+}
+
+// kObservedSessionTime should not be updated when SessionDurationUpdater has
+// no observers, but should start updating again if another observer is added.
+TEST_F(SessionDurationUpdaterTest, TestAddingAndRemovingObservers) {
+  // Tests 50 minutes passing with an observer added.
+  test_observer_->GetSessionDurationUpdater()->OnSessionEnded(
+      base::TimeDelta::FromMinutes(50));
+
+  EXPECT_EQ(
+      50, test_observer_->GetPrefs()->GetInteger(prefs::kObservedSessionTime));
+
+  // Tests 50 minutes passing without any observers. No time should be added to
+  // the pref in this case.
+  test_observer_->RemoveSessionDurationObserver();
+
+  test_observer_->GetSessionDurationUpdater()->OnSessionEnded(
+      base::TimeDelta::FromMinutes(50));
+
+  EXPECT_EQ(
+      50, test_observer_->GetPrefs()->GetInteger(prefs::kObservedSessionTime));
+
+  // Tests 50 minutes passing with an observer re-added. Time should be added
+  // again now.
+  test_observer_->AddSessionDurationObserver();
+
+  test_observer_->GetSessionDurationUpdater()->OnSessionEnded(
+      base::TimeDelta::FromMinutes(50));
+
+  EXPECT_EQ(
+      100, test_observer_->GetPrefs()->GetInteger(prefs::kObservedSessionTime));
+}
+
+}  // namespace feature_engagement
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc
index f350c63..fd02e1c 100644
--- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc
+++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc
@@ -7,6 +7,7 @@
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_number_conversions.h"
+#include "chrome/browser/media/router/discovery/discovery_network_monitor.h"
 #include "chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.h"
 #include "chrome/browser/media/router/discovery/mdns/dns_sd_delegate.h"
 #include "chrome/browser/media/router/discovery/mdns/dns_sd_registry.h"
@@ -114,7 +115,8 @@
     cast_media_sink_service_impl_.reset(new CastMediaSinkServiceImpl(
         base::BindRepeating(&CastMediaSinkService::OnSinksDiscoveredOnIOThread,
                             this),
-        cast_channel::CastSocketService::GetInstance()));
+        cast_channel::CastSocketService::GetInstance(),
+        DiscoveryNetworkMonitor::GetInstance()));
   }
 
   content::BrowserThread::PostTask(
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.cc
index 26cf335..a5bdc99 100644
--- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.cc
+++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.cc
@@ -36,21 +36,35 @@
 
 namespace media_router {
 
+namespace {
+
+bool IsNetworkIdUnknownOrDisconnected(const std::string& network_id) {
+  return network_id == DiscoveryNetworkMonitor::kNetworkIdUnknown ||
+         network_id == DiscoveryNetworkMonitor::kNetworkIdDisconnected;
+}
+
+}  // namespace
+
 // static
 const int CastMediaSinkServiceImpl::kCastControlPort = 8009;
 
 CastMediaSinkServiceImpl::CastMediaSinkServiceImpl(
     const OnSinksDiscoveredCallback& callback,
-    cast_channel::CastSocketService* cast_socket_service)
+    cast_channel::CastSocketService* cast_socket_service,
+    DiscoveryNetworkMonitor* network_monitor)
     : MediaSinkServiceBase(callback),
-      cast_socket_service_(cast_socket_service) {
+      cast_socket_service_(cast_socket_service),
+      network_monitor_(network_monitor) {
   DETACH_FROM_SEQUENCE(sequence_checker_);
   DCHECK(cast_socket_service_);
+  DCHECK(network_monitor_);
+  network_monitor_->AddObserver(this);
 }
 
 CastMediaSinkServiceImpl::~CastMediaSinkServiceImpl() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   cast_channel::CastSocketService::GetInstance()->RemoveObserver(this);
+  network_monitor_->RemoveObserver(this);
 }
 
 // MediaSinkService implementation
@@ -114,9 +128,9 @@
   DVLOG(1) << "OnError [ip_endpoint]: " << socket.ip_endpoint().ToString()
            << " [error_state]: "
            << cast_channel::ChannelErrorToString(error_state);
-  net::IPEndPoint ip_endpoint = socket.ip_endpoint();
-  current_sinks_by_dial_.erase(ip_endpoint);
-  current_sinks_by_mdns_.erase(ip_endpoint);
+  auto& ip_address = socket.ip_endpoint().address();
+  current_sinks_by_dial_.erase(ip_address);
+  current_sinks_by_mdns_.erase(ip_address);
   MediaSinkServiceBase::RestartTimer();
 }
 
@@ -137,6 +151,36 @@
       this);
 }
 
+void CastMediaSinkServiceImpl::OnNetworksChanged(
+    const std::string& network_id) {
+  std::string last_network_id = current_network_id_;
+  current_network_id_ = network_id;
+  if (IsNetworkIdUnknownOrDisconnected(network_id)) {
+    if (!IsNetworkIdUnknownOrDisconnected(last_network_id)) {
+      // Collect current sinks even if OnFetchCompleted hasn't collected the
+      // latest sinks.
+      std::vector<MediaSinkInternal> current_sinks;
+      for (const auto& sink_it : current_sinks_by_mdns_) {
+        current_sinks.push_back(sink_it.second);
+      }
+      for (const auto& sink_it : current_sinks_by_dial_) {
+        if (!base::ContainsKey(current_sinks_by_mdns_, sink_it.first))
+          current_sinks.push_back(sink_it.second);
+      }
+      sink_cache_[last_network_id] = std::move(current_sinks);
+    }
+    return;
+  }
+  auto cache_entry = sink_cache_.find(network_id);
+  // Check if we have any cached sinks for this network ID.
+  if (cache_entry == sink_cache_.end())
+    return;
+
+  DVLOG(2) << "Cache restored " << cache_entry->second.size()
+           << " sink(s) for network " << network_id;
+  OpenChannels(cache_entry->second);
+}
+
 void CastMediaSinkServiceImpl::OnChannelOpened(
     MediaSinkInternal cast_sink,
     cast_channel::CastSocket* socket) {
@@ -158,21 +202,19 @@
   DVLOG(2) << "Ading sink to current_sinks_ [name]: "
            << updated_sink.sink().name();
 
-  net::IPEndPoint ip_endpoint(cast_sink.cast_data().ip_address,
-                              cast_sink.cast_data().port);
+  auto& ip_address = cast_sink.cast_data().ip_address;
   // Add or update existing cast sink.
   if (updated_sink.cast_data().discovered_by_dial) {
-    current_sinks_by_dial_[ip_endpoint] = updated_sink;
+    current_sinks_by_dial_[ip_address] = updated_sink;
   } else {
-    current_sinks_by_mdns_[ip_endpoint] = updated_sink;
+    current_sinks_by_mdns_[ip_address] = updated_sink;
   }
   MediaSinkServiceBase::RestartTimer();
 }
 
 void CastMediaSinkServiceImpl::OnDialSinkAdded(const MediaSinkInternal& sink) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  auto ip_address = sink.dial_data().ip_address;
-  net::IPEndPoint ip_endpoint(ip_address, kCastControlPort);
+  net::IPEndPoint ip_endpoint(sink.dial_data().ip_address, kCastControlPort);
 
   if (base::ContainsKey(current_service_ip_endpoints_, ip_endpoint)) {
     DVLOG(2) << "Sink discovered by mDNS, skip adding [name]: "
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.h b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.h
index f82ffa94..4498b8b 100644
--- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.h
+++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.h
@@ -11,6 +11,7 @@
 #include "base/gtest_prod_util.h"
 #include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
+#include "chrome/browser/media/router/discovery/discovery_network_monitor.h"
 #include "chrome/browser/media/router/discovery/media_sink_discovery_metrics.h"
 #include "chrome/browser/media/router/discovery/media_sink_service_base.h"
 #include "components/cast_channel/cast_channel_enum.h"
@@ -27,14 +28,15 @@
 class CastMediaSinkServiceImpl
     : public MediaSinkServiceBase,
       public cast_channel::CastSocket::Observer,
-      public base::SupportsWeakPtr<CastMediaSinkServiceImpl> {
+      public base::SupportsWeakPtr<CastMediaSinkServiceImpl>,
+      public DiscoveryNetworkMonitor::Observer {
  public:
   // Default Cast control port to open Cast Socket from DIAL sink.
   static const int kCastControlPort;
 
-  CastMediaSinkServiceImpl(
-      const OnSinksDiscoveredCallback& callback,
-      cast_channel::CastSocketService* cast_socket_service);
+  CastMediaSinkServiceImpl(const OnSinksDiscoveredCallback& callback,
+                           cast_channel::CastSocketService* cast_socket_service,
+                           DiscoveryNetworkMonitor* network_monitor);
   ~CastMediaSinkServiceImpl() override;
 
   // MediaSinkService implementation
@@ -69,6 +71,9 @@
   void OnMessage(const cast_channel::CastSocket& socket,
                  const cast_channel::CastMessage& message) override;
 
+  // DiscoveryNetworkMonitor::Observer implementation
+  void OnNetworksChanged(const std::string& network_id) override;
+
   // Opens cast channel.
   // |ip_endpoint|: cast channel's target IP endpoint.
   // |cast_sink|: Cast sink created from mDNS service description or DIAL sink.
@@ -85,7 +90,7 @@
   // Set of mDNS service IP endpoints from current round of discovery.
   std::set<net::IPEndPoint> current_service_ip_endpoints_;
 
-  using MediaSinkInternalMap = std::map<net::IPEndPoint, MediaSinkInternal>;
+  using MediaSinkInternalMap = std::map<net::IPAddress, MediaSinkInternal>;
 
   // Map of sinks from current round of mDNS discovery keyed by IP address.
   MediaSinkInternalMap current_sinks_by_mdns_;
@@ -97,6 +102,15 @@
   // removing Cast channels.
   cast_channel::CastSocketService* const cast_socket_service_;
 
+  // Raw pointer to DiscoveryNetworkMonitor, which is a global leaky singleton
+  // and manages network change notifications.
+  DiscoveryNetworkMonitor* network_monitor_;
+
+  std::string current_network_id_ = DiscoveryNetworkMonitor::kNetworkIdUnknown;
+
+  // Cache of known sinks by network ID.
+  std::map<std::string, std::vector<MediaSinkInternal>> sink_cache_;
+
   CastDeviceCountMetrics metrics_;
 
   SEQUENCE_CHECKER(sequence_checker_);
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc
index bb28759..7d5c8ae6 100644
--- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc
+++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc
@@ -12,14 +12,15 @@
 #include "components/cast_channel/cast_socket_service.h"
 #include "components/cast_channel/cast_test_util.h"
 #include "content/public/test/test_browser_thread_bundle.h"
+#include "content/public/test/test_utils.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-using ::testing::_;
 using ::testing::Invoke;
 using ::testing::Return;
 using ::testing::SaveArg;
 using ::testing::WithArgs;
+using ::testing::_;
 using cast_channel::ChannelError;
 
 namespace {
@@ -71,9 +72,11 @@
       : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
         mock_cast_socket_service_(new cast_channel::MockCastSocketService()),
         media_sink_service_impl_(mock_sink_discovered_cb_.Get(),
-                                 mock_cast_socket_service_.get()) {}
+                                 mock_cast_socket_service_.get(),
+                                 discovery_network_monitor_.get()) {}
 
   void SetUp() override {
+    fake_network_info_.clear();
     auto mock_timer = base::MakeUnique<base::MockTimer>(
         true /*retain_user_task*/, false /*is_repeating*/);
     mock_timer_ = mock_timer.get();
@@ -81,7 +84,43 @@
   }
 
  protected:
+  void ExpectOpenSocketInternal(cast_channel::CastSocket* socket) {
+    EXPECT_CALL(*mock_cast_socket_service_,
+                OpenSocketInternal(socket->ip_endpoint(), _, _, _))
+        .WillOnce(Invoke([socket](const auto& ip_endpoint, auto* net_log,
+                                  auto open_cb, auto* observer) {
+          std::move(open_cb).Run(socket);
+          return socket->id();
+        }));
+  }
+
+  cast_channel::CastSocket::Observer& observer() {
+    return static_cast<cast_channel::CastSocket::Observer&>(
+        media_sink_service_impl_);
+  }
+
+  static std::vector<DiscoveryNetworkInfo> FakeGetNetworkInfo() {
+    return fake_network_info_;
+  }
+
+  static std::vector<DiscoveryNetworkInfo> fake_network_info_;
+
+  std::vector<DiscoveryNetworkInfo> fake_ethernet_info_ = {
+      DiscoveryNetworkInfo{std::string("enp0s2"), std::string("ethernet1")}};
+  std::vector<DiscoveryNetworkInfo> fake_wifi_info_ = {
+      DiscoveryNetworkInfo{std::string("wlp3s0"), std::string("wifi1")},
+      DiscoveryNetworkInfo{std::string("wlp3s1"), std::string("wifi2")}};
+  std::vector<DiscoveryNetworkInfo> fake_unknown_info_ = {
+      DiscoveryNetworkInfo{std::string("enp0s2"), std::string()}};
+
+  std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_ =
+      base::WrapUnique(net::NetworkChangeNotifier::CreateMock());
+
   const content::TestBrowserThreadBundle thread_bundle_;
+
+  std::unique_ptr<DiscoveryNetworkMonitor> discovery_network_monitor_ =
+      DiscoveryNetworkMonitor::CreateInstanceForTest(&FakeGetNetworkInfo);
+
   base::MockCallback<MediaSinkService::OnSinksDiscoveredCallback>
       mock_sink_discovered_cb_;
   std::unique_ptr<cast_channel::MockCastSocketService>
@@ -92,6 +131,10 @@
   DISALLOW_COPY_AND_ASSIGN(CastMediaSinkServiceImplTest);
 };
 
+// static
+std::vector<DiscoveryNetworkInfo>
+    CastMediaSinkServiceImplTest::fake_network_info_;
+
 TEST_F(CastMediaSinkServiceImplTest, TestOnChannelOpened) {
   auto cast_sink = CreateCastSink(1);
   net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1);
@@ -281,15 +324,15 @@
   net::IPEndPoint ip_endpoint3 = CreateIPEndPoint(3);
 
   // Cast sink 1, 2 from mDNS discovery
-  media_sink_service_impl_.current_sinks_by_mdns_[ip_endpoint1] = cast_sink1;
-  media_sink_service_impl_.current_sinks_by_mdns_[ip_endpoint2] = cast_sink2;
+  media_sink_service_impl_.current_sinks_by_mdns_[ip_endpoint1.address()] =
+      cast_sink1;
+  media_sink_service_impl_.current_sinks_by_mdns_[ip_endpoint2.address()] =
+      cast_sink2;
   // Cast sink 2, 3 from dial discovery
-  auto extra_data = cast_sink2.cast_data();
-  extra_data.discovered_by_dial = true;
-  extra_data.model_name += " dial";
-
-  media_sink_service_impl_.current_sinks_by_dial_[ip_endpoint2] = cast_sink2;
-  media_sink_service_impl_.current_sinks_by_dial_[ip_endpoint3] = cast_sink3;
+  media_sink_service_impl_.current_sinks_by_dial_[ip_endpoint2.address()] =
+      cast_sink2;
+  media_sink_service_impl_.current_sinks_by_dial_[ip_endpoint3.address()] =
+      cast_sink3;
 
   // Callback returns Cast sink 1, 2, 3
   media_sink_service_impl_.OnFetchCompleted();
@@ -300,4 +343,474 @@
   EXPECT_TRUE(base::ContainsValue(sinks, cast_sink3));
 }
 
+TEST_F(CastMediaSinkServiceImplTest, CacheSinksForKnownNetwork) {
+  fake_network_info_ = fake_ethernet_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  MediaSinkInternal sink1 = CreateCastSink(1);
+  MediaSinkInternal sink2 = CreateCastSink(2);
+  net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1);
+  net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2);
+  std::vector<MediaSinkInternal> sink_list1{sink1, sink2};
+
+  // Resolution will succeed for both sinks.
+  cast_channel::MockCastSocket socket1;
+  cast_channel::MockCastSocket socket2;
+  socket1.SetIPEndpoint(ip_endpoint1);
+  socket1.set_id(1);
+  socket2.SetIPEndpoint(ip_endpoint2);
+  socket2.set_id(2);
+  ExpectOpenSocketInternal(&socket1);
+  ExpectOpenSocketInternal(&socket2);
+  media_sink_service_impl_.OpenChannels(sink_list1);
+
+  // Connect to a new network with different sinks.
+  fake_network_info_.clear();
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_NONE);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  fake_network_info_ = fake_wifi_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_WIFI);
+  content::RunAllBlockingPoolTasksUntilIdle();
+  observer().OnError(socket1, cast_channel::ChannelError::CAST_SOCKET_ERROR);
+  observer().OnError(socket2, cast_channel::ChannelError::CAST_SOCKET_ERROR);
+
+  MediaSinkInternal sink3 = CreateCastSink(3);
+  net::IPEndPoint ip_endpoint3 = CreateIPEndPoint(3);
+  std::vector<MediaSinkInternal> sink_list2{sink3};
+
+  cast_channel::MockCastSocket socket3;
+  socket3.SetIPEndpoint(ip_endpoint3);
+  socket3.set_id(3);
+  ExpectOpenSocketInternal(&socket3);
+  media_sink_service_impl_.OpenChannels(sink_list2);
+
+  // Reconnecting to the previous ethernet network should restore the same sinks
+  // from the cache and attempt to resolve them.
+  fake_network_info_.clear();
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_NONE);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  EXPECT_CALL(*mock_cast_socket_service_,
+              OpenSocketInternal(ip_endpoint1, _, _, _));
+  EXPECT_CALL(*mock_cast_socket_service_,
+              OpenSocketInternal(ip_endpoint2, _, _, _));
+  fake_network_info_ = fake_ethernet_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  content::RunAllBlockingPoolTasksUntilIdle();
+}
+
+TEST_F(CastMediaSinkServiceImplTest, CacheContainsOnlyResolvedSinks) {
+  fake_network_info_ = fake_ethernet_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  MediaSinkInternal sink1 = CreateCastSink(1);
+  MediaSinkInternal sink2 = CreateCastSink(2);
+  net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1);
+  net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2);
+  std::vector<MediaSinkInternal> sink_list1{sink1, sink2};
+
+  // Resolution will fail for |sink2|.
+  cast_channel::MockCastSocket socket1;
+  cast_channel::MockCastSocket socket2;
+  socket1.SetIPEndpoint(ip_endpoint1);
+  socket1.set_id(1);
+  socket2.SetErrorState(cast_channel::ChannelError::CONNECT_ERROR);
+  socket2.SetIPEndpoint(ip_endpoint2);
+  socket2.set_id(2);
+  ExpectOpenSocketInternal(&socket1);
+  ExpectOpenSocketInternal(&socket2);
+  media_sink_service_impl_.OpenChannels(sink_list1);
+
+  // Connect to a new network with different sinks.
+  fake_network_info_.clear();
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_NONE);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  fake_network_info_ = fake_wifi_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_WIFI);
+  content::RunAllBlockingPoolTasksUntilIdle();
+  observer().OnError(socket1, cast_channel::ChannelError::CAST_SOCKET_ERROR);
+
+  MediaSinkInternal sink3 = CreateCastSink(3);
+  net::IPEndPoint ip_endpoint3 = CreateIPEndPoint(3);
+  std::vector<MediaSinkInternal> sink_list2{sink3};
+
+  cast_channel::MockCastSocket socket3;
+  socket3.SetIPEndpoint(ip_endpoint3);
+  socket3.set_id(3);
+  ExpectOpenSocketInternal(&socket3);
+  media_sink_service_impl_.OpenChannels(sink_list2);
+
+  // Reconnecting to the previous ethernet network should restore only |sink1|,
+  // since |sink2| failed to resolve.
+  fake_network_info_.clear();
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_NONE);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  EXPECT_CALL(*mock_cast_socket_service_,
+              OpenSocketInternal(ip_endpoint1, _, _, _));
+  EXPECT_CALL(*mock_cast_socket_service_,
+              OpenSocketInternal(ip_endpoint2, _, _, _))
+      .Times(0);
+  fake_network_info_ = fake_ethernet_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  content::RunAllBlockingPoolTasksUntilIdle();
+}
+
+TEST_F(CastMediaSinkServiceImplTest, CacheUpdatedOnChannelError) {
+  fake_network_info_ = fake_ethernet_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  MediaSinkInternal sink1 = CreateCastSink(1);
+  net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1);
+  std::vector<MediaSinkInternal> sink_list1{sink1};
+
+  // Resolve |sink1| but then raise a channel error.  This should remove it from
+  // the cached sinks for the ethernet network.
+  cast_channel::MockCastSocket socket1;
+  socket1.SetIPEndpoint(ip_endpoint1);
+  socket1.set_id(1);
+  ExpectOpenSocketInternal(&socket1);
+  media_sink_service_impl_.OpenChannels(sink_list1);
+  observer().OnError(socket1, cast_channel::ChannelError::CAST_SOCKET_ERROR);
+
+  // Connect to a new network with different sinks.
+  fake_network_info_.clear();
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_NONE);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  fake_network_info_ = fake_wifi_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_WIFI);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  MediaSinkInternal sink2 = CreateCastSink(2);
+  net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2);
+  std::vector<MediaSinkInternal> sink_list2{sink2};
+
+  cast_channel::MockCastSocket socket2;
+  socket2.SetIPEndpoint(ip_endpoint2);
+  socket2.set_id(2);
+  ExpectOpenSocketInternal(&socket2);
+  media_sink_service_impl_.OpenChannels(sink_list2);
+
+  // Reconnecting to the previous ethernet network should not restore any sinks
+  // since the only sink to resolve successfully, |sink1|, later had a channel
+  // error.
+  fake_network_info_.clear();
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_NONE);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  EXPECT_CALL(*mock_cast_socket_service_, OpenSocketInternal(_, _, _, _))
+      .Times(0);
+  fake_network_info_ = fake_ethernet_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  content::RunAllBlockingPoolTasksUntilIdle();
+}
+
+TEST_F(CastMediaSinkServiceImplTest, UnknownNetworkNoCache) {
+  // Without any network notification here, network ID will remain __unknown__
+  // and the cache shouldn't save any of these sinks.
+  MediaSinkInternal sink1 = CreateCastSink(1);
+  MediaSinkInternal sink2 = CreateCastSink(2);
+  net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1);
+  net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2);
+  std::vector<MediaSinkInternal> sink_list1{sink1, sink2};
+
+  // Resolution will succeed for both sinks.
+  cast_channel::MockCastSocket socket1;
+  cast_channel::MockCastSocket socket2;
+  socket1.SetIPEndpoint(ip_endpoint1);
+  socket1.set_id(1);
+  socket2.SetIPEndpoint(ip_endpoint2);
+  socket2.set_id(2);
+  ExpectOpenSocketInternal(&socket1);
+  ExpectOpenSocketInternal(&socket2);
+  media_sink_service_impl_.OpenChannels(sink_list1);
+
+  // Network is reported as disconnected but discover a new device.
+  fake_network_info_.clear();
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_NONE);
+  content::RunAllBlockingPoolTasksUntilIdle();
+  observer().OnError(socket1, cast_channel::ChannelError::CAST_SOCKET_ERROR);
+  observer().OnError(socket2, cast_channel::ChannelError::CAST_SOCKET_ERROR);
+
+  MediaSinkInternal sink3 = CreateCastSink(3);
+  net::IPEndPoint ip_endpoint3 = CreateIPEndPoint(3);
+  std::vector<MediaSinkInternal> sink_list2{sink3};
+
+  cast_channel::MockCastSocket socket3;
+  socket3.SetIPEndpoint(ip_endpoint3);
+  socket3.set_id(3);
+  ExpectOpenSocketInternal(&socket3);
+  media_sink_service_impl_.OpenChannels(sink_list2);
+
+  // Connecting to a network whose ID resolves to __unknown__ shouldn't pull any
+  // cache items from another unknown network.
+  EXPECT_CALL(*mock_cast_socket_service_, OpenSocketInternal(_, _, _, _))
+      .Times(0);
+  fake_network_info_ = fake_unknown_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_WIFI);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  // Similarly, disconnecting from the network shouldn't pull any cache items.
+  fake_network_info_.clear();
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_NONE);
+  content::RunAllBlockingPoolTasksUntilIdle();
+}
+
+TEST_F(CastMediaSinkServiceImplTest, CacheUpdatedForKnownNetwork) {
+  fake_network_info_ = fake_ethernet_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  MediaSinkInternal sink1 = CreateCastSink(1);
+  MediaSinkInternal sink2 = CreateCastSink(2);
+  net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1);
+  net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2);
+  std::vector<MediaSinkInternal> sink_list1{sink1, sink2};
+
+  // Resolution will succeed for both sinks.
+  cast_channel::MockCastSocket socket1;
+  cast_channel::MockCastSocket socket2;
+  socket1.SetIPEndpoint(ip_endpoint1);
+  socket1.set_id(1);
+  socket2.SetIPEndpoint(ip_endpoint2);
+  socket2.set_id(2);
+  ExpectOpenSocketInternal(&socket1);
+  ExpectOpenSocketInternal(&socket2);
+  media_sink_service_impl_.OpenChannels(sink_list1);
+
+  // Connect to a new network with different sinks.
+  fake_network_info_.clear();
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_NONE);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  fake_network_info_ = fake_wifi_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_WIFI);
+  content::RunAllBlockingPoolTasksUntilIdle();
+  observer().OnError(socket1, cast_channel::ChannelError::CAST_SOCKET_ERROR);
+  observer().OnError(socket2, cast_channel::ChannelError::CAST_SOCKET_ERROR);
+
+  MediaSinkInternal sink3 = CreateCastSink(3);
+  net::IPEndPoint ip_endpoint3 = CreateIPEndPoint(3);
+  std::vector<MediaSinkInternal> sink_list2{sink3};
+
+  cast_channel::MockCastSocket socket3;
+  socket3.SetIPEndpoint(ip_endpoint3);
+  socket3.set_id(3);
+  ExpectOpenSocketInternal(&socket3);
+  media_sink_service_impl_.OpenChannels(sink_list2);
+
+  // Reconnecting to the previous ethernet network should restore the same sinks
+  // from the cache and attempt to resolve them.  |sink3| is also lost.
+  fake_network_info_.clear();
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_NONE);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  observer().OnError(socket3, cast_channel::ChannelError::CAST_SOCKET_ERROR);
+
+  // Resolution will fail for cached sinks.
+  socket1.SetErrorState(cast_channel::ChannelError::CONNECT_ERROR);
+  socket2.SetErrorState(cast_channel::ChannelError::CONNECT_ERROR);
+  ExpectOpenSocketInternal(&socket1);
+  ExpectOpenSocketInternal(&socket2);
+  fake_network_info_ = fake_ethernet_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  // A new sink is found on the ethernet network.
+  MediaSinkInternal sink4 = CreateCastSink(4);
+  net::IPEndPoint ip_endpoint4 = CreateIPEndPoint(4);
+  std::vector<MediaSinkInternal> sink_list3{sink4};
+
+  cast_channel::MockCastSocket socket4;
+  socket4.SetIPEndpoint(ip_endpoint4);
+  socket4.set_id(4);
+  ExpectOpenSocketInternal(&socket4);
+  media_sink_service_impl_.OpenChannels(sink_list3);
+
+  // Disconnect from the network and lose sinks.
+  fake_network_info_.clear();
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_NONE);
+  content::RunAllBlockingPoolTasksUntilIdle();
+  observer().OnError(socket4, cast_channel::ChannelError::CAST_SOCKET_ERROR);
+
+  // Reconnect and expect only |sink4| to be cached.
+  EXPECT_CALL(*mock_cast_socket_service_,
+              OpenSocketInternal(ip_endpoint4, _, _, _));
+  fake_network_info_ = fake_ethernet_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  content::RunAllBlockingPoolTasksUntilIdle();
+}
+
+TEST_F(CastMediaSinkServiceImplTest, CacheDialDiscoveredSinks) {
+  fake_network_info_ = fake_ethernet_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  MediaSinkInternal sink1_cast = CreateCastSink(1);
+  MediaSinkInternal sink2_dial = CreateDialSink(2);
+  net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1);
+  net::IPEndPoint ip_endpoint2(sink2_dial.dial_data().ip_address,
+                               CastMediaSinkServiceImpl::kCastControlPort);
+  std::vector<MediaSinkInternal> sink_list1{sink1_cast};
+
+  // Resolution will succeed for both sinks.
+  cast_channel::MockCastSocket socket1;
+  cast_channel::MockCastSocket socket2;
+  socket1.SetIPEndpoint(ip_endpoint1);
+  socket1.set_id(1);
+  socket2.SetIPEndpoint(ip_endpoint2);
+  socket2.set_id(2);
+  ExpectOpenSocketInternal(&socket1);
+  ExpectOpenSocketInternal(&socket2);
+  media_sink_service_impl_.OpenChannels(sink_list1);
+  media_sink_service_impl_.OnDialSinkAdded(sink2_dial);
+
+  // Connect to a new network with different sinks.
+  fake_network_info_.clear();
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_NONE);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  fake_network_info_ = fake_wifi_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_WIFI);
+  content::RunAllBlockingPoolTasksUntilIdle();
+  observer().OnError(socket1, cast_channel::ChannelError::CAST_SOCKET_ERROR);
+  observer().OnError(socket2, cast_channel::ChannelError::CAST_SOCKET_ERROR);
+
+  MediaSinkInternal sink3_cast = CreateCastSink(3);
+  MediaSinkInternal sink4_dial = CreateDialSink(4);
+  net::IPEndPoint ip_endpoint3 = CreateIPEndPoint(3);
+  net::IPEndPoint ip_endpoint4(sink4_dial.dial_data().ip_address,
+                               CastMediaSinkServiceImpl::kCastControlPort);
+  std::vector<MediaSinkInternal> sink_list2{sink3_cast};
+
+  cast_channel::MockCastSocket socket3;
+  cast_channel::MockCastSocket socket4;
+  socket3.SetIPEndpoint(ip_endpoint3);
+  socket3.set_id(3);
+  socket4.SetIPEndpoint(ip_endpoint4);
+  socket4.set_id(4);
+  ExpectOpenSocketInternal(&socket3);
+  ExpectOpenSocketInternal(&socket4);
+  media_sink_service_impl_.OpenChannels(sink_list2);
+  media_sink_service_impl_.OnDialSinkAdded(sink4_dial);
+
+  // Reconnecting to the previous ethernet network should restore the same sinks
+  // from the cache and attempt to resolve them.
+  fake_network_info_.clear();
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_NONE);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  EXPECT_CALL(*mock_cast_socket_service_,
+              OpenSocketInternal(ip_endpoint1, _, _, _));
+  EXPECT_CALL(*mock_cast_socket_service_,
+              OpenSocketInternal(ip_endpoint2, _, _, _));
+  fake_network_info_ = fake_ethernet_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  content::RunAllBlockingPoolTasksUntilIdle();
+}
+
+TEST_F(CastMediaSinkServiceImplTest, DualDiscoveryDoesntDuplicateCacheItems) {
+  fake_network_info_ = fake_ethernet_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  // The same sink will be discovered via dial and mdns.
+  MediaSinkInternal sink1_cast = CreateCastSink(1);
+  MediaSinkInternal sink1_dial = CreateDialSink(1);
+  net::IPEndPoint ip_endpoint1_cast = CreateIPEndPoint(1);
+  net::IPEndPoint ip_endpoint1_dial(sink1_dial.dial_data().ip_address,
+                                    CastMediaSinkServiceImpl::kCastControlPort);
+  std::vector<MediaSinkInternal> sink_list1{sink1_cast};
+
+  // Dial discovery will succeed first.
+  cast_channel::MockCastSocket socket1_dial;
+  socket1_dial.SetIPEndpoint(ip_endpoint1_dial);
+  socket1_dial.set_id(1);
+  ExpectOpenSocketInternal(&socket1_dial);
+  media_sink_service_impl_.OnDialSinkAdded(sink1_dial);
+
+  // The same sink is then discovered via mdns.
+  cast_channel::MockCastSocket socket1_cast;
+  socket1_cast.SetIPEndpoint(ip_endpoint1_cast);
+  socket1_cast.set_id(2);
+  ExpectOpenSocketInternal(&socket1_cast);
+  media_sink_service_impl_.OpenChannels(sink_list1);
+
+  // Connect to a new network with different sinks.
+  fake_network_info_.clear();
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_NONE);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  fake_network_info_ = fake_wifi_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_WIFI);
+  content::RunAllBlockingPoolTasksUntilIdle();
+  observer().OnError(socket1_cast,
+                     cast_channel::ChannelError::CAST_SOCKET_ERROR);
+  observer().OnError(socket1_dial,
+                     cast_channel::ChannelError::CAST_SOCKET_ERROR);
+
+  MediaSinkInternal sink2_cast = CreateCastSink(2);
+  net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2);
+  std::vector<MediaSinkInternal> sink_list2{sink2_cast};
+
+  cast_channel::MockCastSocket socket2;
+  socket2.SetIPEndpoint(ip_endpoint2);
+  socket2.set_id(3);
+  ExpectOpenSocketInternal(&socket2);
+  media_sink_service_impl_.OpenChannels(sink_list2);
+
+  // Reconnecting to the previous ethernet network should restore the same sinks
+  // from the cache and attempt to resolve them.
+  fake_network_info_.clear();
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_NONE);
+  content::RunAllBlockingPoolTasksUntilIdle();
+
+  EXPECT_CALL(*mock_cast_socket_service_,
+              OpenSocketInternal(ip_endpoint1_cast, _, _, _));
+  fake_network_info_ = fake_ethernet_info_;
+  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
+      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  content::RunAllBlockingPoolTasksUntilIdle();
+}
+
 }  // namespace media_router
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc
index 67b2336aa9..3726143a 100644
--- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc
+++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc
@@ -17,9 +17,9 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-using ::testing::_;
 using ::testing::Return;
 using ::testing::SaveArg;
+using ::testing::_;
 
 namespace {
 
@@ -54,8 +54,11 @@
  public:
   MockCastMediaSinkServiceImpl(
       const OnSinksDiscoveredCallback& callback,
-      cast_channel::CastSocketService* cast_socket_service)
-      : CastMediaSinkServiceImpl(callback, cast_socket_service) {}
+      cast_channel::CastSocketService* cast_socket_service,
+      DiscoveryNetworkMonitor* network_monitor)
+      : CastMediaSinkServiceImpl(callback,
+                                 cast_socket_service,
+                                 network_monitor) {}
   ~MockCastMediaSinkServiceImpl() override {}
 
   MOCK_METHOD0(Start, void());
@@ -69,7 +72,8 @@
       : mock_cast_socket_service_(new cast_channel::MockCastSocketService()),
         mock_media_sink_service_impl_(
             new MockCastMediaSinkServiceImpl(mock_sink_discovered_io_cb_.Get(),
-                                             mock_cast_socket_service_.get())),
+                                             mock_cast_socket_service_.get(),
+                                             discovery_network_monitor_)),
         media_sink_service_(new CastMediaSinkService(
             mock_sink_discovered_ui_cb_.Get(),
             std::unique_ptr<CastMediaSinkServiceImpl,
@@ -79,6 +83,12 @@
 
  protected:
   const content::TestBrowserThreadBundle thread_bundle_;
+
+  std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_ =
+      base::WrapUnique(net::NetworkChangeNotifier::CreateMock());
+  DiscoveryNetworkMonitor* const discovery_network_monitor_ =
+      DiscoveryNetworkMonitor::GetInstance();
+
   TestingProfile profile_;
 
   base::MockCallback<MediaSinkService::OnSinksDiscoveredCallback>
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc
index 997fd1b8..748615af 100644
--- a/chrome/browser/net/system_network_context_manager.cc
+++ b/chrome/browser/net/system_network_context_manager.cc
@@ -70,7 +70,6 @@
     content::mojom::NetworkContextParamsPtr* network_context_params,
     bool* is_quic_allowed) {
   SystemNetworkContextManager* manager = GetInstance();
-  DCHECK(!manager->io_thread_network_context_);
   *network_context_request =
       mojo::MakeRequest(&manager->io_thread_network_context_);
   *network_context_params = CreateNetworkContextParams();
diff --git a/chrome/browser/notifications/notification_platform_bridge_mac.mm b/chrome/browser/notifications/notification_platform_bridge_mac.mm
index 7aa66e0..29a979d 100644
--- a/chrome/browser/notifications/notification_platform_bridge_mac.mm
+++ b/chrome/browser/notifications/notification_platform_bridge_mac.mm
@@ -251,10 +251,10 @@
   std::vector<message_center::ButtonInfo> buttons = notification.buttons();
   if (!buttons.empty()) {
     DCHECK_LE(buttons.size(), blink::kWebNotificationMaxActions);
-    NSString* buttonOne = SysUTF16ToNSString(buttons[0].title);
+    NSString* buttonOne = base::SysUTF16ToNSString(buttons[0].title);
     NSString* buttonTwo = nullptr;
     if (buttons.size() > 1)
-      buttonTwo = SysUTF16ToNSString(buttons[1].title);
+      buttonTwo = base::SysUTF16ToNSString(buttons[1].title);
     [builder setButtons:buttonOne secondaryButton:buttonTwo];
   }
 
diff --git a/chrome/browser/notifications/platform_notification_service_interactive_uitest.cc b/chrome/browser/notifications/platform_notification_service_interactive_uitest.cc
index 267e505..a232dc6 100644
--- a/chrome/browser/notifications/platform_notification_service_interactive_uitest.cc
+++ b/chrome/browser/notifications/platform_notification_service_interactive_uitest.cc
@@ -15,14 +15,17 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/time/time.h"
+#include "build/build_config.h"
 #include "chrome/browser/engagement/site_engagement_score.h"
 #include "chrome/browser/engagement/site_engagement_service.h"
 #include "chrome/browser/notifications/desktop_notification_profile_util.h"
-#include "chrome/browser/notifications/message_center_display_service.h"
 #include "chrome/browser/notifications/notification.h"
 #include "chrome/browser/notifications/notification_common.h"
+#include "chrome/browser/notifications/notification_display_service.h"
+#include "chrome/browser/notifications/notification_display_service_factory.h"
 #include "chrome/browser/notifications/notification_test_util.h"
 #include "chrome/browser/notifications/platform_notification_service_impl.h"
+#include "chrome/browser/notifications/stub_notification_display_service.h"
 #include "chrome/browser/notifications/web_notification_delegate.h"
 #include "chrome/browser/permissions/permission_manager.h"
 #include "chrome/browser/permissions/permission_request_manager.h"
@@ -49,31 +52,49 @@
 #include "chrome/browser/lifetime/keep_alive_types.h"
 #endif
 
-#if defined(OS_MACOSX)
-#include "base/mac/mac_util.h"
-#include "ui/base/test/scoped_fake_nswindow_fullscreen.h"
-#endif
-
-// -----------------------------------------------------------------------------
+namespace {
 
 // Dimensions of the icon.png resource in the notification test data directory.
-const int kIconWidth = 100;
-const int kIconHeight = 100;
+constexpr int kIconWidth = 100;
+constexpr int kIconHeight = 100;
 
-const int kNotificationVibrationPattern[] = { 100, 200, 300 };
-const double kNotificationTimestamp = 621046800000.;
+constexpr int kNotificationVibrationPattern[] = {100, 200, 300};
+constexpr double kNotificationTimestamp = 621046800000.;
+
+const char kTestFileName[] = "notifications/platform_notification_service.html";
+
+}  // namespace
 
 class PlatformNotificationServiceBrowserTest : public InProcessBrowserTest {
  public:
   PlatformNotificationServiceBrowserTest();
-  ~PlatformNotificationServiceBrowserTest() override {}
+  ~PlatformNotificationServiceBrowserTest() override = default;
 
   // InProcessBrowserTest overrides.
-  void SetUpDefaultCommandLine(base::CommandLine* command_line) override;
+  void SetUpDefaultCommandLine(base::CommandLine* command_line) override {
+    InProcessBrowserTest::SetUpDefaultCommandLine(command_line);
 
-  void SetUp() override;
-  void SetUpOnMainThread() override;
-  void TearDown() override;
+    // Needed for the inline reply tests.
+    command_line->AppendSwitch(
+        switches::kEnableExperimentalWebPlatformFeatures);
+  }
+
+  void SetUp() override {
+    https_server_.reset(
+        new net::EmbeddedTestServer(net::EmbeddedTestServer::TYPE_HTTPS));
+    https_server_->ServeFilesFromSourceDirectory(server_root_);
+    ASSERT_TRUE(https_server_->Start());
+
+    InProcessBrowserTest::SetUp();
+  }
+
+  void SetUpOnMainThread() override {
+    NotificationDisplayServiceFactory::GetInstance()->SetTestingFactory(
+        browser()->profile(), &StubNotificationDisplayService::FactoryForTests);
+
+    SiteEngagementScore::SetParamValuesForTesting();
+    NavigateToTestPage(std::string("/") + kTestFileName);
+  }
 
  protected:
   // Returns the Platform Notification Service these unit tests are for.
@@ -81,180 +102,108 @@
     return PlatformNotificationServiceImpl::GetInstance();
   }
 
+  // Returns the stub notification display service.
+  StubNotificationDisplayService* GetDisplayService() const {
+    return static_cast<StubNotificationDisplayService*>(
+        NotificationDisplayServiceFactory::GetForProfile(browser()->profile()));
+  }
+
+  // Returns a vector with the Notification objects that are being displayed
+  // by the notification display service. Synchronous.
+  std::vector<Notification> GetDisplayedNotifications(
+      bool is_persistent) const {
+    NotificationCommon::Type type = is_persistent
+                                        ? NotificationCommon::PERSISTENT
+                                        : NotificationCommon::NON_PERSISTENT;
+
+    return GetDisplayService()->GetDisplayedNotificationsForType(type);
+  }
+
   // Grants permission to display Web Notifications for origin of the test
   // page that's being used in this browser test.
-  void GrantNotificationPermissionForTest() const;
+  void GrantNotificationPermissionForTest() const {
+    GURL origin = TestPageUrl().GetOrigin();
 
-  bool RequestAndAcceptPermission();
-  bool RequestAndDenyPermission();
+    DesktopNotificationProfileUtil::GrantPermission(browser()->profile(),
+                                                    origin);
+    ASSERT_EQ(CONTENT_SETTING_ALLOW,
+              PermissionManager::Get(browser()->profile())
+                  ->GetPermissionStatus(CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
+                                        origin, origin)
+                  .content_setting);
+  }
 
-  void EnableFullscreenNotifications();
-  void DisableFullscreenNotifications();
+  bool RequestAndAcceptPermission() {
+    return "granted" ==
+           RequestAndRespondToPermission(PermissionRequestManager::ACCEPT_ALL);
+  }
 
-  double GetEngagementScore(const GURL& origin) const;
-  GURL GetLastCommittedURL() const;
+  bool RequestAndDenyPermission() {
+    return "denied" ==
+           RequestAndRespondToPermission(PermissionRequestManager::DENY_ALL);
+  }
 
-  // Returns the UI Manager on which notifications will be displayed.
-  StubNotificationUIManager* ui_manager() const { return ui_manager_.get(); }
+  void EnableFullscreenNotifications() {
+    feature_list_.InitAndEnableFeature(
+        features::kAllowFullscreenWebNotificationsFeature);
+  }
 
-  const base::FilePath& server_root() const { return server_root_; }
+  void DisableFullscreenNotifications() {
+    feature_list_.InitAndDisableFeature(
+        features::kAllowFullscreenWebNotificationsFeature);
+  }
+
+  double GetEngagementScore(const GURL& origin) const {
+    return SiteEngagementService::Get(browser()->profile())->GetScore(origin);
+  }
+
+  GURL GetLastCommittedURL() const {
+    return browser()
+        ->tab_strip_model()
+        ->GetActiveWebContents()
+        ->GetLastCommittedURL();
+  }
 
   // Navigates the browser to the test page indicated by |path|.
-  void NavigateToTestPage(const std::string& path) const;
+  void NavigateToTestPage(const std::string& path) const {
+    ui_test_utils::NavigateToURL(browser(), https_server_->GetURL(path));
+  }
 
   // Executes |script| and stores the result as a string in |result|. A boolean
   // will be returned, indicating whether the script was executed successfully.
-  bool RunScript(const std::string& script, std::string* result) const;
+  bool RunScript(const std::string& script, std::string* result) const {
+    return content::ExecuteScriptAndExtractString(
+        browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame(),
+        script, result);
+  }
 
-  net::HostPortPair ServerHostPort() const;
-  GURL TestPageUrl() const;
+  GURL TestPageUrl() const {
+    return https_server_->GetURL(std::string("/") + kTestFileName);
+  }
 
- private:
   std::string RequestAndRespondToPermission(
-      PermissionRequestManager::AutoResponseType bubble_response);
+      PermissionRequestManager::AutoResponseType bubble_response) {
+    std::string result;
+    content::WebContents* web_contents = GetActiveWebContents(browser());
+    PermissionRequestManager::FromWebContents(web_contents)
+        ->set_auto_response_for_test(bubble_response);
+    EXPECT_TRUE(RunScript("RequestPermission();", &result));
+    return result;
+  }
 
   content::WebContents* GetActiveWebContents(Browser* browser) {
     return browser->tab_strip_model()->GetActiveWebContents();
   }
 
-  SiteEngagementService* engagement_service_;
   const base::FilePath server_root_;
-  const std::string test_page_url_;
-  std::unique_ptr<StubNotificationUIManager> ui_manager_;
-  std::unique_ptr<MessageCenterDisplayService> display_service_;
+
+ private:
   std::unique_ptr<net::EmbeddedTestServer> https_server_;
   base::test::ScopedFeatureList feature_list_;
 };
 
-// -----------------------------------------------------------------------------
-
-namespace {
-const char kTestFileName[] = "notifications/platform_notification_service.html";
-}
-
 PlatformNotificationServiceBrowserTest::PlatformNotificationServiceBrowserTest()
-    : server_root_(FILE_PATH_LITERAL("chrome/test/data")),
-      // The test server has a base directory that doesn't exist in the
-      // filesystem.
-      test_page_url_(std::string("/") + kTestFileName) {}
-
-void PlatformNotificationServiceBrowserTest::SetUpDefaultCommandLine(
-    base::CommandLine* command_line) {
-  InProcessBrowserTest::SetUpDefaultCommandLine(command_line);
-
-  // Needed for the Reply button tests
-  command_line->AppendSwitch(switches::kEnableExperimentalWebPlatformFeatures);
-
-#if BUILDFLAG(ENABLE_NATIVE_NOTIFICATIONS)
-  // TODO(crbug.com/714679): Temporary change while tests are upgraded to deal
-  // with native notifications.
-  command_line->AppendSwitchASCII(switches::kDisableFeatures,
-                                  features::kNativeNotifications.name);
-#endif  // BUILDFLAG(ENABLE_NATIVE_NOTIFICATIONS)
-}
-
-void PlatformNotificationServiceBrowserTest::SetUp() {
-  ui_manager_.reset(new StubNotificationUIManager);
-  https_server_.reset(
-      new net::EmbeddedTestServer(net::EmbeddedTestServer::TYPE_HTTPS));
-  https_server_->ServeFilesFromSourceDirectory(server_root_);
-  ASSERT_TRUE(https_server_->Start());
-  InProcessBrowserTest::SetUp();
-}
-
-void PlatformNotificationServiceBrowserTest::SetUpOnMainThread() {
-  SiteEngagementScore::SetParamValuesForTesting();
-  engagement_service_ = SiteEngagementService::Get(browser()->profile());
-  NavigateToTestPage(test_page_url_);
-  display_service_.reset(
-      new MessageCenterDisplayService(browser()->profile(), ui_manager_.get()));
-  service()->SetNotificationDisplayServiceForTesting(display_service_.get());
-}
-
-void PlatformNotificationServiceBrowserTest::TearDown() {
-  service()->SetNotificationDisplayServiceForTesting(nullptr);
-}
-
-void PlatformNotificationServiceBrowserTest::
-    GrantNotificationPermissionForTest() const {
-  GURL origin = TestPageUrl().GetOrigin();
-
-  DesktopNotificationProfileUtil::GrantPermission(browser()->profile(), origin);
-  ASSERT_EQ(CONTENT_SETTING_ALLOW,
-            PermissionManager::Get(browser()->profile())
-                ->GetPermissionStatus(CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
-                                      origin, origin)
-                .content_setting);
-}
-
-void PlatformNotificationServiceBrowserTest::NavigateToTestPage(
-    const std::string& path) const {
-  ui_test_utils::NavigateToURL(browser(), https_server_->GetURL(path));
-}
-
-bool PlatformNotificationServiceBrowserTest::RunScript(
-    const std::string& script, std::string* result) const {
-  return content::ExecuteScriptAndExtractString(
-      browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame(),
-      script,
-      result);
-}
-
-net::HostPortPair PlatformNotificationServiceBrowserTest::ServerHostPort()
-    const {
-  return https_server_->host_port_pair();
-}
-
-GURL PlatformNotificationServiceBrowserTest::TestPageUrl() const {
-  return https_server_->GetURL(test_page_url_);
-}
-
-std::string
-PlatformNotificationServiceBrowserTest::RequestAndRespondToPermission(
-    PermissionRequestManager::AutoResponseType bubble_response) {
-  std::string result;
-  content::WebContents* web_contents = GetActiveWebContents(browser());
-  PermissionRequestManager::FromWebContents(web_contents)
-      ->set_auto_response_for_test(bubble_response);
-  EXPECT_TRUE(RunScript("RequestPermission();", &result));
-  return result;
-}
-
-bool PlatformNotificationServiceBrowserTest::RequestAndAcceptPermission() {
-  std::string result =
-      RequestAndRespondToPermission(PermissionRequestManager::ACCEPT_ALL);
-  return "granted" == result;
-}
-
-bool PlatformNotificationServiceBrowserTest::RequestAndDenyPermission() {
-  std::string result =
-      RequestAndRespondToPermission(PermissionRequestManager::DENY_ALL);
-  return "denied" == result;
-}
-
-void PlatformNotificationServiceBrowserTest::EnableFullscreenNotifications() {
-  feature_list_.InitAndEnableFeature(
-      features::kAllowFullscreenWebNotificationsFeature);
-}
-
-void PlatformNotificationServiceBrowserTest::DisableFullscreenNotifications() {
-  feature_list_.InitAndDisableFeature(
-      features::kAllowFullscreenWebNotificationsFeature);
-}
-
-double PlatformNotificationServiceBrowserTest::GetEngagementScore(
-    const GURL& origin) const {
-  return engagement_service_->GetScore(origin);
-}
-
-GURL PlatformNotificationServiceBrowserTest::GetLastCommittedURL() const {
-  return browser()
-      ->tab_strip_model()
-      ->GetActiveWebContents()
-      ->GetLastCommittedURL();
-}
-
-// -----------------------------------------------------------------------------
+    : server_root_(FILE_PATH_LITERAL("chrome/test/data")) {}
 
 // TODO(peter): Move PlatformNotificationService-related tests over from
 // notification_browsertest.cc to this file.
@@ -269,7 +218,7 @@
       "TypeError: No notification permission has been granted for this origin.",
       script_result);
 
-  ASSERT_EQ(0u, ui_manager()->GetNotificationCount());
+  ASSERT_EQ(0u, GetDisplayedNotifications(true /* is_persistent */).size());
 }
 
 IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest,
@@ -284,7 +233,9 @@
        &script_result));
   EXPECT_EQ("ok", script_result);
 
-  ASSERT_EQ(1u, ui_manager()->GetNotificationCount());
+  std::vector<Notification> notifications =
+      GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(1u, notifications.size());
 
 #if BUILDFLAG(ENABLE_BACKGROUND)
   ASSERT_FALSE(KeepAliveRegistry::GetInstance()->IsOriginRegistered(
@@ -292,15 +243,20 @@
 #endif
 
   // We expect +1 engagement for the notification interaction.
-  const Notification& notification = ui_manager()->GetNotificationAt(0);
-  notification.delegate()->Click();
+  notifications[0].delegate()->Click();
   EXPECT_DOUBLE_EQ(6.5, GetEngagementScore(GetLastCommittedURL()));
 
+  // Clicking on the notification should not automatically close it.
+  notifications = GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(1u, notifications.size());
+
 #if BUILDFLAG(ENABLE_BACKGROUND)
   ASSERT_TRUE(KeepAliveRegistry::GetInstance()->IsOriginRegistered(
       KeepAliveOrigin::PENDING_NOTIFICATION_CLICK_EVENT));
 #endif
 
+  EXPECT_FALSE(notifications[0].delegate()->ShouldDisplayOverFullscreen());
+
   ASSERT_TRUE(RunScript("GetMessageFromWorker()", &script_result));
   EXPECT_EQ("action_none", script_result);
 
@@ -309,7 +265,8 @@
       KeepAliveOrigin::PENDING_NOTIFICATION_CLICK_EVENT));
 #endif
 
-  ASSERT_EQ(1u, ui_manager()->GetNotificationCount());
+  notifications = GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(1u, notifications.size());
 }
 
 IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest,
@@ -323,10 +280,12 @@
                         &script_result));
   EXPECT_EQ("ok", script_result);
 
-  ASSERT_EQ(1u, ui_manager()->GetNotificationCount());
+  std::vector<Notification> notifications =
+      GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(1u, notifications.size());
 
   // We don't use or check the notification's direction and language.
-  const Notification& default_notification = ui_manager()->GetNotificationAt(0);
+  const Notification& default_notification = notifications[0];
   EXPECT_EQ("Some title", base::UTF16ToUTF8(default_notification.title()));
   EXPECT_EQ("", base::UTF16ToUTF8(default_notification.message()));
   EXPECT_EQ("", default_notification.tag());
@@ -350,11 +309,11 @@
                         &script_result));
   EXPECT_EQ("ok", script_result);
 
-  ASSERT_EQ(2u, ui_manager()->GetNotificationCount());
+  notifications = GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(2u, notifications.size());
 
   // We don't use or check the notification's direction and language.
-  const Notification& all_options_notification =
-      ui_manager()->GetNotificationAt(1);
+  const Notification& all_options_notification = notifications[1];
   EXPECT_EQ("Title", base::UTF16ToUTF8(all_options_notification.title()));
   EXPECT_EQ("Contents", base::UTF16ToUTF8(all_options_notification.message()));
   EXPECT_EQ("replace-id", all_options_notification.tag());
@@ -395,15 +354,17 @@
                         &script_result));
   EXPECT_EQ("ok", script_result);
 
-  ASSERT_EQ(1u, ui_manager()->GetNotificationCount());
+  std::vector<Notification> notifications =
+      GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(1u, notifications.size());
+  EXPECT_EQ(0u, notifications[0].buttons().size());
 
-  const Notification& notification = ui_manager()->GetNotificationAt(0);
-  const std::vector<message_center::ButtonInfo>& buttons =
-      notification.buttons();
-  EXPECT_EQ(0u, buttons.size());
+  notifications[0].delegate()->SettingsClick();
 
-  notification.delegate()->SettingsClick();
-  ASSERT_EQ(1u, ui_manager()->GetNotificationCount());
+  // Clicking on the settings button should not close the notification.
+  notifications = GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(1u, notifications.size());
+
   web_contents = browser()->tab_strip_model()->GetActiveWebContents();
   ASSERT_TRUE(content::WaitForLoadStop(web_contents));
 
@@ -423,9 +384,11 @@
                         &script_result));
   EXPECT_EQ("ok", script_result);
 
-  ASSERT_EQ(1u, ui_manager()->GetNotificationCount());
+  std::vector<Notification> notifications =
+      GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(1u, notifications.size());
 
-  const Notification& notification = ui_manager()->GetNotificationAt(0);
+  const Notification& notification = notifications[0];
   EXPECT_EQ("Title", base::UTF16ToUTF8(notification.title()));
   EXPECT_EQ("Contents", base::UTF16ToUTF8(notification.message()));
 
@@ -445,10 +408,11 @@
                         &script_result));
   EXPECT_EQ("ok", script_result);
 
-  ASSERT_EQ(1u, ui_manager()->GetNotificationCount());
+  std::vector<Notification> notifications =
+      GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(1u, notifications.size());
 
-  const Notification& notification = ui_manager()->GetNotificationAt(0);
-  notification.delegate()->Click();
+  notifications[0].delegate()->Click();
 
   // We have interacted with the button, so expect a notification bump.
   EXPECT_DOUBLE_EQ(6.5, GetEngagementScore(GetLastCommittedURL()));
@@ -456,7 +420,8 @@
   ASSERT_TRUE(RunScript("GetMessageFromWorker()", &script_result));
   EXPECT_EQ("action_close", script_result);
 
-  ASSERT_EQ(0u, ui_manager()->GetNotificationCount());
+  notifications = GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(0u, notifications.size());
 }
 
 IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest,
@@ -471,9 +436,11 @@
       RunScript("DisplayPersistentNotification('close_test')", &script_result));
   EXPECT_EQ("ok", script_result);
 
-  ASSERT_EQ(1u, ui_manager()->GetNotificationCount());
-  const Notification& notification = ui_manager()->GetNotificationAt(0);
-  notification.delegate()->Close(true /* by_user */);
+  std::vector<Notification> notifications =
+      GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(1u, notifications.size());
+
+  notifications[0].delegate()->Close(true /* by_user */);
 
   // The user closed this notification so the score should remain the same.
   EXPECT_DOUBLE_EQ(5.5, GetEngagementScore(GetLastCommittedURL()));
@@ -490,13 +457,14 @@
   std::string script_result;
   ASSERT_TRUE(RunScript("DisplayPersistentNotification()", &script_result));
 
-  net::HostPortPair host_port = ServerHostPort();
+  GURL test_origin = TestPageUrl().GetOrigin();
 
-  const Notification& notification = ui_manager()->GetNotificationAt(0);
+  std::vector<Notification> notifications =
+      GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(1u, notifications.size());
 
-  EXPECT_TRUE(notification.context_message().empty());
-  EXPECT_EQ("https://" + host_port.ToString() + "/",
-            notification.origin_url().spec());
+  EXPECT_TRUE(notifications[0].context_message().empty());
+  EXPECT_EQ(test_origin.spec(), notifications[0].origin_url().spec());
 }
 
 IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest,
@@ -507,9 +475,12 @@
   std::string script_result;
   ASSERT_TRUE(RunScript("DisplayPersistentNotification()", &script_result));
 
-  const Notification& notification = ui_manager()->GetNotificationAt(0);
+  std::vector<Notification> notifications =
+      GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(1u, notifications.size());
 
-  EXPECT_EQ(TestPageUrl().spec(), notification.service_worker_scope().spec());
+  EXPECT_EQ(TestPageUrl().spec(),
+            notifications[0].service_worker_scope().spec());
 }
 
 IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest,
@@ -537,7 +508,7 @@
   base::FilePath dir_source_root;
   EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &dir_source_root));
   base::FilePath full_file_path =
-      dir_source_root.Append(server_root()).AppendASCII(kTestFileName);
+      dir_source_root.Append(server_root_).AppendASCII(kTestFileName);
   GURL file_url(net::FilePathToFileURL(full_file_path));
 
   ui_test_utils::NavigateToURL(browser(), file_url);
@@ -568,9 +539,11 @@
                         &script_result));
   EXPECT_EQ("ok", script_result);
 
-  ASSERT_EQ(1u, ui_manager()->GetNotificationCount());
+  std::vector<Notification> notifications =
+      GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(1u, notifications.size());
 
-  const Notification& notification = ui_manager()->GetNotificationAt(0);
+  const Notification& notification = notifications[0];
   EXPECT_FALSE(notification.icon().IsEmpty());
 
   EXPECT_EQ("Data URL Title", base::UTF16ToUTF8(notification.title()));
@@ -587,9 +560,11 @@
                         &script_result));
   EXPECT_EQ("ok", script_result);
 
-  ASSERT_EQ(1u, ui_manager()->GetNotificationCount());
+  std::vector<Notification> notifications =
+      GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(1u, notifications.size());
 
-  const Notification& notification = ui_manager()->GetNotificationAt(0);
+  const Notification& notification = notifications[0];
   EXPECT_FALSE(notification.icon().IsEmpty());
 
   EXPECT_EQ("Blob Title", base::UTF16ToUTF8(notification.title()));
@@ -608,9 +583,12 @@
   ASSERT_TRUE(RunScript("DisplayPersistentNotificationWithActionButtons()",
                         &script_result));
   EXPECT_EQ("ok", script_result);
-  ASSERT_EQ(1u, ui_manager()->GetNotificationCount());
 
-  const Notification& notification = ui_manager()->GetNotificationAt(0);
+  std::vector<Notification> notifications =
+      GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(1u, notifications.size());
+
+  const Notification& notification = notifications[0];
   ASSERT_EQ(2u, notification.buttons().size());
   EXPECT_EQ("actionTitle1", base::UTF16ToUTF8(notification.buttons()[0].title));
   EXPECT_EQ("actionTitle2", base::UTF16ToUTF8(notification.buttons()[1].title));
@@ -637,9 +615,12 @@
   ASSERT_TRUE(RunScript("DisplayPersistentNotificationWithReplyButton()",
                         &script_result));
   EXPECT_EQ("ok", script_result);
-  ASSERT_EQ(1u, ui_manager()->GetNotificationCount());
 
-  const Notification& notification = ui_manager()->GetNotificationAt(0);
+  std::vector<Notification> notifications =
+      GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(1u, notifications.size());
+
+  const Notification& notification = notifications[0];
   ASSERT_EQ(1u, notification.buttons().size());
   EXPECT_EQ("actionTitle1", base::UTF16ToUTF8(notification.buttons()[0].title));
 
@@ -655,6 +636,7 @@
 
   std::string script_result;
   std::string script_message;
+
   ASSERT_TRUE(RunScript("DisplayNonPersistentNotification('NonPersistent')",
                         &script_result));
   EXPECT_EQ("ok", script_result);
@@ -671,50 +653,47 @@
 
   ASSERT_TRUE(RunScript("GetMessageFromWorker()", &script_message));
 
-  std::vector<std::string> notifications = base::SplitString(
+  std::vector<std::string> notification_ids = base::SplitString(
       script_message, ",", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
+  ASSERT_EQ(2u, notification_ids.size());
+
+  const std::string first_id = notification_ids[0];
+
+  std::vector<Notification> notifications =
+      GetDisplayedNotifications(true /* is_persistent */);
   ASSERT_EQ(2u, notifications.size());
 
   // Now remove one of the notifications straight from the ui manager
   // without going through the database.
-  const Notification& notification = ui_manager()->GetNotificationAt(1);
+  const Notification& notification = notifications[1];
 
   // p: is the prefix for persistent notifications. See
   //  content/browser/notifications/notification_id_generator.{h,cc} for details
   ASSERT_TRUE(
       base::StartsWith(notification.id(), "p:", base::CompareCase::SENSITIVE));
-  ASSERT_TRUE(ui_manager()->SilentDismissById(
-      notification.delegate_id(),
-      NotificationUIManager::GetProfileID(browser()->profile())));
+
+  GetDisplayService()->RemoveNotification(
+      NotificationCommon::PERSISTENT, notification.delegate_id(),
+      false /* by_user */, true /* silent */);
+
   ASSERT_TRUE(RunScript("GetDisplayedNotifications()", &script_result));
   EXPECT_EQ("ok", script_result);
 
   ASSERT_TRUE(RunScript("GetMessageFromWorker()", &script_message));
-  notifications = base::SplitString(script_message, ",", base::KEEP_WHITESPACE,
-                                    base::SPLIT_WANT_ALL);
-  ASSERT_EQ(1u, notifications.size());
+  notification_ids = base::SplitString(
+      script_message, ",", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
+
+  // The list of displayed notification Ids should have been updated.
+  ASSERT_EQ(1u, notification_ids.size());
+  ASSERT_EQ(notification_ids[0], first_id);
 }
 
-IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest,
-                       TestShouldDisplayNormal) {
-  ASSERT_NO_FATAL_FAILURE(GrantNotificationPermissionForTest());
-  EnableFullscreenNotifications();
-
-  std::string script_result;
-  ASSERT_TRUE(RunScript(
-      "DisplayPersistentNotification('display_normal')", &script_result));
-  EXPECT_EQ("ok", script_result);
-
-  ASSERT_EQ(1u, ui_manager()->GetNotificationCount());
-  const Notification& notification = ui_manager()->GetNotificationAt(0);
-  EXPECT_FALSE(notification.delegate()->ShouldDisplayOverFullscreen());
-}
+// Mac OS X exclusively uses native notifications, so the decision on whether to
+// display notifications whilst fullscreen is deferred to the operating system.
+#if !defined(OS_MACOSX)
 
 IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest,
                        TestShouldDisplayFullscreen) {
-#if defined(OS_MACOSX)
-  ui::test::ScopedFakeNSWindowFullscreen fake_fullscreen;
-#endif
   ASSERT_NO_FATAL_FAILURE(GrantNotificationPermissionForTest());
   EnableFullscreenNotifications();
 
@@ -738,16 +717,15 @@
   ASSERT_TRUE(browser()->window()->IsActive())
       << "Browser is active after going fullscreen";
 
-  ASSERT_EQ(1u, ui_manager()->GetNotificationCount());
-  const Notification& notification = ui_manager()->GetNotificationAt(0);
-  EXPECT_TRUE(notification.delegate()->ShouldDisplayOverFullscreen());
+  std::vector<Notification> notifications =
+      GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(1u, notifications.size());
+
+  EXPECT_TRUE(notifications[0].delegate()->ShouldDisplayOverFullscreen());
 }
 
 IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest,
                        TestShouldDisplayFullscreenOff) {
-#if defined(OS_MACOSX)
-  ui::test::ScopedFakeNSWindowFullscreen fake_fullscreen;
-#endif
   ASSERT_NO_FATAL_FAILURE(GrantNotificationPermissionForTest());
   DisableFullscreenNotifications();
 
@@ -771,16 +749,15 @@
   ASSERT_TRUE(browser()->window()->IsActive())
       << "Browser is active after going fullscreen";
 
-  ASSERT_EQ(1u, ui_manager()->GetNotificationCount());
-  const Notification& notification = ui_manager()->GetNotificationAt(0);
+  std::vector<Notification> notifications =
+      GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(1u, notifications.size());
+
   // When the experiment flag is off, then ShouldDisplayOverFullscreen should
   // return false.
-  EXPECT_FALSE(notification.delegate()->ShouldDisplayOverFullscreen());
+  EXPECT_FALSE(notifications[0].delegate()->ShouldDisplayOverFullscreen());
 }
 
-// The Fake OSX fullscreen window doesn't like drawing a second fullscreen
-// window when another is visible.
-#if !defined(OS_MACOSX)
 IN_PROC_BROWSER_TEST_F(PlatformNotificationServiceBrowserTest,
                        TestShouldDisplayMultiFullscreen) {
   ASSERT_NO_FATAL_FAILURE(GrantNotificationPermissionForTest());
@@ -817,25 +794,22 @@
   ASSERT_FALSE(browser()->window()->IsActive());
   ASSERT_TRUE(other_browser->window()->IsActive());
 
-  ASSERT_EQ(1u, ui_manager()->GetNotificationCount());
-  const Notification& notification = ui_manager()->GetNotificationAt(0);
-  EXPECT_FALSE(notification.delegate()->ShouldDisplayOverFullscreen());
+  std::vector<Notification> notifications =
+      GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(1u, notifications.size());
+
+  EXPECT_FALSE(notifications[0].delegate()->ShouldDisplayOverFullscreen());
 }
-#endif
+
+#endif  // defined(OS_MACOSX)
 
 class PlatformNotificationServiceWithoutContentImageBrowserTest
     : public PlatformNotificationServiceBrowserTest {
  public:
   // InProcessBrowserTest overrides.
   void SetUpInProcessBrowserTestFixture() override {
-#if BUILDFLAG(ENABLE_NATIVE_NOTIFICATIONS)
-    scoped_feature_list_.InitWithFeatures(
-        {},
-        {features::kNotificationContentImage, features::kNativeNotifications});
-#else
     scoped_feature_list_.InitWithFeatures(
         {}, {features::kNotificationContentImage});
-#endif  // BUILDFLAG(ENABLE_NATIVE_NOTIFICATIONS)
   }
 
  private:
@@ -852,10 +826,11 @@
       RunScript("DisplayPersistentAllOptionsNotification()", &script_result));
   EXPECT_EQ("ok", script_result);
 
-  ASSERT_EQ(1u, ui_manager()->GetNotificationCount());
-  const Notification& notification = ui_manager()->GetNotificationAt(0);
+  std::vector<Notification> notifications =
+      GetDisplayedNotifications(true /* is_persistent */);
+  ASSERT_EQ(1u, notifications.size());
 
   // Since the kNotificationContentImage kill switch has disabled images, the
   // notification should be shown without an image.
-  EXPECT_TRUE(notification.image().IsEmpty());
+  EXPECT_TRUE(notifications[0].image().IsEmpty());
 }
diff --git a/chrome/browser/notifications/stub_notification_display_service.cc b/chrome/browser/notifications/stub_notification_display_service.cc
index 578c43a..0905950 100644
--- a/chrome/browser/notifications/stub_notification_display_service.cc
+++ b/chrome/browser/notifications/stub_notification_display_service.cc
@@ -22,10 +22,25 @@
 
 StubNotificationDisplayService::~StubNotificationDisplayService() = default;
 
+std::vector<Notification>
+StubNotificationDisplayService::GetDisplayedNotificationsForType(
+    NotificationCommon::Type type) const {
+  std::vector<Notification> notifications;
+  for (const auto& pair : notifications_) {
+    if (pair.first != type)
+      continue;
+
+    notifications.push_back(pair.second);
+  }
+
+  return notifications;
+}
+
 void StubNotificationDisplayService::RemoveNotification(
     NotificationCommon::Type notification_type,
     const std::string& notification_id,
-    bool by_user) {
+    bool by_user,
+    bool silent) {
   auto iter = std::find_if(
       notifications_.begin(), notifications_.end(),
       [notification_type, notification_id](const NotificationData& data) {
@@ -36,10 +51,14 @@
   if (iter == notifications_.end())
     return;
 
-  NotificationHandler* handler = GetNotificationHandler(notification_type);
-  DCHECK(handler);
-  handler->OnClose(profile_, iter->second.origin_url().spec(), notification_id,
-                   by_user);
+  if (!silent) {
+    NotificationHandler* handler = GetNotificationHandler(notification_type);
+    DCHECK(handler);
+
+    handler->OnClose(profile_, iter->second.origin_url().spec(),
+                     notification_id, by_user);
+  }
+
   notifications_.erase(iter);
 }
 
@@ -67,6 +86,11 @@
   // notification's delegate is not meant to be invoked in this situation.
   Close(notification_type, notification_id);
 
+  NotificationHandler* handler = GetNotificationHandler(notification_type);
+  DCHECK(handler);
+
+  handler->OnShow(profile_, notification_id);
+
   notifications_.emplace_back(notification_type, notification);
 }
 
diff --git a/chrome/browser/notifications/stub_notification_display_service.h b/chrome/browser/notifications/stub_notification_display_service.h
index 096baba..699d40af 100644
--- a/chrome/browser/notifications/stub_notification_display_service.h
+++ b/chrome/browser/notifications/stub_notification_display_service.h
@@ -29,10 +29,17 @@
   explicit StubNotificationDisplayService(Profile* profile);
   ~StubNotificationDisplayService() override;
 
-  // Removes the notification identified by |notification_id|.
+  // Returns a vector of the displayed Notification objects.
+  std::vector<Notification> GetDisplayedNotificationsForType(
+      NotificationCommon::Type type) const;
+
+  // Removes the notification identified by |notification_id|. This can
+  // optionally be |silent|, which means the delegate events won't be invoked
+  // to imitate behaviour on operating systems that don't support such events.
   void RemoveNotification(NotificationCommon::Type notification_type,
                           const std::string& notification_id,
-                          bool by_user);
+                          bool by_user,
+                          bool silent = false);
 
   // Removes all notifications shown by this display service.
   void RemoveAllNotifications(NotificationCommon::Type notification_type,
diff --git a/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc b/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc
index dcac047..e359459 100644
--- a/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc
+++ b/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc
@@ -42,10 +42,10 @@
 #include "components/ntp_snippets/bookmarks/bookmark_suggestions_provider.h"
 #include "components/ntp_snippets/category_rankers/category_ranker.h"
 #include "components/ntp_snippets/content_suggestions_service.h"
-#include "components/ntp_snippets/contextual_suggestions_source.h"
+#include "components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h"
+#include "components/ntp_snippets/contextual/contextual_suggestions_source.h"
 #include "components/ntp_snippets/features.h"
 #include "components/ntp_snippets/ntp_snippets_constants.h"
-#include "components/ntp_snippets/remote/contextual_suggestions_fetcher_impl.h"
 #include "components/ntp_snippets/remote/persistent_scheduler.h"
 #include "components/ntp_snippets/remote/prefetched_pages_tracker.h"
 #include "components/ntp_snippets/remote/remote_suggestions_database.h"
diff --git a/chrome/browser/password_manager/password_manager_browsertest.cc b/chrome/browser/password_manager/password_manager_browsertest.cc
index 2ee854e..5ae70ff 100644
--- a/chrome/browser/password_manager/password_manager_browsertest.cc
+++ b/chrome/browser/password_manager/password_manager_browsertest.cc
@@ -30,6 +30,7 @@
 #include "chrome/browser/ui/login/login_handler_test_utils.h"
 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/test/test_browser_dialog.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/test/base/ui_test_utils.h"
@@ -57,6 +58,7 @@
 #include "net/url_request/test_url_fetcher_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "third_party/WebKit/public/platform/WebInputEvent.h"
+#include "ui/base/ui_base_switches.h"
 #include "ui/events/keycodes/keyboard_codes.h"
 #include "ui/gfx/geometry/point.h"
 
@@ -3270,4 +3272,50 @@
   histograms.ExpectTotalCount(kHistogram, 0);
 }
 
+// Harness for showing dialogs as part of the DialogBrowserTest suite. Allows
+// the dialogs to be shown interactively when invoked with, e.g.,
+//   browser_tests --gtest_filter=BrowserDialogTest.Invoke --interactive
+//       --dialog=PasswordManagerDialogBrowserTest.InvokeDialog_normal.
+class PasswordManagerDialogBrowserTest
+    : public SupportsTestDialog<PasswordManagerBrowserTestBase> {
+ public:
+  PasswordManagerDialogBrowserTest() = default;
+
+  // content::BrowserTestBase:
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    // BrowserDialogTest only works on Mac with --secondary-ui-md.
+    command_line->AppendSwitch(switches::kExtendMdToSecondaryUi);
+  }
+
+  void ShowDialog(const std::string& name) override {
+    // Note regarding flakiness: LocationBarBubbleDelegateView::ShowForReason()
+    // uses ShowInactive() unless the bubble is invoked with reason ==
+    // USER_GESTURE. This means that, so long as these dialogs are not triggered
+    // by gesture, the dialog does not attempt to take focus, and so should
+    // never _lose_ focus in the test, which could cause flakes when tests are
+    // run in parallel. LocationBarBubbles also dismiss on other events, but
+    // only events in the WebContents. E.g. Rogue mouse clicks should not cause
+    // the dialog to dismiss since they won't be sent via WebContents.
+    // A user gesture is determined in browser_commands.cc by checking
+    // ManagePasswordsUIController::IsAutomaticallyOpeningBubble(), but that's
+    // set and cleared immediately while showing the bubble, so it can't be
+    // checked here.
+    NavigateToFile("/password/password_form.html");
+    NavigationObserver observer(WebContents());
+    std::string fill_and_submit =
+        "document.getElementById('username_field').value = 'temp';"
+        "document.getElementById('password_field').value = 'random';"
+        "document.getElementById('input_submit_button').click()";
+    ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_and_submit));
+    observer.Wait();
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(PasswordManagerDialogBrowserTest);
+};
+
+IN_PROC_BROWSER_TEST_F(PasswordManagerDialogBrowserTest, InvokeDialog_normal) {
+  RunDialog();
+}
+
 }  // namespace password_manager
diff --git a/chrome/browser/payments/android/journey_logger_android.cc b/chrome/browser/payments/android/journey_logger_android.cc
index 5d50b9075..644cf50 100644
--- a/chrome/browser/payments/android/journey_logger_android.cc
+++ b/chrome/browser/payments/android/journey_logger_android.cc
@@ -111,6 +111,16 @@
                                           requested_phone, requested_name);
 }
 
+void JourneyLoggerAndroid::SetRequestedPaymentMethodTypes(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jcaller,
+    jboolean requested_basic_card,
+    jboolean requested_method_google,
+    jboolean requested_method_other) {
+  journey_logger_.SetRequestedPaymentMethodTypes(
+      requested_basic_card, requested_method_google, requested_method_other);
+}
+
 void JourneyLoggerAndroid::SetCompleted(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& jcaller) {
diff --git a/chrome/browser/payments/android/journey_logger_android.h b/chrome/browser/payments/android/journey_logger_android.h
index 4fbb5496..3d89ee1 100644
--- a/chrome/browser/payments/android/journey_logger_android.h
+++ b/chrome/browser/payments/android/journey_logger_android.h
@@ -57,6 +57,12 @@
       jboolean requested_email,
       jboolean requested_phone,
       jboolean requested_name);
+  void SetRequestedPaymentMethodTypes(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& jcaller,
+      jboolean requested_basic_card,
+      jboolean requested_method_google,
+      jboolean requested_method_other);
   void SetCompleted(JNIEnv* env,
                     const base::android::JavaParamRef<jobject>& jcaller);
   void SetAborted(JNIEnv* env,
diff --git a/chrome/browser/predictors/OWNERS b/chrome/browser/predictors/OWNERS
index 538cb20..791f6ad 100644
--- a/chrome/browser/predictors/OWNERS
+++ b/chrome/browser/predictors/OWNERS
@@ -1,4 +1,3 @@
 alexilin@chromium.org
 lizeb@chromium.org
 pasko@chromium.org
-zhenw@chromium.org
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index aed9e942..082ad59 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -263,9 +263,8 @@
 #endif
 
 #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) && !defined(OS_MACOSX)
-#include "chrome/browser/feature_engagement/new_tab/new_tab_tracker.h"
+#include "chrome/browser/feature_engagement/session_duration_updater.h"
 #endif
-
 #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
 #include "chrome/browser/ui/startup/default_browser_prompt.h"
 #endif
@@ -587,7 +586,7 @@
 #endif
 
 #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) && !defined(OS_MACOSX)
-  feature_engagement::NewTabTracker::RegisterProfilePrefs(registry);
+  feature_engagement::SessionDurationUpdater::RegisterProfilePrefs(registry);
 #endif
 
 #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc
index 157df68..0ff4e1c 100644
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -993,6 +993,9 @@
       g_browser_process->platform_part()
               ->profile_helper()
               ->GetSigninProfileDir() != profile->GetPath() &&
+      g_browser_process->platform_part()
+              ->profile_helper()
+              ->GetLockScreenAppProfilePath() != profile->GetPath() &&
 #endif
       command_line->HasSwitch(switches::kSupervisedUserId);
   if (force_supervised_user_id) {
diff --git a/chrome/browser/profiles/profile_shortcut_manager_win.cc b/chrome/browser/profiles/profile_shortcut_manager_win.cc
index b44bf1e..cc90f97 100644
--- a/chrome/browser/profiles/profile_shortcut_manager_win.cc
+++ b/chrome/browser/profiles/profile_shortcut_manager_win.cc
@@ -964,8 +964,7 @@
     return;
   bool remove_badging = (storage.GetNumberOfProfiles() == 1u);
 
-  params.old_profile_name =
-      entry->GetShortcutName();
+  params.old_profile_name = entry->GetShortcutName();
 
   // Exit early if the mode is to update existing profile shortcuts only and
   // none were ever created for this profile, per the shortcut name not being
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
index 2e8532b..a1a4cb9 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
@@ -115,9 +115,9 @@
     params.writing_direction_default = 0;
     params.writing_direction_left_to_right = 0;
     params.writing_direction_right_to_left = 0;
-#endif  // OS_MACOSX
-    std::unique_ptr<TestRenderViewContextMenu> menu(
-        new TestRenderViewContextMenu(web_contents->GetMainFrame(), params));
+#endif
+    auto menu = base::MakeUnique<TestRenderViewContextMenu>(
+        web_contents->GetMainFrame(), params);
     menu->Init();
     return menu;
   }
@@ -135,7 +135,8 @@
 
 class PdfPluginContextMenuBrowserTest : public InProcessBrowserTest {
  public:
-  PdfPluginContextMenuBrowserTest() {}
+  PdfPluginContextMenuBrowserTest() = default;
+  ~PdfPluginContextMenuBrowserTest() override = default;
 
   void SetUpOnMainThread() override {
     guest_view::GuestViewManager::set_factory_for_testing(&factory_);
@@ -648,8 +649,8 @@
 
   void AttemptImageSearch() {
     // |menu_observer_| will cause the search-by-image menu item to be clicked.
-    menu_observer_.reset(new ContextMenuNotificationObserver(
-        IDC_CONTENT_CONTEXT_SEARCHWEBFORIMAGE));
+    menu_observer_ = base::MakeUnique<ContextMenuNotificationObserver>(
+        IDC_CONTENT_CONTEXT_SEARCHWEBFORIMAGE);
     RightClickImage();
   }
 
@@ -818,7 +819,7 @@
       return;
 
     requests_to_wait_for_ = requests_to_wait_for;
-    run_loop_.reset(new base::RunLoop());
+    run_loop_ = base::MakeUnique<base::RunLoop>();
     run_loop_->Run();
     run_loop_.reset();
     requests_to_wait_for_ = -1;
@@ -882,8 +883,8 @@
   void AttemptLoadImage() {
     // Right-click where the image should be.
     // |menu_observer_| will cause the "Load image" menu item to be clicked.
-    menu_observer_.reset(new ContextMenuNotificationObserver(
-        IDC_CONTENT_CONTEXT_LOAD_ORIGINAL_IMAGE));
+    menu_observer_ = base::MakeUnique<ContextMenuNotificationObserver>(
+        IDC_CONTENT_CONTEXT_LOAD_ORIGINAL_IMAGE);
     content::WebContents* tab =
         browser()->tab_strip_model()->GetActiveWebContents();
     content::SimulateMouseClickAt(tab, 0, blink::WebMouseEvent::Button::kRight,
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.cc
index 7b3cfc60..dea0eac 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.cc
@@ -20,7 +20,7 @@
 TestRenderViewContextMenu::~TestRenderViewContextMenu() {}
 
 // static
-TestRenderViewContextMenu* TestRenderViewContextMenu::Create(
+std::unique_ptr<TestRenderViewContextMenu> TestRenderViewContextMenu::Create(
     content::WebContents* web_contents,
     const GURL& page_url,
     const GURL& link_url,
@@ -29,18 +29,19 @@
   params.page_url = page_url;
   params.link_url = link_url;
   params.frame_url = frame_url;
-  TestRenderViewContextMenu* menu =
-      new TestRenderViewContextMenu(web_contents->GetMainFrame(), params);
+  auto menu = base::MakeUnique<TestRenderViewContextMenu>(
+      web_contents->GetMainFrame(), params);
   menu->Init();
   return menu;
 }
 
-bool TestRenderViewContextMenu::IsItemPresent(int command_id) {
+bool TestRenderViewContextMenu::IsItemPresent(int command_id) const {
   return menu_model_.GetIndexOfCommandId(command_id) != -1;
 }
 
-bool TestRenderViewContextMenu::IsItemInRangePresent(int command_id_first,
-                                                     int command_id_last) {
+bool TestRenderViewContextMenu::IsItemInRangePresent(
+    int command_id_first,
+    int command_id_last) const {
   DCHECK_LE(command_id_first, command_id_last);
   for (int command_id = command_id_first; command_id <= command_id_last;
        ++command_id) {
@@ -65,7 +66,8 @@
         *found_model = model;
         *found_index = i;
         return true;
-      } else if (model->GetTypeAt(i) == MenuModel::TYPE_SUBMENU) {
+      }
+      if (model->GetTypeAt(i) == MenuModel::TYPE_SUBMENU) {
         models_to_search.push_back(model->GetSubmenuModelAt(i));
       }
     }
@@ -75,11 +77,12 @@
 }
 
 int TestRenderViewContextMenu::GetCommandIDByProfilePath(
-    const base::FilePath& path) {
+    const base::FilePath& path) const {
   size_t count = profile_link_paths_.size();
-  for (size_t i = 0; i < count; ++i)
+  for (size_t i = 0; i < count; ++i) {
     if (profile_link_paths_[i] == path)
       return IDC_OPEN_LINK_IN_PROFILE_FIRST + static_cast<int>(i);
+  }
   return -1;
 }
 
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h b/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h
index 7dd050c7..ea9f5b87 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h
@@ -7,6 +7,8 @@
 
 #include <stddef.h>
 
+#include <memory>
+
 #include "base/files/file_path.h"
 #include "base/macros.h"
 #include "chrome/browser/renderer_context_menu/render_view_context_menu.h"
@@ -34,20 +36,21 @@
   // This is a lightweight method to create a test RenderViewContextMenu
   // instance.
   // Use the constructor if you want to create menu with fine-grained params.
-  static TestRenderViewContextMenu* Create(content::WebContents* web_contents,
-                                           const GURL& page_url,
-                                           const GURL& link_url,
-                                           const GURL& frame_url);
+  static std::unique_ptr<TestRenderViewContextMenu> Create(
+      content::WebContents* web_contents,
+      const GURL& page_url,
+      const GURL& link_url,
+      const GURL& frame_url);
 
   // Returns true if the command specified by |command_id| is present
   // in the menu.
   // A list of command ids can be found in chrome/app/chrome_command_ids.h.
-  bool IsItemPresent(int command_id);
+  bool IsItemPresent(int command_id) const;
 
   // Returns true if a command specified by any command id between
   // |command_id_first| and |command_id_last| (inclusive) is present in the
   // menu.
-  bool IsItemInRangePresent(int command_id_first, int command_id_last);
+  bool IsItemInRangePresent(int command_id_first, int command_id_last) const;
 
   // Searches for an menu item with |command_id|. If it's found, the return
   // value is true and the model and index where it appears in that model are
@@ -57,7 +60,7 @@
                                 int* found_index);
 
   // Returns the command id of the menu item with the specified |path|.
-  int GetCommandIDByProfilePath(const base::FilePath& path);
+  int GetCommandIDByProfilePath(const base::FilePath& path) const;
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
   extensions::ContextMenuMatcher& extension_items() { return extension_items_; }
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
index 5f9fdf29..f6b4d1bc 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
@@ -89,8 +89,8 @@
     ProtocolHandlerRegistry* registry) {
   content::ContextMenuParams params = CreateParams(MenuItem::LINK);
   params.unfiltered_link_url = params.link_url;
-  std::unique_ptr<TestRenderViewContextMenu> menu(
-      new TestRenderViewContextMenu(web_contents->GetMainFrame(), params));
+  auto menu = base::MakeUnique<TestRenderViewContextMenu>(
+      web_contents->GetMainFrame(), params);
   menu->set_protocol_handler_registry(registry);
   menu->Init();
   return menu;
@@ -317,7 +317,7 @@
   void SetUp() override {
     RenderViewContextMenuTest::SetUp();
     // TestingProfile does not provide a protocol registry.
-    registry_.reset(new ProtocolHandlerRegistry(profile(), nullptr));
+    registry_ = base::MakeUnique<ProtocolHandlerRegistry>(profile(), nullptr);
   }
 
   void TearDown() override {
@@ -376,7 +376,7 @@
 
   void SetUp() override {
     ChromeRenderViewHostTestHarness::SetUp();
-    registry_.reset(new ProtocolHandlerRegistry(profile(), nullptr));
+    registry_ = base::MakeUnique<ProtocolHandlerRegistry>(profile(), nullptr);
   }
 
   void TearDown() override {
@@ -393,8 +393,8 @@
   std::unique_ptr<TestRenderViewContextMenu> CreateContextMenuOnChromeLink() {
     content::ContextMenuParams params = CreateParams(MenuItem::LINK);
     params.unfiltered_link_url = params.link_url = GURL("chrome://settings");
-    std::unique_ptr<TestRenderViewContextMenu> menu(
-        new TestRenderViewContextMenu(web_contents()->GetMainFrame(), params));
+    auto menu = base::MakeUnique<TestRenderViewContextMenu>(
+        web_contents()->GetMainFrame(), params);
     menu->set_protocol_handler_registry(registry_.get());
     menu->Init();
     return menu;
@@ -501,9 +501,8 @@
 
   content::ContextMenuParams params = CreateParams(MenuItem::IMAGE);
   params.unfiltered_link_url = params.link_url;
-  content::WebContents* wc = web_contents();
-  std::unique_ptr<TestRenderViewContextMenu> menu(
-      new TestRenderViewContextMenu(wc->GetMainFrame(), params));
+  auto menu = base::MakeUnique<TestRenderViewContextMenu>(
+      web_contents()->GetMainFrame(), params);
 
   menu->ExecuteCommand(IDC_CONTENT_CONTEXT_SAVEIMAGEAS, 0);
 
@@ -523,9 +522,8 @@
 
   content::ContextMenuParams params = CreateParams(MenuItem::IMAGE);
   params.unfiltered_link_url = params.link_url;
-  content::WebContents* wc = web_contents();
-  std::unique_ptr<TestRenderViewContextMenu> menu(
-      new TestRenderViewContextMenu(wc->GetMainFrame(), params));
+  auto menu = base::MakeUnique<TestRenderViewContextMenu>(
+      web_contents()->GetMainFrame(), params);
 
   menu->ExecuteCommand(IDC_CONTENT_CONTEXT_SAVEIMAGEAS, 0);
 
@@ -547,9 +545,8 @@
       data_reduction_proxy::chrome_proxy_content_transform_header()] =
           data_reduction_proxy::empty_image_directive();
   params.unfiltered_link_url = params.link_url;
-  content::WebContents* wc = web_contents();
-  std::unique_ptr<TestRenderViewContextMenu> menu(
-      new TestRenderViewContextMenu(wc->GetMainFrame(), params));
+  auto menu = base::MakeUnique<TestRenderViewContextMenu>(
+      web_contents()->GetMainFrame(), params);
   AppendImageItems(menu.get());
 
   ASSERT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_LOAD_ORIGINAL_IMAGE));
diff --git a/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc b/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc
index 736216a..ff5c0806 100644
--- a/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc
+++ b/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc
@@ -26,7 +26,7 @@
 #include "content/public/test/text_input_test_utils.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
-#include "ui/base/ime/composition_underline.h"
+#include "ui/base/ime/ime_text_span.h"
 #include "ui/base/ime/text_edit_commands.h"
 #include "ui/base/ime/text_input_client.h"
 #include "ui/base/ime/text_input_mode.h"
@@ -820,8 +820,8 @@
     // Commit some text for this frame.
     content::SendImeCommitTextToWidget(
         frames[index]->GetView()->GetRenderWidgetHost(),
-        base::UTF8ToUTF16(sample_text[index]),
-        std::vector<ui::CompositionUnderline>(), gfx::Range(), 0);
+        base::UTF8ToUTF16(sample_text[index]), std::vector<ui::ImeTextSpan>(),
+        gfx::Range(), 0);
 
     // Verify that the text we committed is now selected by listening to a
     // selection update from a RenderWidgetHostView which has the expected
diff --git a/chrome/browser/resource_coordinator/tab_manager.cc b/chrome/browser/resource_coordinator/tab_manager.cc
index cac302a..bec1740 100644
--- a/chrome/browser/resource_coordinator/tab_manager.cc
+++ b/chrome/browser/resource_coordinator/tab_manager.cc
@@ -602,6 +602,25 @@
   return GetWebContentsData(web_contents)->is_restored_in_foreground();
 }
 
+bool TabManager::IsLoadingBackgroundTabs() const {
+  if (IsSessionRestoreLoadingTabs())
+    return false;
+
+  if (!pending_navigations_.empty())
+    return true;
+
+  // Excluding session restore above leaves only background opening tabs in
+  // |loading_contents_|. As long as they still remain in background, we are
+  // still loading background tabs, even after we emptied our pending navigation
+  // list.
+  for (const content::WebContents* tab : loading_contents_) {
+    if (!tab->IsVisible())
+      return true;
+  }
+
+  return false;
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 // TabManager, private:
 
@@ -1132,7 +1151,9 @@
 content::NavigationThrottle::ThrottleCheckResult
 TabManager::MaybeThrottleNavigation(BackgroundTabNavigationThrottle* throttle) {
   content::NavigationHandle* navigation_handle = throttle->navigation_handle();
-  if (CanLoadNextTab()) {
+  if (!base::FeatureList::IsEnabled(
+          features::kStaggeredBackgroundTabOpenExperiment) ||
+      CanLoadNextTab()) {
     loading_contents_.insert(navigation_handle->GetWebContents());
     return content::NavigationThrottle::PROCEED;
   }
diff --git a/chrome/browser/resource_coordinator/tab_manager.h b/chrome/browser/resource_coordinator/tab_manager.h
index 5a74ffc1..f2531898 100644
--- a/chrome/browser/resource_coordinator/tab_manager.h
+++ b/chrome/browser/resource_coordinator/tab_manager.h
@@ -226,6 +226,11 @@
   // foreground.
   bool IsTabRestoredInForeground(content::WebContents* web_contents) const;
 
+  // Returns whether the tab manager is currently loading background tabs. This
+  // always returns false during an ongoing session restore, even if background
+  // tabs are being loaded, in order to separate the two activities.
+  bool IsLoadingBackgroundTabs() const;
+
  private:
   FRIEND_TEST_ALL_PREFIXES(TabManagerTest, PurgeBackgroundRenderer);
   FRIEND_TEST_ALL_PREFIXES(TabManagerTest, ActivateTabResetPurgeState);
@@ -257,6 +262,9 @@
   FRIEND_TEST_ALL_PREFIXES(TabManagerTest, BackgroundTabLoadingMode);
   FRIEND_TEST_ALL_PREFIXES(TabManagerTest, BackgroundTabLoadingSlots);
   FRIEND_TEST_ALL_PREFIXES(TabManagerTest, BackgroundTabsLoadingOrdering);
+  FRIEND_TEST_ALL_PREFIXES(TabManagerTest, IsLoadingBackgroundTabs);
+  FRIEND_TEST_ALL_PREFIXES(TabManagerWithExperimentDisabledTest,
+                           IsLoadingBackgroundTabs);
   FRIEND_TEST_ALL_PREFIXES(TabManagerStatsCollectorTest,
                            HistogramsSessionRestoreSwitchToTab);
   FRIEND_TEST_ALL_PREFIXES(TabManagerTest,
diff --git a/chrome/browser/resource_coordinator/tab_manager_unittest.cc b/chrome/browser/resource_coordinator/tab_manager_unittest.cc
index 2a0d49f8..cce45cc2 100644
--- a/chrome/browser/resource_coordinator/tab_manager_unittest.cc
+++ b/chrome/browser/resource_coordinator/tab_manager_unittest.cc
@@ -15,6 +15,7 @@
 #include "base/metrics/field_trial.h"
 #include "base/strings/string16.h"
 #include "base/test/mock_entropy_provider.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/simple_test_tick_clock.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -152,6 +153,10 @@
     contents2_ = nav_handle2_->GetWebContents();
     contents3_ = nav_handle3_->GetWebContents();
 
+    contents1_->WasShown();
+    contents2_->WasHidden();
+    contents3_->WasHidden();
+
     throttle1_ = base::MakeUnique<NonResumingBackgroundTabNavigationThrottle>(
         nav_handle1_.get());
     throttle2_ = base::MakeUnique<NonResumingBackgroundTabNavigationThrottle>(
@@ -166,6 +171,14 @@
     NavigationThrottle::ThrottleCheckResult result3 =
         tab_manager->MaybeThrottleNavigation(throttle3_.get());
 
+    CheckThrottleResults(result1, result2, result3, loading_slots);
+  }
+
+  virtual void CheckThrottleResults(
+      NavigationThrottle::ThrottleCheckResult result1,
+      NavigationThrottle::ThrottleCheckResult result2,
+      NavigationThrottle::ThrottleCheckResult result3,
+      size_t loading_slots) {
     // First tab starts navigation right away because there is no tab loading.
     EXPECT_EQ(content::NavigationThrottle::PROCEED, result1);
     switch (loading_slots) {
@@ -198,6 +211,27 @@
   WebContents* contents3_;
 };
 
+class TabManagerWithExperimentDisabledTest : public TabManagerTest {
+ public:
+  void SetUp() override {
+    scoped_feature_list_.InitAndDisableFeature(
+        features::kStaggeredBackgroundTabOpenExperiment);
+    ChromeRenderViewHostTestHarness::SetUp();
+  }
+
+  void CheckThrottleResults(NavigationThrottle::ThrottleCheckResult result1,
+                            NavigationThrottle::ThrottleCheckResult result2,
+                            NavigationThrottle::ThrottleCheckResult result3,
+                            size_t loading_slots) override {
+    EXPECT_EQ(content::NavigationThrottle::PROCEED, result1);
+    EXPECT_EQ(content::NavigationThrottle::PROCEED, result2);
+    EXPECT_EQ(content::NavigationThrottle::PROCEED, result3);
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
 // TODO(georgesak): Add tests for protection to tabs with form input and
 // playing audio;
 
@@ -976,6 +1010,81 @@
   EXPECT_FALSE(tab_manager->IsNavigationDelayedForTest(nav_handle3_.get()));
 }
 
+TEST_F(TabManagerTest, IsLoadingBackgroundTabs) {
+  TabManager* tab_manager = g_browser_process->GetTabManager();
+  tab_manager->ResetMemoryPressureListenerForTest();
+  EXPECT_FALSE(tab_manager->IsLoadingBackgroundTabs());
+
+  MaybeThrottleNavigations(tab_manager);
+  tab_manager->GetWebContentsData(contents1_)
+      ->DidStartNavigation(nav_handle1_.get());
+  EXPECT_TRUE(tab_manager->IsLoadingBackgroundTabs());
+
+  tab_manager->GetWebContentsData(contents1_)->DidStopLoading();
+  EXPECT_TRUE(tab_manager->IsLoadingBackgroundTabs());
+
+  tab_manager->GetWebContentsData(contents2_)->DidStopLoading();
+  EXPECT_TRUE(tab_manager->IsLoadingBackgroundTabs());
+
+  contents3_->WasShown();
+  EXPECT_FALSE(tab_manager->IsLoadingBackgroundTabs());
+
+  contents3_->WasHidden();
+  EXPECT_TRUE(tab_manager->IsLoadingBackgroundTabs());
+
+  tab_manager->GetWebContentsData(contents3_)->DidStopLoading();
+  EXPECT_FALSE(tab_manager->IsLoadingBackgroundTabs());
+}
+
+TEST_F(TabManagerWithExperimentDisabledTest, IsLoadingBackgroundTabs) {
+  EXPECT_FALSE(base::FeatureList::IsEnabled(
+      features::kStaggeredBackgroundTabOpenExperiment));
+
+  TabManager* tab_manager = g_browser_process->GetTabManager();
+  tab_manager->ResetMemoryPressureListenerForTest();
+  EXPECT_FALSE(tab_manager->IsLoadingBackgroundTabs());
+
+  MaybeThrottleNavigations(tab_manager);
+  tab_manager->GetWebContentsData(contents1_)
+      ->DidStartNavigation(nav_handle1_.get());
+  tab_manager->GetWebContentsData(contents2_)
+      ->DidStartNavigation(nav_handle1_.get());
+  tab_manager->GetWebContentsData(contents3_)
+      ->DidStartNavigation(nav_handle1_.get());
+
+  EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents1_));
+  EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents2_));
+  EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents3_));
+  EXPECT_FALSE(tab_manager->IsNavigationDelayedForTest(nav_handle1_.get()));
+  EXPECT_FALSE(tab_manager->IsNavigationDelayedForTest(nav_handle2_.get()));
+  EXPECT_FALSE(tab_manager->IsNavigationDelayedForTest(nav_handle3_.get()));
+  EXPECT_TRUE(tab_manager->IsLoadingBackgroundTabs());
+
+  tab_manager->GetWebContentsData(contents1_)->DidStopLoading();
+  EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents1_));
+  EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents2_));
+  EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents3_));
+  EXPECT_TRUE(tab_manager->IsLoadingBackgroundTabs());
+
+  tab_manager->GetWebContentsData(contents2_)->DidStopLoading();
+  EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents1_));
+  EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents2_));
+  EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents3_));
+  EXPECT_TRUE(tab_manager->IsLoadingBackgroundTabs());
+
+  contents3_->WasShown();
+  EXPECT_FALSE(tab_manager->IsLoadingBackgroundTabs());
+
+  contents3_->WasHidden();
+  EXPECT_TRUE(tab_manager->IsLoadingBackgroundTabs());
+
+  tab_manager->GetWebContentsData(contents3_)->DidStopLoading();
+  EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents1_));
+  EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents2_));
+  EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents3_));
+  EXPECT_FALSE(tab_manager->IsLoadingBackgroundTabs());
+}
+
 TEST_F(TabManagerTest, IsTabRestoredInForeground) {
   TabManager* tab_manager = g_browser_process->GetTabManager();
 
diff --git a/chrome/browser/resources/chromeos/login/images/1x/updating_1x.png b/chrome/browser/resources/chromeos/login/images/1x/updating_1x.png
new file mode 100644
index 0000000..758e0e35
--- /dev/null
+++ b/chrome/browser/resources/chromeos/login/images/1x/updating_1x.png
Binary files differ
diff --git a/chrome/browser/resources/chromeos/login/images/2x/updating_2x.png b/chrome/browser/resources/chromeos/login/images/2x/updating_2x.png
new file mode 100644
index 0000000..da1f440
--- /dev/null
+++ b/chrome/browser/resources/chromeos/login/images/2x/updating_2x.png
Binary files differ
diff --git a/chrome/browser/resources/chromeos/login/md_header_bar.js b/chrome/browser/resources/chromeos/login/md_header_bar.js
index 927d568..67ba4cca 100644
--- a/chrome/browser/resources/chromeos/login/md_header_bar.js
+++ b/chrome/browser/resources/chromeos/login/md_header_bar.js
@@ -8,6 +8,16 @@
 
 cr.define('login', function() {
   /**
+   * Enum for user actions taken from lock screen header while a lock screen
+   * app is in background.
+   * @enum {string}
+   */
+  var LOCK_SCREEN_APPS_UNLOCK_ACTION = {
+    SIGN_OUT: 'LOCK_SCREEN_APPS_UNLOCK_ACTION.SIGN_OUT',
+    SHUTDOWN: 'LOCK_SCREEN_APPS_UNLOCK_ACTION.SHUTDOWN'
+  };
+
+  /**
    * Creates a header bar element.
    *
    * @constructor
@@ -50,11 +60,13 @@
     decorate: function() {
       document.addEventListener('click', this.handleClick_.bind(this));
       $('shutdown-header-bar-item')
-          .addEventListener('click', this.handleShutdownClick_);
-      $('shutdown-button').addEventListener('click', this.handleShutdownClick_);
+          .addEventListener('click', this.handleShutdownClick_.bind(this));
+      $('shutdown-button')
+          .addEventListener('click', this.handleShutdownClick_.bind(this));
       $('restart-header-bar-item')
-          .addEventListener('click', this.handleShutdownClick_);
-      $('restart-button').addEventListener('click', this.handleShutdownClick_);
+          .addEventListener('click', this.handleShutdownClick_.bind(this));
+      $('restart-button')
+          .addEventListener('click', this.handleShutdownClick_.bind(this));
       $('add-user-button').addEventListener('click', this.handleAddUserClick_);
       $('more-settings-button')
           .addEventListener('click', this.handleMoreSettingsClick_.bind(this));
@@ -62,7 +74,7 @@
           .addEventListener('click', this.handleGuestClick_);
       $('guest-user-button').addEventListener('click', this.handleGuestClick_);
       $('sign-out-user-button')
-          .addEventListener('click', this.handleSignoutClick_);
+          .addEventListener('click', this.handleSignoutClick_.bind(this));
       $('cancel-multiple-sign-in-button')
           .addEventListener('click', this.handleCancelMultipleSignInClick_);
       $('unlock-user-button')
@@ -184,6 +196,12 @@
      */
     handleSignoutClick_: function(e) {
       this.disabled = true;
+      if (this.lockScreenAppsState_ == LOCK_SCREEN_APPS_STATE.BACKGROUND) {
+        chrome.send(
+            'recordLockScreenAppUnlockAction',
+            [LOCK_SCREEN_APPS_UNLOCK_ACTION.SIGN_OUT]);
+      }
+
       chrome.send('signOutUser');
       e.stopPropagation();
     },
@@ -194,6 +212,11 @@
      * @private
      */
     handleShutdownClick_: function(e) {
+      if (this.lockScreenAppsState_ == LOCK_SCREEN_APPS_STATE.BACKGROUND) {
+        chrome.send(
+            'recordLockScreenAppUnlockAction',
+            [LOCK_SCREEN_APPS_UNLOCK_ACTION.SHUTDOWN]);
+      }
       chrome.send('shutdownSystem');
       e.stopPropagation();
     },
diff --git a/chrome/browser/resources/chromeos/login/md_top_header_bar.html b/chrome/browser/resources/chromeos/login/md_top_header_bar.html
index 0fc2608..056bc034 100644
--- a/chrome/browser/resources/chromeos/login/md_top_header_bar.html
+++ b/chrome/browser/resources/chromeos/login/md_top_header_bar.html
@@ -3,7 +3,7 @@
     <defs>
       <g id="action-icon" fill="none" fill-rule="evenodd">
         <path d="M0 0h16v16H0"></path>
-        <path fill="#FFF" fill-rule="nonzero" d="M9.333 1.333H4c-.737 0-1.327.597-1.327 1.334l-.006 10.666c0 .737.59 1.334 1.326 1.334H12c.737 0 1.333-.597 1.333-1.334v-8l-4-4zm1.334 9.334h-2v2H7.333v-2h-2V9.333h2v-2h1.334v2h2v1.334zM8.667 6V2.333L12.333 6H8.667z"></path>
+        <path fill="#FFF" fill-rule="nonzero" d="M8.993 1.007h-4.67c-.734 0-1.327.6-1.327 1.333L2.99 13.69c0 .734.592 1.31 1.326 1.31h7.362c.733 0 1.333-.576 1.333-1.31V4.984L8.994 1.007zM9 6V2.535L12.542 6H9z"></path>
       </g>
     </defs>
   </svg>
diff --git a/chrome/browser/resources/chromeos/login/md_top_header_bar.js b/chrome/browser/resources/chromeos/login/md_top_header_bar.js
index 7108c2e..3a11efa1 100644
--- a/chrome/browser/resources/chromeos/login/md_top_header_bar.js
+++ b/chrome/browser/resources/chromeos/login/md_top_header_bar.js
@@ -11,6 +11,15 @@
  */
 
 cr.define('login', function() {
+  /**
+   * The new note request type.
+   * @enum {string}
+   */
+  var NEW_NOTE_REQUEST = {
+    TAP: 'NEW_NOTE_REQUEST.TAP',
+    SWIPE: 'NEW_NOTE_REQUEST.SWIPE',
+    KEYBOARD: 'NEW_NOTE_REQUEST.KEYBOARD'
+  };
 
   /**
    * Calculates diagonal length of a rectangle with the provided sides.
@@ -349,7 +358,7 @@
     /** override */
     decorate: function() {
       $('new-note-action')
-          .addEventListener('click', this.activateNoteAction_.bind(this));
+          .addEventListener('click', this.handleNewNoteActionClick_.bind(this));
       $('new-note-action')
           .addEventListener(
               'keydown', this.handleNewNoteActionKeyDown_.bind(this));
@@ -416,6 +425,14 @@
     },
 
     /**
+     * Handler for clicks on note action element.
+     * @private
+     */
+    handleNewNoteActionClick_: function() {
+      this.activateNoteAction_(NEW_NOTE_REQUEST.TAP);
+    },
+
+    /**
      * Handler for key down event.
      * @param {!KeyboardEvent} evt The key down event.
      * @private
@@ -423,7 +440,7 @@
     handleNewNoteActionKeyDown_: function(evt) {
       if (evt.code != 'Enter')
         return;
-      this.activateNoteAction_();
+      this.activateNoteAction_(NEW_NOTE_REQUEST.KEYBOARD);
     },
 
     /**
@@ -442,13 +459,15 @@
       if (diag(velocity.x, velocity.y) < MIN_SWIPE_VELOCITY)
         return;
 
-      this.activateNoteAction_();
+      this.activateNoteAction_(NEW_NOTE_REQUEST.SWIPE);
     },
 
     /**
+     * @param {!NEW_NOTE_REQUEST} requestType The type of request that triggered
+     *      new note action.
      * @private
      */
-    activateNoteAction_: function() {
+    activateNoteAction_: function(requestType) {
       $('new-note-action').classList.toggle('disabled', true);
       $('new-note-action-icon').hidden = true;
       $('top-header-bar').classList.toggle('version-labels-unset', true);
@@ -457,9 +476,7 @@
           (function() {
             if (this.lockScreenAppsState_ != LOCK_SCREEN_APPS_STATE.AVAILABLE)
               return;
-            chrome.send(
-                'setLockScreenAppsState',
-                [LOCK_SCREEN_APPS_STATE.LAUNCH_REQUESTED]);
+            chrome.send('requestNewLockScreenNote', [requestType]);
           }).bind(this));
 
       var container = $('new-note-action-container');
diff --git a/chrome/browser/resources/chromeos/login/oobe_change_picture.html b/chrome/browser/resources/chromeos/login/oobe_change_picture.html
index 89ff91b0..c2fc0ad0 100644
--- a/chrome/browser/resources/chromeos/login/oobe_change_picture.html
+++ b/chrome/browser/resources/chromeos/login/oobe_change_picture.html
@@ -26,7 +26,8 @@
         --cr-picture-image-size: 192px;
         -webkit-margin-end: 28px;
         flex-shrink: 0;
-        margin-top: 48px;
+        height: 288px;
+        position: relative;
         width: 288px;
       }
 
diff --git a/chrome/browser/resources/chromeos/login/oobe_update.css b/chrome/browser/resources/chromeos/login/oobe_update.css
index d85623c8..f90d743 100644
--- a/chrome/browser/resources/chromeos/login/oobe_update.css
+++ b/chrome/browser/resources/chromeos/login/oobe_update.css
@@ -20,6 +20,10 @@
   padding: 0;
 }
 
+.update-illustration {
+  padding-bottom: 10px;
+}
+
 paper-progress {
   --paper-progress-active-color: var(--google-blue-500);
   --paper-progress-secondary-color: var(--google-blue-100);
diff --git a/chrome/browser/resources/chromeos/login/oobe_update.html b/chrome/browser/resources/chromeos/login/oobe_update.html
index c0909abe..ee2328e 100644
--- a/chrome/browser/resources/chromeos/login/oobe_update.html
+++ b/chrome/browser/resources/chromeos/login/oobe_update.html
@@ -38,6 +38,10 @@
       </div>
       <div class="footer flex layout vertical">
         <paper-progress id="checking-progress" indeterminate></paper-progress>
+        <div class="flex"></div>
+        <img class="update-illustration"
+            srcset="images/1x/updating_1x.png 1x,
+                    images/2x/updating_2x.png 2x">
       </div>
     </oobe-dialog>
     <oobe-dialog hidden="[[checkingForUpdate]]" tabindex="0"
@@ -58,6 +62,10 @@
             hidden="[[!estimatedTimeLeftShown]]">[[estimatedTimeLeft]]</div>
         <div id="progress-message" class="progress-message"
             hidden="[[!progressMessageShown]]">[[progressMessage]]</div>
+        <div class="flex"></div>
+        <img class="update-illustration"
+            srcset="images/1x/updating_1x.png 1x,
+                    images/2x/updating_2x.png 2x">
       </div>
     </oobe-dialog>
   </template>
diff --git a/chrome/browser/resources/chromeos/login/screen_error_message.css b/chrome/browser/resources/chromeos/login/screen_error_message.css
index b85da668..8b6db95 100644
--- a/chrome/browser/resources/chromeos/login/screen_error_message.css
+++ b/chrome/browser/resources/chromeos/login/screen_error_message.css
@@ -42,10 +42,6 @@
   display: block;
 }
 
-#oobe.error-message #step-logo {
-  z-index: 1;
-}
-
 .error-header {
   background-clip: padding-box;
   background-color: white;
diff --git a/chrome/browser/resources/chromeos/login/screen_error_message.html b/chrome/browser/resources/chromeos/login/screen_error_message.html
index ec7fd9c..43047ec 100644
--- a/chrome/browser/resources/chromeos/login/screen_error_message.html
+++ b/chrome/browser/resources/chromeos/login/screen_error_message.html
@@ -1,6 +1,6 @@
 <link rel="import" href="chrome://oobe/custom_elements.html">
 
-<div id="error-message" class="step hidden show-offline-error" hidden>
+<div id="error-message" class="step hidden show-offline-error no-logo" hidden>
   <div class="step-contents">
     <div class="error-header" aria-live="assertive">
       <img alt class="error-icon" src="chrome://theme/IDR_ERROR_NETWORK_OFFLINE">
diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
index 4040aca7..fd94782 100644
--- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
+++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
@@ -664,7 +664,8 @@
           (this.screenMode_ == ScreenMode.SAML_INTERSTITIAL);
       params.menuGuestMode = data.guestSignin;
       params.menuKeyboardOptions = false;
-      params.menuEnterpriseEnrollment = true;
+      params.menuEnterpriseEnrollment =
+          !(data.enterpriseManagedDevice || data.hasDeviceOwner);
 
       this.gaiaAuthParams_ = params;
 
diff --git a/chrome/browser/resources/md_bookmarks/BUILD.gn b/chrome/browser/resources/md_bookmarks/BUILD.gn
index e0b81a21e..16e7498 100644
--- a/chrome/browser/resources/md_bookmarks/BUILD.gn
+++ b/chrome/browser/resources/md_bookmarks/BUILD.gn
@@ -1,22 +1,12 @@
 import("../vulcanize.gni")
 
-vulcanized_unbuilt = "vulcanized.unbuilt.html"
-
-vulcanize("vulcanize") {
+vulcanize("build") {
   host = "bookmarks"
   html_in_files = [ "bookmarks.html" ]
-  html_out_files = [ vulcanized_unbuilt ]
+  html_out_files = [ "vulcanized.html" ]
 
   input = rebase_path(".", root_build_dir)
   js_out_files = [ "crisper.js" ]
 
   deps = []
 }
-
-polymer_css_build("build") {
-  input_files = [ vulcanized_unbuilt ]
-  output_files = [ "vulcanized.html" ]
-  deps = [
-    ":vulcanize",
-  ]
-}
diff --git a/chrome/browser/resources/md_downloads/BUILD.gn b/chrome/browser/resources/md_downloads/BUILD.gn
index 923b8e8..1b340e3 100644
--- a/chrome/browser/resources/md_downloads/BUILD.gn
+++ b/chrome/browser/resources/md_downloads/BUILD.gn
@@ -1,21 +1,11 @@
 import("../vulcanize.gni")
 
-vulcanized_unbuilt = "vulcanized.unbuilt.html"
-
-vulcanize("vulcanize") {
+vulcanize("build") {
   deps = []
   host = "downloads"
   html_in_files = [ "downloads.html" ]
-  html_out_files = [ vulcanized_unbuilt ]
+  html_out_files = [ "vulcanized.html" ]
   input = rebase_path(".", root_build_dir)
   insert_in_head = "<base href=chrome://downloads>"
   js_out_files = [ "crisper.js" ]
 }
-
-polymer_css_build("build") {
-  input_files = [ vulcanized_unbuilt ]
-  output_files = [ "vulcanized.html" ]
-  deps = [
-    ":vulcanize",
-  ]
-}
diff --git a/chrome/browser/resources/md_history/BUILD.gn b/chrome/browser/resources/md_history/BUILD.gn
index f6ab0e0..2625f11 100644
--- a/chrome/browser/resources/md_history/BUILD.gn
+++ b/chrome/browser/resources/md_history/BUILD.gn
@@ -1,17 +1,14 @@
 import("../vulcanize.gni")
 
-app_unbuilt = "app.vulcanized.unbuilt.html"
-lazy_load_unbuilt = "lazy_load.vulcanized.unbuilt.html"
-
-vulcanize("vulcanize_app") {
+vulcanize("build") {
   host = "history"
   html_in_files = [
     "app.html",
     "lazy_load.html",
   ]
   html_out_files = [
-    app_unbuilt,
-    lazy_load_unbuilt,
+    "app.vulcanized.html",
+    "lazy_load.vulcanized.html",
   ]
 
   input = rebase_path(".", root_build_dir)
@@ -27,17 +24,3 @@
 
   deps = []
 }
-
-polymer_css_build("build") {
-  input_files = [
-    app_unbuilt,
-    lazy_load_unbuilt,
-  ]
-  output_files = [
-    "app.vulcanized.html",
-    "lazy_load.vulcanized.html",
-  ]
-  deps = [
-    ":vulcanize_app",
-  ]
-}
diff --git a/chrome/browser/resources/media_router/elements/route_controls/route_controls.html b/chrome/browser/resources/media_router/elements/route_controls/route_controls.html
index 3f0ae9c4..0885042 100644
--- a/chrome/browser/resources/media_router/elements/route_controls/route_controls.html
+++ b/chrome/browser/resources/media_router/elements/route_controls/route_controls.html
@@ -17,6 +17,7 @@
       <div>
         <div id="route-time-controls" hidden="[[!routeStatus.canSeek]]">
           <paper-slider
+              aria-valuetext$="[[getTimeSliderValueText_(displayedCurrentTime_)]]"
               dir="ltr"
               id="route-time-slider"
               on-change="onSeekComplete_"
@@ -25,10 +26,12 @@
               title="[[i18n('seekTitle')]]"
               value="[[displayedCurrentTime_]]"></paper-slider>
           <div id="timeline">
-            <span id="current-time">
+            <span id="current-time"
+                  aria-label$="[[getCurrentTimeLabel_(displayedCurrentTime_)]]">
               [[getFormattedTime_(displayedCurrentTime_)]]
             </span>
-            <span id="duration">
+            <span id="duration"
+                  aria-label$="[[getDurationLabel_(routeStatus.duration)]]">
               [[getFormattedTime_(routeStatus.duration)]]
             </span>
           </div>
diff --git a/chrome/browser/resources/media_router/elements/route_controls/route_controls.js b/chrome/browser/resources/media_router/elements/route_controls/route_controls.js
index 7dde729..510ac91d 100644
--- a/chrome/browser/resources/media_router/elements/route_controls/route_controls.js
+++ b/chrome/browser/resources/media_router/elements/route_controls/route_controls.js
@@ -134,6 +134,30 @@
   },
 
   /**
+   * Creates an accessibility label for the element showing the media's current
+   * time.
+   * @param {number} displayedCurrentTime
+   * @return {string}
+   * @private
+   */
+  getCurrentTimeLabel_: function(displayedCurrentTime) {
+    return `${
+              this.i18n('currentTimeLabel')
+            } ${this.getFormattedTime_(displayedCurrentTime)}`;
+  },
+
+  /**
+   * Creates an accessibility label for the element showing the media's
+   * duration.
+   * @param {number} duration
+   * @return {string}
+   * @private
+   */
+  getDurationLabel_: function(duration) {
+    return `${this.i18n('durationLabel')} ${this.getFormattedTime_(duration)}`;
+  },
+
+  /**
    * Converts a number representing an interval of seconds to a string with
    * HH:MM:SS format.
    * @param {number} timeInSec Must be non-negative. Intervals longer than 100
@@ -148,8 +172,9 @@
     var hours = Math.floor(timeInSec / 3600);
     var minutes = Math.floor(timeInSec / 60) % 60;
     var seconds = Math.floor(timeInSec) % 60;
-    return ('0' + hours).substr(-2) + ':' + ('0' + minutes).substr(-2) + ':' +
-        ('0' + seconds).substr(-2);
+    // Show the hours only if it is nonzero.
+    return (hours ? ('0' + hours).substr(-2) + ':' : '') +
+        ('0' + minutes).substr(-2) + ':' + ('0' + seconds).substr(-2);
   },
 
   /**
@@ -194,6 +219,15 @@
         this.i18n('pauseTitle');
   },
 
+  getTimeSliderValueText_: function(displayedCurrentTime) {
+    if (!this.routeStatus) {
+      return '';
+    }
+    return `${
+              this.getFormattedTime_(displayedCurrentTime)
+            } / ${this.getFormattedTime_(this.routeStatus.duration)}`;
+  },
+
   /**
    * Checks whether the media is still playing, and if so, sends a media status
    * update incrementing the current time and schedules another call for a
diff --git a/chrome/browser/resources/polymer_css_build_gn.py b/chrome/browser/resources/polymer_css_build_gn.py
deleted file mode 100755
index 14fe7c5..0000000
--- a/chrome/browser/resources/polymer_css_build_gn.py
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import argparse
-import os
-import sys
-
-_HERE_PATH = os.path.dirname(__file__)
-_SRC_PATH = os.path.normpath(os.path.join(_HERE_PATH, '..', '..', '..'))
-_CWD = os.getcwd()
-
-sys.path.append(os.path.join(_SRC_PATH, 'third_party', 'node'))
-import node
-import node_modules
-
-def _css_build(out_folder, input_files, output_files):
-  out_path = os.path.join(_CWD, out_folder)
-  in_paths = map(lambda f: os.path.join(out_path, f), input_files)
-  out_paths = map(lambda f: os.path.join(out_path, f), output_files)
-
-  args = ['--no-inline-includes', '-f'] + in_paths + ['-o'] + out_paths
-  node.RunNode([node_modules.PathToPolymerCssBuild()] + args)
-
-
-def main():
-  parser = argparse.ArgumentParser()
-  parser.add_argument('--out_folder')
-  parser.add_argument('--input_files', nargs='+')
-  parser.add_argument('--output_files', nargs='+')
-  args = parser.parse_args()
-
-  _css_build(
-      args.out_folder,
-      input_files=args.input_files,
-      output_files=args.output_files)
-
-
-if __name__ == '__main__':
-  main()
diff --git a/chrome/browser/resources/print_preview/settings/scaling_settings.js b/chrome/browser/resources/print_preview/settings/scaling_settings.js
index 99d752c..2db68ad 100644
--- a/chrome/browser/resources/print_preview/settings/scaling_settings.js
+++ b/chrome/browser/resources/print_preview/settings/scaling_settings.js
@@ -121,11 +121,13 @@
 
     /**
      * Display the fit to page scaling in the scaling field if there is a valid
-     * fit to page scaling value. If not, make the field blank.
+     * fit to page scaling value. If not, make the field blank. The fit to page
+     * value is always considered valid, so remove the hint if it is displayed.
      * @private
      */
     displayFitToPageScaling: function() {
       this.inputField_.value = this.fitToPageScaling_ || '';
+      this.removeHint_();
     },
 
     /**
@@ -151,17 +153,24 @@
     },
 
     /**
+     * Removes the error message and red background from the input.
+     * @private
+     */
+    removeHint_: function() {
+      this.inputField_.classList.remove('invalid');
+      fadeOutElement(this.getChildElement('.hint'));
+    },
+
+    /**
      * Updates the state of the scaling settings UI controls.
      * @private
      */
     updateState_: function() {
       if (this.isAvailable()) {
-        var displayedValue = this.getInputAsNumber();
         // If fit to page is selected and the display matches, mark valid
         // and return.
         if (this.isFitToPageSelected() && this.displayMatchesFitToPage()) {
-          this.inputField_.classList.remove('invalid');
-          fadeOutElement(this.getChildElement('.hint'));
+          this.removeHint_();
           this.updateUiStateInternal();
           return;
         }
@@ -174,8 +183,7 @@
         }
 
         this.inputField_.value = this.scalingTicketItem_.getValue();
-        this.inputField_.classList.remove('invalid');
-        fadeOutElement(this.getChildElement('.hint'));
+        this.removeHint_();
       }
       this.updateUiStateInternal();
     },
@@ -191,9 +199,11 @@
         this.displayFitToPageScaling();
       } else if (
           this.fitToPageTicketItem_.isCapabilityAvailable() &&
-          this.displayMatchesFitToPage()) {
+          (this.displayMatchesFitToPage() ||
+           !this.inputField_.validity.valid)) {
         // Fit to page unchecked. Return to last scaling.
         this.inputField_.value = this.scalingTicketItem_.getValue();
+        this.removeHint_();
       }
     },
 
@@ -207,7 +217,8 @@
         this.updateState_();
         return;
       }
-      if (this.isFitToPageSelected() && !this.displayMatchesFitToPage()) {
+      if (this.isFitToPageSelected() && !this.displayMatchesFitToPage() &&
+          this.inputField_.value != '') {
         // User modified value away from fit to page.
         this.fitToPageTicketItem_.updateValue(false);
       }
@@ -262,12 +273,12 @@
       if (this.inputField_.value == '' && this.inputField_.validity.valid) {
         if (this.isFitToPageSelected()) {
           this.displayFitToPageScaling();
+        } else if (this.scalingTicketItem_.getValue() == '100') {
+          // No need to update the ticket, but change the display to match.
+          this.inputField_.value = '100';
+          this.removeHint_();
         } else {
-          if (this.scalingTicketItem_.getValue() == '100')
-            // No need to update the ticket, but change the display to match.
-            this.inputField_.value = '100';
-          else
-            this.scalingTicketItem_.updateValue('100');
+          this.scalingTicketItem_.updateValue('100');
         }
       }
     },
diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resources/settings/BUILD.gn
index 4b7895a..af4bf1d 100644
--- a/chrome/browser/resources/settings/BUILD.gn
+++ b/chrome/browser/resources/settings/BUILD.gn
@@ -2,20 +2,18 @@
 import("//tools/grit/grit_rule.gni")
 import("//chrome/common/features.gni")
 
-app_unbuilt = "vulcanized.unbuilt.html"
-lazy_load_unbuilt = "lazy_load.vulcanized.unbuilt.html"
 settings_pak_file = "settings_resources.pak"
 unpak_folder = "settings_resources.unpak"
 
-vulcanize("vulcanize_app") {
+vulcanize("build") {
   host = "settings"
   html_in_files = [
     "settings.html",
     "lazy_load.html",
   ]
   html_out_files = [
-    app_unbuilt,
-    lazy_load_unbuilt,
+    "vulcanized.html",
+    "lazy_load.vulcanized.html",
   ]
   insert_in_head = "<base href=\"chrome://\$i18n{hostname}\">"
   input = rebase_path("$target_gen_dir/$unpak_folder", root_build_dir)
@@ -38,20 +36,6 @@
   ]
 }
 
-polymer_css_build("build") {
-  input_files = [
-    app_unbuilt,
-    lazy_load_unbuilt,
-  ]
-  output_files = [
-    "vulcanized.html",
-    "lazy_load.vulcanized.html",
-  ]
-  deps = [
-    ":vulcanize_app",
-  ]
-}
-
 grit("flattened_resources") {
   source = "settings_resources.grd"
 
diff --git a/chrome/browser/resources/settings/people_page/change_picture.html b/chrome/browser/resources/settings/people_page/change_picture.html
index 8d0c573..c8e093f38 100644
--- a/chrome/browser/resources/settings/people_page/change_picture.html
+++ b/chrome/browser/resources/settings/people_page/change_picture.html
@@ -30,7 +30,8 @@
         --cr-picture-image-size: 192px;
         -webkit-margin-end: 24px;
         flex-shrink: 0;
-        margin-top: 48px;
+        height: 288px;
+        position: relative;
         width: 288px;
       }
 
diff --git a/chrome/browser/resources/vulcanize_gn.py b/chrome/browser/resources/vulcanize_gn.py
index 5b1d517b..78e37ad 100755
--- a/chrome/browser/resources/vulcanize_gn.py
+++ b/chrome/browser/resources/vulcanize_gn.py
@@ -180,26 +180,33 @@
       f.close()
 
   try:
+    crisper_html_out_paths = []
     for index, html_in_file in enumerate(args.html_in_files):
-      html_out_file = args.html_out_files[index]
+      crisper_html_out_paths.append(
+          os.path.join(tmp_out_dir, args.html_out_files[index]))
       js_out_file = args.js_out_files[index]
 
       # Run crisper to separate the JS from the HTML file.
       node.RunNode([node_modules.PathToCrisper(),
                    '--source', os.path.join(tmp_out_dir, html_in_file),
                    '--script-in-head', 'false',
-                   '--html', os.path.join(tmp_out_dir, html_out_file),
+                   '--html', crisper_html_out_paths[index],
                    '--js', os.path.join(tmp_out_dir, js_out_file)])
 
-      # Move the HTML file to its final destination.
-      shutil.copy(os.path.join(tmp_out_dir, html_out_file), out_path)
-
       # Pass the JS file through Uglify and write the output to its final
       # destination.
       node.RunNode([node_modules.PathToUglify(),
                     os.path.join(tmp_out_dir, js_out_file),
                     '--comments', '"/Copyright|license|LICENSE|\<\/?if/"',
                     '--output', os.path.join(out_path, js_out_file)])
+
+    # Run polymer-css-build and write the output HTML files to their final
+    # destination.
+    pcb_html_out_paths = [
+        os.path.join(out_path, f) for f in args.html_out_files]
+    node.RunNode([node_modules.PathToPolymerCssBuild()] +
+                 ['--no-inline-includes', '-f'] +
+                 crisper_html_out_paths + ['-o'] + pcb_html_out_paths)
   finally:
     shutil.rmtree(tmp_out_dir)
   return manifest_out_path
diff --git a/chrome/browser/safe_browsing/browser_feature_extractor.cc b/chrome/browser/safe_browsing/browser_feature_extractor.cc
index bbabc07..d627b039 100644
--- a/chrome/browser/safe_browsing/browser_feature_extractor.cc
+++ b/chrome/browser/safe_browsing/browser_feature_extractor.cc
@@ -24,7 +24,7 @@
 #include "chrome/browser/safe_browsing/client_side_detection_host.h"
 #include "components/history/core/browser/history_service.h"
 #include "components/history/core/browser/history_types.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/safe_browsing_db/database_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/navigation_controller.h"
diff --git a/chrome/browser/safe_browsing/browser_feature_extractor_unittest.cc b/chrome/browser/safe_browsing/browser_feature_extractor_unittest.cc
index 83958d97..76253cc 100644
--- a/chrome/browser/safe_browsing/browser_feature_extractor_unittest.cc
+++ b/chrome/browser/safe_browsing/browser_feature_extractor_unittest.cc
@@ -24,7 +24,7 @@
 #include "chrome/test/base/testing_profile.h"
 #include "components/history/core/browser/history_backend.h"
 #include "components/history/core/browser/history_service.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/safe_browsing_db/database_manager.h"
 #include "components/safe_browsing_db/test_database_manager.h"
 #include "content/public/browser/navigation_controller.h"
diff --git a/chrome/browser/safe_browsing/client_side_detection_host.cc b/chrome/browser/safe_browsing/client_side_detection_host.cc
index b5ba16f..15d9191 100644
--- a/chrome/browser/safe_browsing/client_side_detection_host.cc
+++ b/chrome/browser/safe_browsing/client_side_detection_host.cc
@@ -23,7 +23,7 @@
 #include "components/prefs/pref_service.h"
 #include "components/safe_browsing/common/safe_browsing_prefs.h"
 #include "components/safe_browsing/common/safebrowsing_messages.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/safe_browsing_db/database_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/navigation_controller.h"
diff --git a/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc b/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc
index 7559c392..4ee5678 100644
--- a/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc
+++ b/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc
@@ -23,7 +23,7 @@
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/safe_browsing/common/safebrowsing_messages.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/safe_browsing_db/database_manager.h"
 #include "components/safe_browsing_db/test_database_manager.h"
 #include "content/public/browser/navigation_entry.h"
diff --git a/chrome/browser/safe_browsing/client_side_detection_service.cc b/chrome/browser/safe_browsing/client_side_detection_service.cc
index 30743b7..4d97ebf9 100644
--- a/chrome/browser/safe_browsing/client_side_detection_service.cc
+++ b/chrome/browser/safe_browsing/client_side_detection_service.cc
@@ -25,7 +25,7 @@
 #include "components/prefs/pref_service.h"
 #include "components/safe_browsing/common/safe_browsing_prefs.h"
 #include "components/safe_browsing/common/safebrowsing_messages.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/notification_types.h"
diff --git a/chrome/browser/safe_browsing/client_side_detection_service_unittest.cc b/chrome/browser/safe_browsing/client_side_detection_service_unittest.cc
index 62a43d3..ecea7d38 100644
--- a/chrome/browser/safe_browsing/client_side_detection_service_unittest.cc
+++ b/chrome/browser/safe_browsing/client_side_detection_service_unittest.cc
@@ -22,7 +22,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/time/time.h"
 #include "chrome/common/safe_browsing/client_model.pb.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/variations/variations_associated_data.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "crypto/sha2.h"
diff --git a/chrome/browser/safe_browsing/client_side_model_loader.cc b/chrome/browser/safe_browsing/client_side_model_loader.cc
index b598044..c1da018 100644
--- a/chrome/browser/safe_browsing/client_side_model_loader.cc
+++ b/chrome/browser/safe_browsing/client_side_model_loader.cc
@@ -19,7 +19,7 @@
 #include "components/data_use_measurement/core/data_use_user_data.h"
 #include "components/safe_browsing/common/safebrowsing_messages.h"
 #include "components/safe_browsing/common/safebrowsing_switches.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/variations/variations_associated_data.h"
 #include "net/base/load_flags.h"
 #include "net/http/http_response_headers.h"
diff --git a/chrome/browser/safe_browsing/client_side_model_loader_unittest.cc b/chrome/browser/safe_browsing/client_side_model_loader_unittest.cc
index f30d5590..237b83ad 100644
--- a/chrome/browser/safe_browsing/client_side_model_loader_unittest.cc
+++ b/chrome/browser/safe_browsing/client_side_model_loader_unittest.cc
@@ -17,7 +17,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/time/time.h"
 #include "chrome/common/safe_browsing/client_model.pb.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/variations/variations_associated_data.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "net/http/http_status_code.h"
diff --git a/chrome/browser/safe_browsing/download_feedback.cc b/chrome/browser/safe_browsing/download_feedback.cc
index b0be578..08e1563a 100644
--- a/chrome/browser/safe_browsing/download_feedback.cc
+++ b/chrome/browser/safe_browsing/download_feedback.cc
@@ -10,7 +10,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/task_runner.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/browser/browser_thread.h"
 #include "net/base/net_errors.h"
 
diff --git a/chrome/browser/safe_browsing/download_feedback_unittest.cc b/chrome/browser/safe_browsing/download_feedback_unittest.cc
index 8bd291f..301f49b 100644
--- a/chrome/browser/safe_browsing/download_feedback_unittest.cc
+++ b/chrome/browser/safe_browsing/download_feedback_unittest.cc
@@ -12,7 +12,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/task_scheduler/post_task.h"
 #include "chrome/browser/safe_browsing/two_phase_uploader.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "content/public/test/test_utils.h"
diff --git a/chrome/browser/safe_browsing/download_protection_service.cc b/chrome/browser/safe_browsing/download_protection_service.cc
index 82fd1dd..18ecd68 100644
--- a/chrome/browser/safe_browsing/download_protection_service.cc
+++ b/chrome/browser/safe_browsing/download_protection_service.cc
@@ -58,7 +58,7 @@
 #include "components/safe_browsing/common/safe_browsing_prefs.h"
 #include "components/safe_browsing/common/safebrowsing_switches.h"
 #include "components/safe_browsing/common/utils.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/download_item.h"
 #include "content/public/browser/page_navigator.h"
diff --git a/chrome/browser/safe_browsing/download_protection_service_unittest.cc b/chrome/browser/safe_browsing/download_protection_service_unittest.cc
index 39a7ccd..9f88de2 100644
--- a/chrome/browser/safe_browsing/download_protection_service_unittest.cc
+++ b/chrome/browser/safe_browsing/download_protection_service_unittest.cc
@@ -41,7 +41,7 @@
 #include "components/prefs/pref_service.h"
 #include "components/safe_browsing/common/safe_browsing_prefs.h"
 #include "components/safe_browsing/common/safebrowsing_switches.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/safe_browsing_db/database_manager.h"
 #include "components/safe_browsing_db/test_database_manager.h"
 #include "components/safe_browsing_db/v4_protocol_manager_util.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer.cc b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer.cc
index bf35ec2..c78d52f9 100644
--- a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer.cc
@@ -20,7 +20,7 @@
 #include "chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident.h"
 #include "chrome/browser/safe_browsing/incident_reporting/incident_receiver.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 namespace safe_browsing {
 
diff --git a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_mac.cc b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_mac.cc
index 0d619b9e..7f4331e 100644
--- a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_mac.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_mac.cc
@@ -14,7 +14,7 @@
 #include "chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident.h"
 #include "chrome/browser/safe_browsing/incident_reporting/incident_receiver.h"
 #include "chrome/browser/safe_browsing/signature_evaluator_mac.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 namespace safe_browsing {
 
diff --git a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_mac_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_mac_unittest.cc
index a6f371b..01b9e0d5 100644
--- a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_mac_unittest.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_mac_unittest.cc
@@ -16,7 +16,7 @@
 #include "chrome/browser/safe_browsing/incident_reporting/incident.h"
 #include "chrome/browser/safe_browsing/incident_reporting/mock_incident_receiver.h"
 #include "chrome/common/chrome_paths.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_win.cc b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_win.cc
index 3b6e7ca..e05eb2b 100644
--- a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_win.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_win.cc
@@ -18,7 +18,7 @@
 #include "chrome/browser/safe_browsing/incident_reporting/incident_receiver.h"
 #include "chrome/common/chrome_version.h"
 #include "chrome/common/safe_browsing/binary_feature_extractor.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 namespace safe_browsing {
 
diff --git a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_win_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_win_unittest.cc
index 2c17aa4..5c9f26116 100644
--- a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_win_unittest.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_analyzer_win_unittest.cc
@@ -16,7 +16,7 @@
 #include "chrome/browser/safe_browsing/incident_reporting/mock_incident_receiver.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_version.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident.cc b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident.cc
index a914bfba..a20a8e4f 100644
--- a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident.cc
@@ -6,7 +6,7 @@
 
 #include "base/logging.h"
 #include "chrome/browser/safe_browsing/incident_reporting/incident_handler_util.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 namespace safe_browsing {
 
diff --git a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident_unittest.cc
index bb86600..061d7e7 100644
--- a/chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident_unittest.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/binary_integrity_incident_unittest.cc
@@ -11,7 +11,7 @@
 
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/blacklist_load_analyzer_win.cc b/chrome/browser/safe_browsing/incident_reporting/blacklist_load_analyzer_win.cc
index 4349fc84..52be87a0 100644
--- a/chrome/browser/safe_browsing/incident_reporting/blacklist_load_analyzer_win.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/blacklist_load_analyzer_win.cc
@@ -22,7 +22,7 @@
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
 #include "chrome/common/safe_browsing/binary_feature_extractor.h"
 #include "chrome_elf/blacklist/blacklist.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 namespace safe_browsing {
 
diff --git a/chrome/browser/safe_browsing/incident_reporting/blacklist_load_incident.cc b/chrome/browser/safe_browsing/incident_reporting/blacklist_load_incident.cc
index c62e2b6f..b757e746 100644
--- a/chrome/browser/safe_browsing/incident_reporting/blacklist_load_incident.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/blacklist_load_incident.cc
@@ -6,7 +6,7 @@
 
 #include "base/logging.h"
 #include "chrome/browser/safe_browsing/incident_reporting/incident_handler_util.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 namespace safe_browsing {
 
diff --git a/chrome/browser/safe_browsing/incident_reporting/blacklist_load_incident_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/blacklist_load_incident_unittest.cc
index cd88c8c..9f92cf4 100644
--- a/chrome/browser/safe_browsing/incident_reporting/blacklist_load_incident_unittest.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/blacklist_load_incident_unittest.cc
@@ -8,7 +8,7 @@
 #include <utility>
 
 #include "base/memory/ptr_util.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager.cc b/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager.cc
index 53b518d..6c5cd38e 100644
--- a/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager.cc
@@ -22,7 +22,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/task_scheduler/post_task.h"
 #include "base/task_scheduler/task_traits.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/download_item.h"
 
diff --git a/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager_unittest.cc
index 23b85b6..ede70704 100644
--- a/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager_unittest.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager_unittest.cc
@@ -16,7 +16,7 @@
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
 #include "chrome/test/base/testing_profile.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/download_manager.h"
 #include "content/public/test/mock_download_item.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/environment_data_collection.cc b/chrome/browser/safe_browsing/incident_reporting/environment_data_collection.cc
index 06e02ec4..2001009 100644
--- a/chrome/browser/safe_browsing/incident_reporting/environment_data_collection.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/environment_data_collection.cc
@@ -11,7 +11,7 @@
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "chrome/common/channel_info.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/version_info/version_info.h"
 
 namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win.cc b/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win.cc
index ccbd5df..9a7dd8e 100644
--- a/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win.cc
@@ -26,7 +26,7 @@
 #include "chrome/browser/safe_browsing/path_sanitizer.h"
 #include "chrome/common/safe_browsing/binary_feature_extractor.h"
 #include "chrome_elf/chrome_elf_constants.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/variations/variations_associated_data.h"
 
 namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win_unittest.cc
index 2013471..69deb08 100644
--- a/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win_unittest.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/environment_data_collection_win_unittest.cc
@@ -21,7 +21,7 @@
 #include "chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win.h"
 #include "chrome/browser/safe_browsing/path_sanitizer.h"
 #include "chrome_elf/chrome_elf_constants.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "net/base/winsock_init.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/chrome/browser/safe_browsing/incident_reporting/extension_data_collection.cc b/chrome/browser/safe_browsing/incident_reporting/extension_data_collection.cc
index d60f976..6471ded 100644
--- a/chrome/browser/safe_browsing/incident_reporting/extension_data_collection.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/extension_data_collection.cc
@@ -12,7 +12,7 @@
 #include "chrome/browser/extensions/install_signer.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/extension_prefs_factory.h"
 #include "extensions/browser/extension_registry.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/extension_data_collection_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/extension_data_collection_unittest.cc
index 8378b6c..cfd373e 100644
--- a/chrome/browser/safe_browsing/incident_reporting/extension_data_collection_unittest.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/extension_data_collection_unittest.cc
@@ -21,7 +21,7 @@
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/base/testing_profile_manager.h"
 #include "components/safe_browsing/common/safe_browsing_prefs.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "content/public/test/test_utils.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/incident.cc b/chrome/browser/safe_browsing/incident_reporting/incident.cc
index 21d0b1b8..6c9bfc1 100644
--- a/chrome/browser/safe_browsing/incident_reporting/incident.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/incident.cc
@@ -8,7 +8,7 @@
 
 #include "base/logging.h"
 #include "base/time/time.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 namespace safe_browsing {
 
diff --git a/chrome/browser/safe_browsing/incident_reporting/incident_report_uploader_impl.cc b/chrome/browser/safe_browsing/incident_reporting/incident_report_uploader_impl.cc
index 358e0f32..5b344d2 100644
--- a/chrome/browser/safe_browsing/incident_reporting/incident_report_uploader_impl.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/incident_report_uploader_impl.cc
@@ -8,7 +8,7 @@
 
 #include "base/metrics/histogram_macros.h"
 #include "components/data_use_measurement/core/data_use_user_data.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "google_apis/google_api_keys.h"
 #include "net/base/escape.h"
 #include "net/base/load_flags.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/incident_report_uploader_impl_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/incident_report_uploader_impl_unittest.cc
index f50fdc44..6639f0d 100644
--- a/chrome/browser/safe_browsing/incident_reporting/incident_report_uploader_impl_unittest.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/incident_report_uploader_impl_unittest.cc
@@ -8,7 +8,7 @@
 #include <utility>
 
 #include "base/test/test_simple_task_runner.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "net/base/load_flags.h"
 #include "net/http/http_status_code.h"
 #include "net/url_request/test_url_fetcher_factory.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc b/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc
index e95b976..b794818 100644
--- a/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc
@@ -37,7 +37,7 @@
 #include "chrome/common/pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "components/safe_browsing/common/safe_browsing_prefs.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/safe_browsing_db/database_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/notification_service.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service_unittest.cc
index 9d4d540..4f0c73fb 100644
--- a/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service_unittest.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service_unittest.cc
@@ -35,7 +35,7 @@
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/base/testing_profile_manager.h"
 #include "components/safe_browsing/common/safe_browsing_prefs.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "extensions/browser/quota_service.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/last_download_finder.cc b/chrome/browser/safe_browsing/incident_reporting/last_download_finder.cc
index 96d6612a..5d36b8b 100644
--- a/chrome/browser/safe_browsing/incident_reporting/last_download_finder.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/last_download_finder.cc
@@ -28,7 +28,7 @@
 #include "components/history/core/browser/download_constants.h"
 #include "components/history/core/browser/history_service.h"
 #include "components/prefs/pref_service.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/browser/notification_details.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/notification_source.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/last_download_finder_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/last_download_finder_unittest.cc
index d3cf2fd1e..8b031fbe 100644
--- a/chrome/browser/safe_browsing/incident_reporting/last_download_finder_unittest.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/last_download_finder_unittest.cc
@@ -44,7 +44,7 @@
 #include "components/history/core/browser/history_database_params.h"
 #include "components/history/core/browser/history_service.h"
 #include "components/safe_browsing/common/safe_browsing_prefs.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "content/public/test/test_utils.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win.cc b/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win.cc
index c1d99e93..7e24fcc 100644
--- a/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win.cc
@@ -17,7 +17,7 @@
 #include "base/scoped_native_library.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/win/pe_image.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 namespace safe_browsing {
 
diff --git a/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win_unittest.cc
index 9d91af9a..452c520 100644
--- a/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win_unittest.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win_unittest.cc
@@ -21,7 +21,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/win/pe_image.h"
 #include "chrome/browser/safe_browsing/incident_reporting/module_integrity_unittest_util_win.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/module_load_analyzer_win.cc b/chrome/browser/safe_browsing/incident_reporting/module_load_analyzer_win.cc
index eea5a41..de02bf8 100644
--- a/chrome/browser/safe_browsing/incident_reporting/module_load_analyzer_win.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/module_load_analyzer_win.cc
@@ -22,7 +22,7 @@
 #include "chrome/browser/safe_browsing/incident_reporting/suspicious_module_incident.h"
 #include "chrome/browser/safe_browsing/path_sanitizer.h"
 #include "chrome/common/safe_browsing/binary_feature_extractor.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/browser/browser_thread.h"
 
 #if defined(SAFE_BROWSING_DB_LOCAL)
diff --git a/chrome/browser/safe_browsing/incident_reporting/module_load_analyzer_win_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/module_load_analyzer_win_unittest.cc
index 344194f2..56998c2 100644
--- a/chrome/browser/safe_browsing/incident_reporting/module_load_analyzer_win_unittest.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/module_load_analyzer_win_unittest.cc
@@ -15,7 +15,7 @@
 #include "chrome/browser/safe_browsing/incident_reporting/incident.h"
 #include "chrome/browser/safe_browsing/incident_reporting/incident_receiver.h"
 #include "chrome/browser/safe_browsing/incident_reporting/mock_incident_receiver.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/safe_browsing_db/database_manager.h"
 #include "components/safe_browsing_db/test_database_manager.h"
 #include "content/public/test/test_browser_thread_bundle.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate.cc b/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate.cc
index d871351..6bd74eb8 100644
--- a/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate.cc
@@ -12,7 +12,7 @@
 #include "base/memory/ptr_util.h"
 #include "chrome/browser/safe_browsing/incident_reporting/incident_receiver.h"
 #include "chrome/browser/safe_browsing/incident_reporting/tracked_preference_incident.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "services/preferences/public/interfaces/tracked_preference_validation_delegate.mojom.h"
 
 namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate_unittest.cc
index 0aa2d823..0ea185a6 100644
--- a/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate_unittest.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate_unittest.cc
@@ -17,7 +17,7 @@
 #include "base/values.h"
 #include "chrome/browser/safe_browsing/incident_reporting/incident.h"
 #include "chrome/browser/safe_browsing/incident_reporting/mock_incident_receiver.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/chrome/browser/safe_browsing/incident_reporting/resource_request_detector.cc b/chrome/browser/safe_browsing/incident_reporting/resource_request_detector.cc
index 30fed1f..9885c5f 100644
--- a/chrome/browser/safe_browsing/incident_reporting/resource_request_detector.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/resource_request_detector.cc
@@ -10,7 +10,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/safe_browsing/incident_reporting/incident_receiver.h"
 #include "chrome/browser/safe_browsing/incident_reporting/resource_request_incident.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/resource_request_detector_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/resource_request_detector_unittest.cc
index e52c8132..83431bf 100644
--- a/chrome/browser/safe_browsing/incident_reporting/resource_request_detector_unittest.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/resource_request_detector_unittest.cc
@@ -12,7 +12,7 @@
 #include "chrome/browser/safe_browsing/incident_reporting/incident.h"
 #include "chrome/browser/safe_browsing/incident_reporting/incident_receiver.h"
 #include "chrome/browser/safe_browsing/incident_reporting/mock_incident_receiver.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/safe_browsing_db/test_database_manager.h"
 #include "content/public/browser/resource_request_info.h"
 #include "content/public/common/previews_state.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/resource_request_incident.cc b/chrome/browser/safe_browsing/incident_reporting/resource_request_incident.cc
index 109b499..a08df8f 100644
--- a/chrome/browser/safe_browsing/incident_reporting/resource_request_incident.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/resource_request_incident.cc
@@ -6,7 +6,7 @@
 
 #include "base/logging.h"
 #include "chrome/browser/safe_browsing/incident_reporting/incident_handler_util.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 namespace safe_browsing {
 
diff --git a/chrome/browser/safe_browsing/incident_reporting/suspicious_module_incident.cc b/chrome/browser/safe_browsing/incident_reporting/suspicious_module_incident.cc
index 2f5589e..78fcd0a7 100644
--- a/chrome/browser/safe_browsing/incident_reporting/suspicious_module_incident.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/suspicious_module_incident.cc
@@ -6,7 +6,7 @@
 
 #include "base/logging.h"
 #include "chrome/browser/safe_browsing/incident_reporting/incident_handler_util.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 namespace safe_browsing {
 
diff --git a/chrome/browser/safe_browsing/incident_reporting/suspicious_module_incident_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/suspicious_module_incident_unittest.cc
index 27450a5f..04b050b 100644
--- a/chrome/browser/safe_browsing/incident_reporting/suspicious_module_incident_unittest.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/suspicious_module_incident_unittest.cc
@@ -8,7 +8,7 @@
 #include <utility>
 
 #include "base/memory/ptr_util.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/tracked_preference_incident.cc b/chrome/browser/safe_browsing/incident_reporting/tracked_preference_incident.cc
index bc999fe..63ad14c 100644
--- a/chrome/browser/safe_browsing/incident_reporting/tracked_preference_incident.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/tracked_preference_incident.cc
@@ -6,7 +6,7 @@
 
 #include "base/logging.h"
 #include "chrome/browser/safe_browsing/incident_reporting/incident_handler_util.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 namespace safe_browsing {
 
diff --git a/chrome/browser/safe_browsing/incident_reporting/tracked_preference_incident_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/tracked_preference_incident_unittest.cc
index c5a9e335b..1ad07e0b 100644
--- a/chrome/browser/safe_browsing/incident_reporting/tracked_preference_incident_unittest.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/tracked_preference_incident_unittest.cc
@@ -8,7 +8,7 @@
 #include <utility>
 
 #include "base/memory/ptr_util.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_analyzer.cc b/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_analyzer.cc
index c35c1af..842d0d5 100644
--- a/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_analyzer.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_analyzer.cc
@@ -14,7 +14,7 @@
 #include "chrome/browser/safe_browsing/incident_reporting/incident_receiver.h"
 #include "chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_incident.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/variations/service/variations_service.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_incident.cc b/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_incident.cc
index abd66c1..f358d0f 100644
--- a/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_incident.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_incident.cc
@@ -6,7 +6,7 @@
 
 #include "base/logging.h"
 #include "chrome/browser/safe_browsing/incident_reporting/incident_handler_util.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 namespace safe_browsing {
 
diff --git a/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_incident_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_incident_unittest.cc
index 07b0261..46a3f6a 100644
--- a/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_incident_unittest.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/variations_seed_signature_incident_unittest.cc
@@ -8,7 +8,7 @@
 #include <utility>
 
 #include "base/memory/ptr_util.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace safe_browsing {
diff --git a/chrome/browser/safe_browsing/notification_image_reporter.cc b/chrome/browser/safe_browsing/notification_image_reporter.cc
index ae292b09..dcca406 100644
--- a/chrome/browser/safe_browsing/notification_image_reporter.cc
+++ b/chrome/browser/safe_browsing/notification_image_reporter.cc
@@ -19,7 +19,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
 #include "components/safe_browsing/common/safe_browsing_prefs.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/safe_browsing_db/database_manager.h"
 #include "components/variations/variations_associated_data.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/safe_browsing/notification_image_reporter_unittest.cc b/chrome/browser/safe_browsing/notification_image_reporter_unittest.cc
index 5a3774af..5cdb126 100644
--- a/chrome/browser/safe_browsing/notification_image_reporter_unittest.cc
+++ b/chrome/browser/safe_browsing/notification_image_reporter_unittest.cc
@@ -14,7 +14,7 @@
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/safe_browsing/common/safe_browsing_prefs.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/safe_browsing_db/test_database_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/test/test_browser_thread_bundle.h"
diff --git a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.h b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.h
index 473cb52..9767f57 100644
--- a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.h
+++ b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.h
@@ -8,7 +8,7 @@
 #include <deque>
 #include "base/feature_list.h"
 #include "base/supports_user_data.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "third_party/protobuf/src/google/protobuf/repeated_field.h"
 #include "url/gurl.h"
diff --git a/chrome/browser/safe_browsing/signature_evaluator_mac.mm b/chrome/browser/safe_browsing/signature_evaluator_mac.mm
index 9ffcb66..a3d3968 100644
--- a/chrome/browser/safe_browsing/signature_evaluator_mac.mm
+++ b/chrome/browser/safe_browsing/signature_evaluator_mac.mm
@@ -19,7 +19,7 @@
 #include "base/strings/sys_string_conversions.h"
 #include "chrome/common/safe_browsing/binary_feature_extractor.h"
 #include "chrome/common/safe_browsing/mach_o_image_reader_mac.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 namespace safe_browsing {
 
diff --git a/chrome/browser/safe_browsing/signature_evaluator_mac_unittest.cc b/chrome/browser/safe_browsing/signature_evaluator_mac_unittest.cc
index 3041104..aa3f72d 100644
--- a/chrome/browser/safe_browsing/signature_evaluator_mac_unittest.cc
+++ b/chrome/browser/safe_browsing/signature_evaluator_mac_unittest.cc
@@ -22,7 +22,7 @@
 #include "chrome/browser/safe_browsing/incident_reporting/incident.h"
 #include "chrome/browser/safe_browsing/incident_reporting/mock_incident_receiver.h"
 #include "chrome/common/chrome_paths.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "testing/gmock/include/gmock/gmock-matchers.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/safe_browsing/threat_details_unittest.cc b/chrome/browser/safe_browsing/threat_details_unittest.cc
index d7da5a4..8788a47a 100644
--- a/chrome/browser/safe_browsing/threat_details_unittest.cc
+++ b/chrome/browser/safe_browsing/threat_details_unittest.cc
@@ -23,7 +23,7 @@
 #include "components/safe_browsing/browser/threat_details.h"
 #include "components/safe_browsing/browser/threat_details_history.h"
 #include "components/safe_browsing/common/safebrowsing_messages.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/test_renderer_host.h"
diff --git a/chrome/browser/safe_browsing/ui_manager_unittest.cc b/chrome/browser/safe_browsing/ui_manager_unittest.cc
index fea272b3..27631886 100644
--- a/chrome/browser/safe_browsing/ui_manager_unittest.cc
+++ b/chrome/browser/safe_browsing/ui_manager_unittest.cc
@@ -153,20 +153,39 @@
   scoped_refptr<SafeBrowsingUIManager> ui_manager_;
 };
 
-TEST_F(SafeBrowsingUIManagerTest, Whitelist) {
+// Leaks memory. https://crbug.com/755118
+#if defined(LEAK_SANITIZER)
+#define MAYBE_Whitelist DISABLED_Whitelist
+#else
+#define MAYBE_Whitelist Whitelist
+#endif
+TEST_F(SafeBrowsingUIManagerTest, MAYBE_Whitelist) {
   security_interstitials::UnsafeResource resource =
       MakeUnsafeResourceAndStartNavigation(kBadURL);
   AddToWhitelist(resource);
   EXPECT_TRUE(IsWhitelisted(resource));
 }
 
-TEST_F(SafeBrowsingUIManagerTest, WhitelistIgnoresSitesNotAdded) {
+// Leaks memory. https://crbug.com/755118
+#if defined(LEAK_SANITIZER)
+#define MAYBE_WhitelistIgnoresSitesNotAdded \
+  DISABLED_WhitelistIgnoresSitesNotAdded
+#else
+#define MAYBE_WhitelistIgnoresSitesNotAdded WhitelistIgnoresSitesNotAdded
+#endif
+TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistIgnoresSitesNotAdded) {
   security_interstitials::UnsafeResource resource =
       MakeUnsafeResourceAndStartNavigation(kGoodURL);
   EXPECT_FALSE(IsWhitelisted(resource));
 }
 
-TEST_F(SafeBrowsingUIManagerTest, WhitelistRemembersThreatType) {
+// Leaks memory. https://crbug.com/755118
+#if defined(LEAK_SANITIZER)
+#define MAYBE_WhitelistRemembersThreatType DISABLED_WhitelistRemembersThreatType
+#else
+#define MAYBE_WhitelistRemembersThreatType WhitelistRemembersThreatType
+#endif
+TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistRemembersThreatType) {
   security_interstitials::UnsafeResource resource =
       MakeUnsafeResourceAndStartNavigation(kBadURL);
   AddToWhitelist(resource);
@@ -181,7 +200,13 @@
   EXPECT_EQ(resource.threat_type, threat_type);
 }
 
-TEST_F(SafeBrowsingUIManagerTest, WhitelistIgnoresPath) {
+// Leaks memory. https://crbug.com/755118
+#if defined(LEAK_SANITIZER)
+#define MAYBE_WhitelistIgnoresPath DISABLED_WhitelistIgnoresPath
+#else
+#define MAYBE_WhitelistIgnoresPath WhitelistIgnoresPath
+#endif
+TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistIgnoresPath) {
   security_interstitials::UnsafeResource resource =
       MakeUnsafeResourceAndStartNavigation(kBadURL);
   AddToWhitelist(resource);
@@ -194,7 +219,13 @@
   EXPECT_TRUE(IsWhitelisted(resource_path));
 }
 
-TEST_F(SafeBrowsingUIManagerTest, WhitelistIgnoresThreatType) {
+// Leaks memory. https://crbug.com/755118
+#if defined(LEAK_SANITIZER)
+#define MAYBE_WhitelistIgnoresThreatType DISABLED_WhitelistIgnoresThreatType
+#else
+#define MAYBE_WhitelistIgnoresThreatType WhitelistIgnoresThreatType
+#endif
+TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistIgnoresThreatType) {
   security_interstitials::UnsafeResource resource =
       MakeUnsafeResourceAndStartNavigation(kBadURL);
   AddToWhitelist(resource);
@@ -206,7 +237,15 @@
   EXPECT_TRUE(IsWhitelisted(resource_phishing));
 }
 
-TEST_F(SafeBrowsingUIManagerTest, WhitelistWithUnrelatedPendingLoad) {
+// Leaks memory. https://crbug.com/755118
+#if defined(LEAK_SANITIZER)
+#define MAYBE_WhitelistWithUnrelatedPendingLoad \
+  DISABLED_WhitelistWithUnrelatedPendingLoad
+#else
+#define MAYBE_WhitelistWithUnrelatedPendingLoad \
+  WhitelistWithUnrelatedPendingLoad
+#endif
+TEST_F(SafeBrowsingUIManagerTest, MAYBE_WhitelistWithUnrelatedPendingLoad) {
   // Commit load of landing page.
   NavigateAndCommit(GURL(kLandingURL));
   {
diff --git a/chrome/browser/ssl/security_state_tab_helper_browser_tests.cc b/chrome/browser/ssl/security_state_tab_helper_browser_tests.cc
index c3588664..29f1274 100644
--- a/chrome/browser/ssl/security_state_tab_helper_browser_tests.cc
+++ b/chrome/browser/ssl/security_state_tab_helper_browser_tests.cc
@@ -160,7 +160,7 @@
                                    ->GetSSL()
                                    .certificate.get();
   EXPECT_TRUE(cert->Equals(expected_cert));
-  EXPECT_TRUE(expired_explanation.insecure_explanations[0].has_certificate);
+  EXPECT_TRUE(!!expired_explanation.insecure_explanations[0].certificate);
 }
 
 // Checks that the given |explanation| contains an appropriate
@@ -184,7 +184,7 @@
                                    ->GetSSL()
                                    .certificate.get();
   EXPECT_TRUE(cert->Equals(expected_cert));
-  EXPECT_TRUE(explanation.has_certificate);
+  EXPECT_TRUE(!!explanation.certificate);
 }
 
 // Checks that the given |explanation| contains an appropriate
diff --git a/chrome/browser/supervised_user/supervised_user_service.cc b/chrome/browser/supervised_user/supervised_user_service.cc
index 3ee6154..d1fc034 100644
--- a/chrome/browser/supervised_user/supervised_user_service.cc
+++ b/chrome/browser/supervised_user/supervised_user_service.cc
@@ -885,8 +885,9 @@
 #if defined(OS_CHROMEOS)
   // The active user can be NULL in unit tests.
   if (user_manager::UserManager::Get()->GetActiveUser()) {
-    return UTF16ToUTF8(user_manager::UserManager::Get()->GetUserDisplayName(
-        user_manager::UserManager::Get()->GetActiveUser()->GetAccountId()));
+    return base::UTF16ToUTF8(
+        user_manager::UserManager::Get()->GetUserDisplayName(
+            user_manager::UserManager::Get()->GetActiveUser()->GetAccountId()));
   }
   return std::string();
 #else
diff --git a/chrome/browser/sync/DEPS b/chrome/browser/sync/DEPS
index a2eaea2..88800dc5 100644
--- a/chrome/browser/sync/DEPS
+++ b/chrome/browser/sync/DEPS
@@ -5,14 +5,3 @@
   "+components/sync_wifi",
   "+google/cacheinvalidation",
 ]
-specific_include_rules = {
-  "sync_error_notifier_ash\.cc": [
-    "+ash/system/system_notifier.h",
-  ],
-  "sync_error_notifier_factory_ash\.cc": [
-    "+ash/shell.h",
-  ],
-  ".*_unittest\.cc": [
-    "+ash/test/ash_test_base.h",
-  ]
-}
diff --git a/chrome/browser/sync/sync_error_notifier_ash.cc b/chrome/browser/sync/sync_error_notifier_ash.cc
index 5ca2dce0b..e6c2929 100644
--- a/chrome/browser/sync/sync_error_notifier_ash.cc
+++ b/chrome/browser/sync/sync_error_notifier_ash.cc
@@ -4,10 +4,11 @@
 
 #include "chrome/browser/sync/sync_error_notifier_ash.h"
 
-#include "ash/system/system_notifier.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/login/user_flow.h"
+#include "chrome/browser/chromeos/login/users/chrome_user_manager.h"
 #include "chrome/browser/notifications/notification.h"
 #include "chrome/browser/notifications/notification_ui_manager.h"
 #include "chrome/browser/profiles/profile.h"
@@ -20,17 +21,12 @@
 #include "chrome/grit/generated_resources.h"
 #include "chrome/grit/theme_resources.h"
 #include "components/signin/core/account_id/account_id.h"
+#include "components/user_manager/user_manager.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/message_center/notification.h"
 #include "ui/message_center/notification_delegate.h"
 
-#if defined(OS_CHROMEOS)
-#include "chrome/browser/chromeos/login/user_flow.h"
-#include "chrome/browser/chromeos/login/users/chrome_user_manager.h"
-#include "components/user_manager/user_manager.h"
-#endif
-
 namespace {
 
 const char kProfileSyncNotificationId[] = "chrome://settings/sync/";
@@ -137,7 +133,6 @@
     return;
   }
 
-#if defined(OS_CHROMEOS)
   if (user_manager::UserManager::IsInitialized()) {
     chromeos::UserFlow* user_flow =
         chromeos::ChromeUserManager::Get()->GetCurrentUserFlow();
@@ -148,7 +143,6 @@
     if (!user_flow->ShouldLaunchBrowser())
       return;
   }
-#endif
 
   // Error state just got triggered. There shouldn't be previous notification.
   // Let's display one.
diff --git a/chrome/browser/sync/sync_error_notifier_ash_unittest.cc b/chrome/browser/sync/sync_error_notifier_ash_unittest.cc
index 41d7a43..4b34e58 100644
--- a/chrome/browser/sync/sync_error_notifier_ash_unittest.cc
+++ b/chrome/browser/sync/sync_error_notifier_ash_unittest.cc
@@ -8,7 +8,6 @@
 
 #include <memory>
 
-#include "ash/test/ash_test_base.h"
 #include "base/memory/ptr_util.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/login/users/mock_user_manager.h"
@@ -19,6 +18,7 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
+#include "chrome/test/base/browser_with_test_window_test.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/base/testing_profile_manager.h"
@@ -32,8 +32,6 @@
 using ::testing::ReturnRef;
 using ::testing::_;
 
-namespace ash {
-
 namespace {
 
 const char kTestAccountId[] = "testuser@test.com";
@@ -67,7 +65,7 @@
   return base::MakeUnique<FakeLoginUIService>();
 }
 
-class SyncErrorNotifierTest : public AshTestBase {
+class SyncErrorNotifierTest : public BrowserWithTestWindowTest {
  public:
   SyncErrorNotifierTest() {}
   ~SyncErrorNotifierTest() override {}
@@ -75,7 +73,7 @@
   void SetUp() override {
     DCHECK(TestingBrowserProcess::GetGlobal());
 
-    AshTestBase::SetUp();
+    BrowserWithTestWindowTest::SetUp();
 
     profile_manager_ = base::MakeUnique<TestingProfileManager>(
         TestingBrowserProcess::GetGlobal());
@@ -104,7 +102,7 @@
     service_.reset();
     profile_manager_.reset();
 
-    AshTestBase::TearDown();
+    BrowserWithTestWindowTest::TearDown();
   }
 
  protected:
@@ -148,8 +146,6 @@
   DISALLOW_COPY_AND_ASSIGN(SyncErrorNotifierTest);
 };
 
-}  // namespace
-
 // Test that SyncErrorNotifier shows an notification if a passphrase is
 // required.
 TEST_F(SyncErrorNotifierTest, PassphraseNotification) {
@@ -209,4 +205,4 @@
   }
 }
 
-}  // namespace ash
+}  // namespace
diff --git a/chrome/browser/sync/sync_error_notifier_factory_ash.cc b/chrome/browser/sync/sync_error_notifier_factory_ash.cc
index 2af253c..2ab74180 100644
--- a/chrome/browser/sync/sync_error_notifier_factory_ash.cc
+++ b/chrome/browser/sync/sync_error_notifier_factory_ash.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/sync/sync_error_notifier_factory_ash.h"
 
-#include "ash/shell.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/sync/profile_sync_service_factory.h"
@@ -35,9 +34,6 @@
 
 KeyedService* SyncErrorNotifierFactory::BuildServiceInstanceFor(
     content::BrowserContext* context) const {
-  if (!ash::Shell::HasInstance())
-    return nullptr;
-
   Profile* profile = static_cast<Profile*>(context);
   browser_sync::ProfileSyncService* profile_sync_service =
       ProfileSyncServiceFactory::GetForProfile(profile);
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 996ebba..2c7ae1f4 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -3056,6 +3056,8 @@
         "cocoa/restart_browser.mm",
         "cocoa/screen_capture_notification_ui_cocoa.h",
         "cocoa/screen_capture_notification_ui_cocoa.mm",
+        "cocoa/separate_fullscreen_window.h",
+        "cocoa/separate_fullscreen_window.mm",
         "cocoa/session_crashed_bubble.mm",
         "cocoa/simple_message_box_bridge_views.mm",
         "cocoa/simple_message_box_cocoa.h",
diff --git a/chrome/browser/ui/app_list/search/arc/arc_playstore_search_provider.cc b/chrome/browser/ui/app_list/search/arc/arc_playstore_search_provider.cc
index fc95abb4..66c004825 100644
--- a/chrome/browser/ui/app_list/search/arc/arc_playstore_search_provider.cc
+++ b/chrome/browser/ui/app_list/search/arc/arc_playstore_search_provider.cc
@@ -65,7 +65,7 @@
     return;
 
   app_instance->GetRecentAndSuggestedAppsFromPlayStore(
-      UTF16ToUTF8(query), max_results_,
+      base::UTF16ToUTF8(query), max_results_,
       base::Bind(&ArcPlayStoreSearchProvider::OnResults,
                  weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now()));
 }
diff --git a/chrome/browser/ui/app_list/search/search_controller_factory.cc b/chrome/browser/ui/app_list/search/search_controller_factory.cc
index 8bd8e2c..e1792c0 100644
--- a/chrome/browser/ui/app_list/search/search_controller_factory.cc
+++ b/chrome/browser/ui/app_list/search/search_controller_factory.cc
@@ -78,17 +78,18 @@
           model->search_box(), model->results(),
           HistoryFactory::GetForBrowserContext(profile));
 
-  // Add mixer groups. There are three main groups: apps, webstore and
-  // omnibox. Each group has a "soft" maximum number of results. However, if
+  // Add mixer groups. There are four main groups: answer card, apps, webstore
+  // and omnibox. Each group has a "soft" maximum number of results. However, if
   // a query turns up very few results, the mixer may take more than this
   // maximum from a particular group.
 
-  // Multiplier 100 is used because the answer card is designed to be the most
-  // relevant result and must be on the top of the result list.
-  size_t answer_card_group_id = controller->AddGroup(1, 100.0);
-  size_t apps_group_id = controller->AddGroup(kMaxAppsGroupResults, 1.0);
-  size_t omnibox_group_id = controller->AddGroup(kMaxOmniboxResults, 1.0);
-  size_t webstore_group_id = controller->AddGroup(kMaxWebstoreResults, 0.4);
+  size_t answer_card_group_id = controller->AddGroup(1, 1.0, 10.0);
+  size_t apps_group_id =
+      controller->AddGroup(kMaxAppsGroupResults, 1.0,
+                           features::IsFullscreenAppListEnabled() ? 5.0 : 0.0);
+  size_t omnibox_group_id = controller->AddGroup(kMaxOmniboxResults, 1.0, 0.0);
+  size_t webstore_group_id =
+      controller->AddGroup(kMaxWebstoreResults, 0.4, 0.0);
 
   // Add search providers.
   controller->AddProvider(
@@ -112,7 +113,7 @@
   }
   if (IsSuggestionsSearchProviderEnabled()) {
     size_t suggestions_group_id =
-        controller->AddGroup(kMaxSuggestionsResults, 1.0);
+        controller->AddGroup(kMaxSuggestionsResults, 1.0, 0.0);
     controller->AddProvider(
         suggestions_group_id,
         base::MakeUnique<SuggestionsSearchProvider>(profile, list_controller));
@@ -123,7 +124,7 @@
   if (app_list::switches::IsDriveSearchInChromeLauncherEnabled() &&
       !profile->IsGuestSession()) {
     size_t search_api_group_id =
-        controller->AddGroup(kMaxLauncherSearchResults, 1.0);
+        controller->AddGroup(kMaxLauncherSearchResults, 1.0, 0.0);
     controller->AddProvider(search_api_group_id,
                             base::MakeUnique<LauncherSearchProvider>(profile));
   }
@@ -131,7 +132,7 @@
 #if defined(OS_CHROMEOS)
   if (features::IsPlayStoreAppSearchEnabled()) {
     size_t playstore_api_group_id =
-        controller->AddGroup(kMaxPlayStoreResults, 1.0);
+        controller->AddGroup(kMaxPlayStoreResults, 1.0, 0.0);
     controller->AddProvider(
         playstore_api_group_id,
         base::MakeUnique<ArcPlayStoreSearchProvider>(kMaxPlayStoreResults,
diff --git a/chrome/browser/ui/ash/app_list/app_list_presenter_service.cc b/chrome/browser/ui/ash/app_list/app_list_presenter_service.cc
index a5ba98b..c08458dc 100644
--- a/chrome/browser/ui/ash/app_list/app_list_presenter_service.cc
+++ b/chrome/browser/ui/ash/app_list/app_list_presenter_service.cc
@@ -9,13 +9,20 @@
 #include "ash/public/interfaces/constants.mojom.h"
 #include "chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.h"
 #include "chrome/browser/ui/ash/app_list/app_list_service_ash.h"
+#include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
 #include "content/public/common/service_manager_connection.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "ui/app_list/presenter/app_list_presenter_impl.h"
 #include "ui/gfx/geometry/rect.h"
 
-AppListPresenterService::AppListPresenterService(Profile* profile)
-    : profile_(profile), binding_(this) {
+AppListPresenterService::AppListPresenterService() : binding_(this) {}
+
+AppListPresenterService::~AppListPresenterService() {}
+
+void AppListPresenterService::Init() {
+  if (binding_.is_bound())
+    return;
+
   content::ServiceManagerConnection* connection =
       content::ServiceManagerConnection::GetForProcess();
   if (connection && connection->GetConnector()) {
@@ -32,8 +39,6 @@
   }
 }
 
-AppListPresenterService::~AppListPresenterService() {}
-
 void AppListPresenterService::Show(int64_t display_id) {
   GetPresenter()->Show(display_id);
 }
@@ -48,7 +53,8 @@
 
 void AppListPresenterService::StartVoiceInteractionSession() {
   auto* service =
-      arc::ArcVoiceInteractionFrameworkService::GetForBrowserContext(profile_);
+      arc::ArcVoiceInteractionFrameworkService::GetForBrowserContext(
+          ChromeLauncherController::instance()->profile());
   if (service)
     service->StartSessionFromUserInteraction(gfx::Rect());
 }
diff --git a/chrome/browser/ui/ash/app_list/app_list_presenter_service.h b/chrome/browser/ui/ash/app_list/app_list_presenter_service.h
index 759db7d..2151a32 100644
--- a/chrome/browser/ui/ash/app_list/app_list_presenter_service.h
+++ b/chrome/browser/ui/ash/app_list/app_list_presenter_service.h
@@ -9,8 +9,6 @@
 #include "mojo/public/cpp/bindings/binding.h"
 #include "ui/app_list/presenter/app_list_presenter.mojom.h"
 
-class Profile;
-
 namespace app_list {
 class AppListPresenterImpl;
 }
@@ -18,9 +16,12 @@
 // A service providing the Mojo interface to manipulate the App List.
 class AppListPresenterService : public app_list::mojom::AppListPresenter {
  public:
-  explicit AppListPresenterService(Profile* profile);
+  AppListPresenterService();
   ~AppListPresenterService() override;
 
+  // Initialize service and mojo bindings.
+  void Init();
+
   // app_list::mojom::AppListPresenter:
   void Show(int64_t display_id) override;
   void Dismiss() override;
@@ -33,7 +34,6 @@
  private:
   app_list::AppListPresenterImpl* GetPresenter();
 
-  Profile* const profile_;  // Owned by ProfileManager.
   mojo::Binding<app_list::mojom::AppListPresenter> binding_;
 
   DISALLOW_COPY_AND_ASSIGN(AppListPresenterService);
diff --git a/chrome/browser/ui/ash/app_list/app_list_service_ash.cc b/chrome/browser/ui/ash/app_list/app_list_service_ash.cc
index 2eaaee6..365f09f 100644
--- a/chrome/browser/ui/ash/app_list/app_list_service_ash.cc
+++ b/chrome/browser/ui/ash/app_list/app_list_service_ash.cc
@@ -100,6 +100,7 @@
       base::MakeUnique<app_list::AppListPresenterImpl>(std::move(factory));
   controller_delegate_ =
       base::MakeUnique<AppListControllerDelegateAsh>(app_list_presenter_.get());
+  app_list_presenter_service_ = base::MakeUnique<AppListPresenterService>();
 }
 
 AppListServiceAsh::~AppListServiceAsh() {}
@@ -109,11 +110,7 @@
 }
 
 void AppListServiceAsh::Init(Profile* initial_profile) {
-  // The AppListPresenterService ctor calls AppListServiceAsh::GetInstance(),
-  // which isn't available in the AppListServiceAsh constructor, so init here.
-  // This establishes the mojo connections between the app list and presenter.
-  app_list_presenter_service_ =
-      base::MakeUnique<AppListPresenterService>(initial_profile);
+  app_list_presenter_service_->Init();
 
   // Ensure the StartPageService is created here. This early initialization is
   // necessary to allow the WebContents to load before the app list is shown.
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index f84a6a1..ba9d08f 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -1337,15 +1337,6 @@
                                           security_style_explanations);
 }
 
-void Browser::ShowCertificateViewerInDevTools(
-    content::WebContents* web_contents,
-    scoped_refptr<net::X509Certificate> certificate) {
-  DevToolsWindow* devtools_window =
-      DevToolsWindow::GetInstanceForInspectedWebContents(web_contents);
-  if (devtools_window)
-    devtools_window->ShowCertificateViewer(certificate);
-}
-
 std::unique_ptr<content::BluetoothChooser> Browser::RunBluetoothChooser(
     content::RenderFrameHost* frame,
     const content::BluetoothChooser::EventHandler& event_handler) {
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h
index 9825121..df8a86b 100644
--- a/chrome/browser/ui/browser.h
+++ b/chrome/browser/ui/browser.h
@@ -491,9 +491,6 @@
   blink::WebSecurityStyle GetSecurityStyle(
       content::WebContents* web_contents,
       content::SecurityStyleExplanations* security_style_explanations) override;
-  void ShowCertificateViewerInDevTools(
-      content::WebContents* web_contents,
-      scoped_refptr<net::X509Certificate> certificate) override;
   std::unique_ptr<content::BluetoothChooser> RunBluetoothChooser(
       content::RenderFrameHost* frame,
       const content::BluetoothChooser::EventHandler& event_handler) override;
diff --git a/chrome/browser/ui/browser_command_controller_interactive_browsertest.cc b/chrome/browser/ui/browser_command_controller_interactive_browsertest.cc
index 9bec796..86fef1ff 100644
--- a/chrome/browser/ui/browser_command_controller_interactive_browsertest.cc
+++ b/chrome/browser/ui/browser_command_controller_interactive_browsertest.cc
@@ -14,10 +14,10 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "content/public/browser/notification_service.h"
+#include "content/public/common/browser_side_navigation_policy.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/test_utils.h"
 #include "ui/events/keycodes/dom/keycode_converter.h"
@@ -31,6 +31,7 @@
 #endif
 
 namespace {
+
 // The html file to receive key events, prevent defaults and export all the
 // events with "getKeyEventReport()" function. It has two magic keys: pressing
 // "S" to enter fullscreen mode; pressing "X" to indicate the end of all the
@@ -53,8 +54,8 @@
   ~BrowserCommandControllerInteractiveTest() override = default;
 
  protected:
-  // Starts the test page and waits for it to be loaded.
-  void StartTestPage();
+  // Starts |kFullscreenKeyboardLockHTML| in a new tab and waits for load.
+  void StartFullscreenLockPage();
 
   // Sends a control or command + |key| shortcut to the focused window. Shift
   // modifier will be added if |shift| is true.
@@ -78,13 +79,91 @@
   // for the operation to take effect.
   void SendEscapeAndWaitForExitingFullscreen();
 
-  // Sends a set of preventable shortcuts to the web page.
-  void SendShortcutsInFullscreen();
+  // Sends a set of preventable shortcuts to the web page and expects them to be
+  // prevented.
+  void SendShortcutsAndExpectPrevented();
+
+  // Sends a set of preventable shortcuts to the web page and expects them to
+  // not be prevented. If |js_fullscreen| is true, the test will use
+  // SendJsFullscreenShortcutAndWait() to trigger the fullscreen mode. Otherwise
+  // SendFullscreenShortcutAndWait() will be used.
+  void SendShortcutsAndExpectNotPrevented(bool js_fullscreen);
 
   // Sends a magic KeyX to the focused window to stop the test case, receives
   // the result and verifies if it is equal to |expected_result_|.
   void FinishTestAndVerifyResult();
 
+  // Returns whether the active tab is in html fullscreen mode.
+  bool IsActiveTabFullscreen() const {
+    auto* contents = GetActiveWebContents();
+    return contents->GetDelegate()->IsFullscreenForTabOrPending(contents);
+  }
+
+  // Returns whether the GetActiveBrowser() is in browser fullscreen mode.
+  bool IsInBrowserFullscreen() const {
+    return GetActiveBrowser()
+               ->exclusive_access_manager()
+               ->fullscreen_controller()
+               ->IsFullscreenForBrowser();
+  }
+
+  content::WebContents* GetActiveWebContents() const {
+    return GetActiveBrowser()->tab_strip_model()->GetActiveWebContents();
+  }
+
+  // Gets the current active tab index.
+  int GetActiveTabIndex() const {
+    return GetActiveBrowser()->tab_strip_model()->active_index();
+  }
+
+  // Gets the count of tabs in current browser.
+  int GetTabCount() const {
+    return GetActiveBrowser()->tab_strip_model()->count();
+  }
+
+  // Gets the count of browser instances.
+  size_t GetBrowserCount() const {
+    return BrowserList::GetInstance()->size();
+  }
+
+  // Gets the last active Browser instance.
+  Browser* GetActiveBrowser() const {
+    return BrowserList::GetInstance()->GetLastActive();
+  }
+
+  // Ensures GetActiveBrowser() is focused.
+  void FocusOnLastActiveBrowser() {
+    ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(
+        GetActiveBrowser()));
+  }
+
+  // Waits until the count of Browser instances becomes |expected|.
+  void WaitForBrowserCount(size_t expected) {
+    while (GetBrowserCount() != expected)
+      content::RunAllPendingInMessageLoop();
+  }
+
+  // Waits until the count of the tabs in active Browser instance becomes
+  // |expected|.
+  void WaitForTabCount(int expected) {
+    while (GetTabCount() != expected)
+      content::RunAllPendingInMessageLoop();
+  }
+
+  // Waits until the index of active tab in active Browser instance becomes
+  // |expected|.
+  void WaitForActiveTabIndex(int expected) {
+    while (GetActiveTabIndex() != expected)
+      content::RunAllPendingInMessageLoop();
+  }
+
+  // Waits until the index of active tab in active Browser instance is not
+  // |expected|.
+  void WaitForInactiveTabIndex(int expected) {
+    while (GetActiveTabIndex() == expected)
+      content::RunAllPendingInMessageLoop();
+  }
+
  private:
   void SetUpOnMainThread() override;
 
@@ -95,19 +174,21 @@
   DISALLOW_COPY_AND_ASSIGN(BrowserCommandControllerInteractiveTest);
 };
 
-void BrowserCommandControllerInteractiveTest::StartTestPage() {
-  ASSERT_TRUE(embedded_test_server()->Start());
+void BrowserCommandControllerInteractiveTest::StartFullscreenLockPage() {
   // Ensures the initial states.
-  ASSERT_EQ(1, browser()->tab_strip_model()->count());
-  ASSERT_EQ(0, browser()->tab_strip_model()->active_index());
-  ASSERT_EQ(1U, BrowserList::GetInstance()->size());
+  ASSERT_EQ(1, GetTabCount());
+  ASSERT_EQ(0, GetActiveTabIndex());
+  ASSERT_EQ(1U, GetBrowserCount());
   // Add a second tab for counting and focus purposes.
   AddTabAtIndex(1, GURL(url::kAboutBlankURL), ui::PAGE_TRANSITION_LINK);
-  ASSERT_EQ(2, browser()->tab_strip_model()->count());
-  ASSERT_EQ(1U, BrowserList::GetInstance()->size());
+  ASSERT_EQ(2, GetTabCount());
+  ASSERT_EQ(1U, GetBrowserCount());
 
+  if (!embedded_test_server()->Started())
+    ASSERT_TRUE(embedded_test_server()->Start());
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), embedded_test_server()->GetURL(kFullscreenKeyboardLockHTML),
+      GetActiveBrowser(),
+      embedded_test_server()->GetURL(kFullscreenKeyboardLockHTML),
       WindowOpenDisposition::CURRENT_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 }
@@ -122,8 +203,9 @@
   const bool control_modifier = true;
   const bool command_modifier = false;
 #endif
-  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), key, control_modifier,
-                                              shift, false, command_modifier));
+  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
+      GetActiveBrowser(), key, control_modifier, shift, false,
+      command_modifier));
 
   expected_result_ += ui::KeycodeConverter::DomCodeToCodeString(
       ui::UsLayoutKeyboardCodeToDomCode(key));
@@ -151,15 +233,15 @@
   // Enter fullscreen.
 #if defined(OS_MACOSX)
   // On MACOSX, Command + Control + F is used.
-  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_F, true,
-                                              false, false, true));
+  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
+      GetActiveBrowser(), ui::VKEY_F, true, false, false, true));
 #elif defined(OS_CHROMEOS)
   // A dedicated fullscreen key is used on Chrome OS, so send a fullscreen
   // command directly instead, to avoid constructing the key press.
-  ASSERT_TRUE(chrome::ExecuteCommand(browser(), IDC_FULLSCREEN));
+  ASSERT_TRUE(chrome::ExecuteCommand(GetActiveBrowser(), IDC_FULLSCREEN));
 #else
-  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_F11, false,
-                                              false, false, false));
+  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
+      GetActiveBrowser(), ui::VKEY_F11, false, false, false, false));
 #endif
 
   observer.Wait();
@@ -170,15 +252,16 @@
   content::WindowedNotificationObserver observer(
       chrome::NOTIFICATION_FULLSCREEN_CHANGED,
       content::NotificationService::AllSources());
-  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_S, false,
-                                              false, false, false));
+  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
+      GetActiveBrowser(), ui::VKEY_S, false, false, false, false));
   expected_result_ += "KeyS ctrl:false shift:false alt:false meta:false\n";
   observer.Wait();
+  ASSERT_TRUE(IsActiveTabFullscreen());
 }
 
 void BrowserCommandControllerInteractiveTest::SendEscape() {
-  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_ESCAPE, false,
-                                              false, false, false));
+  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
+      GetActiveBrowser(), ui::VKEY_ESCAPE, false, false, false, false));
   expected_result_ += "Escape ctrl:false shift:false alt:false meta:false\n";
 }
 
@@ -187,43 +270,143 @@
   content::WindowedNotificationObserver observer(
       chrome::NOTIFICATION_FULLSCREEN_CHANGED,
       content::NotificationService::AllSources());
-  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_ESCAPE, false,
-                                              false, false, false));
+  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
+      GetActiveBrowser(), ui::VKEY_ESCAPE, false, false, false, false));
   observer.Wait();
+  ASSERT_FALSE(IsActiveTabFullscreen());
 }
 
-void BrowserCommandControllerInteractiveTest::SendShortcutsInFullscreen() {
-  const int initial_active_index = browser()->tab_strip_model()->active_index();
-  const int initial_tab_count = browser()->tab_strip_model()->count();
-  const size_t initial_browser_count = BrowserList::GetInstance()->size();
+void BrowserCommandControllerInteractiveTest::
+    SendShortcutsAndExpectPrevented() {
+  const int initial_active_index = GetActiveTabIndex();
+  const int initial_tab_count = GetTabCount();
+  const size_t initial_browser_count = GetBrowserCount();
   // The tab should not be closed.
   ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_W));
-  ASSERT_EQ(initial_tab_count, browser()->tab_strip_model()->count());
+  ASSERT_EQ(initial_tab_count, GetTabCount());
   // The window should not be closed.
   ASSERT_NO_FATAL_FAILURE(SendShiftShortcut(ui::VKEY_W));
-  ASSERT_EQ(initial_browser_count, BrowserList::GetInstance()->size());
+  ASSERT_EQ(initial_browser_count, GetBrowserCount());
   // TODO(zijiehe): ChromeOS incorrectly handles these;
   // see http://crbug.com/737307.
 #if !defined(OS_CHROMEOS)
   // A new tab should not be created.
   ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_T));
-  ASSERT_EQ(initial_tab_count, browser()->tab_strip_model()->count());
+  ASSERT_EQ(initial_tab_count, GetTabCount());
   // A new window should not be created.
   ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_N));
-  ASSERT_EQ(initial_browser_count, BrowserList::GetInstance()->size());
+  ASSERT_EQ(initial_browser_count, GetBrowserCount());
   // A new incognito window should not be created.
   ASSERT_NO_FATAL_FAILURE(SendShiftShortcut(ui::VKEY_N));
-  ASSERT_EQ(initial_browser_count, BrowserList::GetInstance()->size());
+  ASSERT_EQ(initial_browser_count, GetBrowserCount());
   // Last closed tab should not be restored.
   ASSERT_NO_FATAL_FAILURE(SendShiftShortcut(ui::VKEY_T));
-  ASSERT_EQ(initial_tab_count, browser()->tab_strip_model()->count());
+  ASSERT_EQ(initial_tab_count, GetTabCount());
 #endif
   // Browser should not switch to the next tab.
   ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_TAB));
-  ASSERT_EQ(initial_active_index, browser()->tab_strip_model()->active_index());
+  ASSERT_EQ(initial_active_index, GetActiveTabIndex());
   // Browser should not switch to the previous tab.
   ASSERT_NO_FATAL_FAILURE(SendShiftShortcut(ui::VKEY_TAB));
-  ASSERT_EQ(initial_active_index, browser()->tab_strip_model()->active_index());
+  ASSERT_EQ(initial_active_index, GetActiveTabIndex());
+}
+
+void BrowserCommandControllerInteractiveTest::
+    SendShortcutsAndExpectNotPrevented(bool js_fullscreen) {
+  const int initial_active_index = GetActiveTabIndex();
+  const int initial_tab_count = GetTabCount();
+  const size_t initial_browser_count = GetBrowserCount();
+  const auto enter_fullscreen = [this, js_fullscreen]() {
+    ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(
+        this->GetActiveBrowser()));
+    if (js_fullscreen) {
+      if (!this->IsActiveTabFullscreen()) {
+        const std::string page =
+            "<html><head><script>"
+            "document.addEventListener('keydown', "
+            "    () => { document.body.webkitRequestFullscreen(); });"
+            "</script></head><body></body></html>";
+        ui_test_utils::NavigateToURLWithDisposition(
+            this->GetActiveBrowser(),
+            GURL("data:text/html," + page),
+            WindowOpenDisposition::CURRENT_TAB,
+            ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+        content::WindowedNotificationObserver observer(
+            chrome::NOTIFICATION_FULLSCREEN_CHANGED,
+            content::NotificationService::AllSources());
+        ASSERT_NO_FATAL_FAILURE(this->SendJsFullscreenShortcutAndWait());
+        observer.Wait();
+        ASSERT_TRUE(this->IsActiveTabFullscreen());
+      }
+    } else {
+      if (!this->IsInBrowserFullscreen()) {
+        ASSERT_NO_FATAL_FAILURE(this->SendFullscreenShortcutAndWait());
+      }
+      ASSERT_TRUE(this->IsInBrowserFullscreen());
+    }
+  };
+
+  ASSERT_NO_FATAL_FAILURE(enter_fullscreen());
+
+  // A new tab should be created and focused.
+  ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_T));
+  WaitForTabCount(initial_tab_count + 1);
+  ASSERT_NE(initial_active_index, GetActiveTabIndex());
+
+  ASSERT_NO_FATAL_FAILURE(enter_fullscreen());
+
+  // The newly created tab should be closed.
+  ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_W));
+  WaitForTabCount(initial_tab_count);
+  ASSERT_EQ(initial_active_index, GetActiveTabIndex());
+
+  ASSERT_NO_FATAL_FAILURE(enter_fullscreen());
+
+  // A new tab should be created and focused.
+  ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_T));
+  WaitForTabCount(initial_tab_count + 1);
+  ASSERT_NE(initial_active_index, GetActiveTabIndex());
+
+  ASSERT_NO_FATAL_FAILURE(enter_fullscreen());
+
+  // The previous tab should be focused.
+  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
+      GetActiveBrowser(), ui::VKEY_TAB, true, true, false, false));
+  WaitForActiveTabIndex(initial_active_index);
+  ASSERT_EQ(initial_active_index, GetActiveTabIndex());
+
+  ASSERT_NO_FATAL_FAILURE(enter_fullscreen());
+
+  // The newly created tab should be focused.
+  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
+      GetActiveBrowser(), ui::VKEY_TAB, true, false, false, false));
+  WaitForInactiveTabIndex(initial_active_index);
+  ASSERT_NE(initial_active_index, GetActiveTabIndex());
+
+  ASSERT_NO_FATAL_FAILURE(enter_fullscreen());
+
+  // The newly created tab should be closed.
+  ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_W));
+  WaitForTabCount(initial_tab_count);
+  ASSERT_EQ(initial_active_index, GetActiveTabIndex());
+
+  ASSERT_NO_FATAL_FAILURE(enter_fullscreen());
+
+  // A new window should be created and focused.
+  ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_N));
+  WaitForBrowserCount(initial_browser_count + 1);
+  ASSERT_EQ(initial_browser_count + 1, GetBrowserCount());
+
+  ASSERT_NO_FATAL_FAILURE(enter_fullscreen());
+
+  // The newly created window should be closed.
+  ASSERT_NO_FATAL_FAILURE(SendShiftShortcut(ui::VKEY_W));
+  WaitForBrowserCount(initial_browser_count);
+
+  ASSERT_EQ(initial_browser_count, GetBrowserCount());
+  ASSERT_EQ(initial_active_index, GetActiveTabIndex());
+
+  ASSERT_NO_FATAL_FAILURE(enter_fullscreen());
 }
 
 void BrowserCommandControllerInteractiveTest::FinishTestAndVerifyResult() {
@@ -232,12 +415,12 @@
   // sent. So we sent a KeyX to the webpage to indicate the end of the test
   // case. After processing this key event, web page is safe to send the record
   // back through window.domAutomationController.
-  EXPECT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_X, false,
-                                              false, false, false));
+  EXPECT_TRUE(ui_test_utils::SendKeyPressSync(
+      GetActiveBrowser(), ui::VKEY_X, false, false, false, false));
   expected_result_ += "KeyX ctrl:false shift:false alt:false meta:false";
   std::string result;
   EXPECT_TRUE(content::ExecuteScriptAndExtractString(
-      browser()->tab_strip_model()->GetActiveWebContents()->GetRenderViewHost(),
+      GetActiveWebContents()->GetRenderViewHost(),
       "getKeyEventReport();", &result));
   NormalizeMetaKeyForMacOS(&result);
   NormalizeMetaKeyForMacOS(&expected_result_);
@@ -246,30 +429,28 @@
 }
 
 void BrowserCommandControllerInteractiveTest::SetUpOnMainThread() {
-  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
+  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(GetActiveBrowser()));
 }
 
 IN_PROC_BROWSER_TEST_F(BrowserCommandControllerInteractiveTest,
                        ShortcutsShouldTakeEffectInWindowMode) {
-  ASSERT_EQ(1, browser()->tab_strip_model()->count());
+  ASSERT_EQ(1, GetTabCount());
   ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_T));
-  ASSERT_EQ(2, browser()->tab_strip_model()->count());
+  ASSERT_EQ(2, GetTabCount());
   ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_T));
-  ASSERT_EQ(3, browser()->tab_strip_model()->count());
+  ASSERT_EQ(3, GetTabCount());
   ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_W));
-  ASSERT_EQ(2, browser()->tab_strip_model()->count());
+  ASSERT_EQ(2, GetTabCount());
   ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_W));
-  ASSERT_EQ(1, browser()->tab_strip_model()->count());
+  ASSERT_EQ(1, GetTabCount());
   ASSERT_NO_FATAL_FAILURE(SendFullscreenShortcutAndWait());
-  ASSERT_TRUE(browser()
-                  ->exclusive_access_manager()
-                  ->fullscreen_controller()
-                  ->IsFullscreenForBrowser());
+  ASSERT_TRUE(IsInBrowserFullscreen());
+  ASSERT_FALSE(IsActiveTabFullscreen());
 }
 
 IN_PROC_BROWSER_TEST_F(BrowserCommandControllerInteractiveTest,
                        UnpreservedShortcutsShouldBePreventable) {
-  ASSERT_NO_FATAL_FAILURE(StartTestPage());
+  ASSERT_NO_FATAL_FAILURE(StartFullscreenLockPage());
 
   // The browser print function should be blocked by the web page.
   ASSERT_NO_FATAL_FAILURE(SendShortcut(ui::VKEY_P));
@@ -290,23 +471,29 @@
 IN_PROC_BROWSER_TEST_F(
     BrowserCommandControllerInteractiveTest,
     MAYBE_KeyEventsShouldBeConsumedByWebPageInBrowserFullscreen) {
-  ASSERT_NO_FATAL_FAILURE(StartTestPage());
+  ASSERT_NO_FATAL_FAILURE(StartFullscreenLockPage());
 
   ASSERT_NO_FATAL_FAILURE(SendFullscreenShortcutAndWait());
-  ASSERT_NO_FATAL_FAILURE(SendShortcutsInFullscreen());
+  ASSERT_FALSE(IsActiveTabFullscreen());
+  ASSERT_TRUE(IsInBrowserFullscreen());
+  ASSERT_NO_FATAL_FAILURE(SendShortcutsAndExpectPrevented());
   // Current page should not exit browser fullscreen mode.
   ASSERT_NO_FATAL_FAILURE(SendEscape());
 
   ASSERT_NO_FATAL_FAILURE(FinishTestAndVerifyResult());
+
+  ASSERT_NO_FATAL_FAILURE(SendFullscreenShortcutAndWait());
+  ASSERT_FALSE(IsActiveTabFullscreen());
+  ASSERT_FALSE(IsInBrowserFullscreen());
 }
 
 IN_PROC_BROWSER_TEST_F(
     BrowserCommandControllerInteractiveTest,
     KeyEventsShouldBeConsumedByWebPageInJsFullscreenExceptForEsc) {
-  ASSERT_NO_FATAL_FAILURE(StartTestPage());
+  ASSERT_NO_FATAL_FAILURE(StartFullscreenLockPage());
 
   ASSERT_NO_FATAL_FAILURE(SendJsFullscreenShortcutAndWait());
-  ASSERT_NO_FATAL_FAILURE(SendShortcutsInFullscreen());
+  ASSERT_NO_FATAL_FAILURE(SendShortcutsAndExpectPrevented());
   // Current page should exit HTML fullscreen mode.
   ASSERT_NO_FATAL_FAILURE(SendEscapeAndWaitForExitingFullscreen());
 
@@ -316,21 +503,70 @@
 IN_PROC_BROWSER_TEST_F(
     BrowserCommandControllerInteractiveTest,
     KeyEventsShouldBeConsumedByWebPageInJsFullscreenExceptForF11) {
-  ASSERT_NO_FATAL_FAILURE(StartTestPage());
+  ASSERT_NO_FATAL_FAILURE(StartFullscreenLockPage());
 
   ASSERT_NO_FATAL_FAILURE(SendJsFullscreenShortcutAndWait());
-  ASSERT_NO_FATAL_FAILURE(SendShortcutsInFullscreen());
+  ASSERT_NO_FATAL_FAILURE(SendShortcutsAndExpectPrevented());
 #if defined(OS_MACOSX)
   // On 10.9 or earlier, sending the exit fullscreen shortcut will crash the
   // binary. See http://crbug.com/740250.
   if (base::mac::IsAtLeastOS10_10()) {
     // Current page should exit browser fullscreen mode.
     ASSERT_NO_FATAL_FAILURE(SendFullscreenShortcutAndWait());
+    ASSERT_FALSE(IsActiveTabFullscreen());
+    ASSERT_FALSE(IsInBrowserFullscreen());
   }
 #else
   // Current page should exit browser fullscreen mode.
   ASSERT_NO_FATAL_FAILURE(SendFullscreenShortcutAndWait());
+  ASSERT_FALSE(IsActiveTabFullscreen());
+  ASSERT_FALSE(IsInBrowserFullscreen());
 #endif
 
   ASSERT_NO_FATAL_FAILURE(FinishTestAndVerifyResult());
 }
+
+#if defined(OS_MACOSX)
+// TODO(zijiehe): Figure out why this test crashes on Mac OSX. The suspicious
+// command is "SendFullscreenShortcutAndWait()". See, http://crbug.com/738949.
+#define MAYBE_ShortcutsShouldTakeEffectInBrowserFullscreen \
+        DISABLED_ShortcutsShouldTakeEffectInBrowserFullscreen
+#else
+#define MAYBE_ShortcutsShouldTakeEffectInBrowserFullscreen \
+        ShortcutsShouldTakeEffectInBrowserFullscreen
+#endif
+IN_PROC_BROWSER_TEST_F(BrowserCommandControllerInteractiveTest,
+                       MAYBE_ShortcutsShouldTakeEffectInBrowserFullscreen) {
+#if defined(OS_MACOSX)
+  // On 10.9 or earlier, sending the exit fullscreen shortcut will crash the
+  // binary. See http://crbug.com/740250.
+  if (base::mac::IsAtMostOS10_9())
+    return;
+#endif
+  ASSERT_NO_FATAL_FAILURE(SendShortcutsAndExpectNotPrevented(false));
+}
+
+#if !defined(OS_MACOSX)
+// HTML fullscreen is automatically exited after some commands are executed,
+// such as Ctrl + T (new tab). But some commands won't have this effect, such as
+// Ctrl + N (new window).
+// On Mac OSX, AppKit implementation is used for HTML fullscreen mode. Entering
+// and exiting AppKit fullscreen mode triggers an animation. A
+// FullscreenChangeObserver is needed to ensure the animation is finished. But
+// the FullscreenChangeObserver won't finish if the command actually won't cause
+// the page to exit fullscreen mode. So we need to maintain a list of exiting /
+// non-exiting commands, which is not the goal of this test.
+
+#if defined(OS_CHROMEOS)
+// This test is flaky on ChromeOS, see bug http://crbug.com/754878.
+#define MAYBE_ShortcutsShouldTakeEffectInJsFullscreen \
+        DISABLED_ShortcutsShouldTakeEffectInJsFullscreen
+#else
+#define MAYBE_ShortcutsShouldTakeEffectInJsFullscreen \
+        ShortcutsShouldTakeEffectInJsFullscreen
+#endif
+IN_PROC_BROWSER_TEST_F(BrowserCommandControllerInteractiveTest,
+                       MAYBE_ShortcutsShouldTakeEffectInJsFullscreen) {
+  ASSERT_NO_FATAL_FAILURE(SendShortcutsAndExpectNotPrevented(true));
+}
+#endif
diff --git a/chrome/browser/ui/chrome_pages.cc b/chrome/browser/ui/chrome_pages.cc
index 22789838..f8ca4ec 100644
--- a/chrome/browser/ui/chrome_pages.cc
+++ b/chrome/browser/ui/chrome_pages.cc
@@ -245,12 +245,6 @@
   return GURL(std::string(kChromeUISettingsURL) + sub_page);
 }
 
-bool IsSettingsSubPage(const GURL& url, const std::string& sub_page) {
-  return (url.SchemeIs(content::kChromeUIScheme) &&
-          (url.host_piece() == chrome::kChromeUISettingsHost) &&
-          url.path_piece() == "/" + sub_page);
-}
-
 bool IsTrustedPopupWindowWithScheme(const Browser* browser,
                                     const std::string& scheme) {
   if (!browser->is_type_popup() || !browser->is_trusted_source())
diff --git a/chrome/browser/ui/chrome_pages.h b/chrome/browser/ui/chrome_pages.h
index 9c0031f..92a4fde 100644
--- a/chrome/browser/ui/chrome_pages.h
+++ b/chrome/browser/ui/chrome_pages.h
@@ -78,9 +78,6 @@
 // Constructs a settings GURL for the specified |sub_page|.
 GURL GetSettingsUrl(const std::string& sub_page);
 
-// Returns true if |url| is the URL for the settings subpage |sub_page|.
-bool IsSettingsSubPage(const GURL& url, const std::string& sub_page);
-
 // Returns true if |browser| is a trusted popup window containing a page with
 // matching |scheme| (or any trusted popup if |scheme| is empty).
 bool IsTrustedPopupWindowWithScheme(const Browser* browser,
diff --git a/chrome/browser/ui/cocoa/accessibility_browsertest.mm b/chrome/browser/ui/cocoa/accessibility_browsertest.mm
new file mode 100644
index 0000000..1511017
--- /dev/null
+++ b/chrome/browser/ui/cocoa/accessibility_browsertest.mm
@@ -0,0 +1,112 @@
+// 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 <Cocoa/Cocoa.h>
+
+#include "base/mac/foundation_util.h"
+#include "base/mac/mac_util.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/cocoa/view_id_util.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "testing/gtest_mac.h"
+
+class AccessibilityTest : public InProcessBrowserTest {
+ public:
+  AccessibilityTest() {}
+
+ protected:
+  NSView* ContentView() {
+    return [browser()->window()->GetNativeWindow() contentView];
+  }
+
+  NSView* ViewWithID(ViewID id) {
+    return view_id_util::GetView(browser()->window()->GetNativeWindow(), id);
+  }
+
+  // For NSView subclasses with cells, the cell contains the accessibility
+  // properties, not the view. NSButton is one such subclass; there are probably
+  // others as well.
+  id RealAXObjectFor(id object) {
+    if ([object isKindOfClass:[NSButton class]])
+      return [static_cast<NSButton*>(object) cell];
+    return object;
+  }
+
+  id AXAttribute(id obj, NSString* attribute) {
+    return [RealAXObjectFor(obj) accessibilityAttributeValue:attribute];
+  }
+
+  bool AXIsIgnored(id obj) {
+    return [RealAXObjectFor(obj) accessibilityIsIgnored];
+  }
+
+  NSString* AXRole(id obj) {
+    return base::mac::ObjCCast<NSString>(
+        AXAttribute(obj, NSAccessibilityRoleAttribute));
+  }
+
+  NSArray* AXChildren(id obj) {
+    return base::mac::ObjCCast<NSArray>(
+        AXAttribute(obj, NSAccessibilityChildrenAttribute));
+  }
+
+  NSString* AXTitle(id obj) {
+    return base::mac::ObjCCast<NSString>(
+        AXAttribute(obj, NSAccessibilityTitleAttribute));
+  }
+
+  NSString* AXDescription(id obj) {
+    return base::mac::ObjCCast<NSString>(
+        AXAttribute(obj, NSAccessibilityDescriptionAttribute));
+  }
+
+  // Returns an array containing every non-ignored accessibility node that is a
+  // descendant of |root|.
+  NSArray* CollectAXTree(id root) {
+    NSMutableArray* result = [[[NSMutableArray alloc] init] autorelease];
+    CollectAXTreeHelper(root, result);
+    return result;
+  }
+
+ private:
+  void CollectAXTreeHelper(id root, NSMutableArray* result) {
+    if (!AXIsIgnored(root))
+      [result addObject:root];
+    for (id child : AXChildren(root))
+      CollectAXTreeHelper(child, result);
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(AccessibilityTest, EveryElementHasRole) {
+  // These a11y APIs are not present in 10.9, so these tests don't run there.
+  if (!base::mac::IsAtLeastOS10_10())
+    return;
+  NSArray* elements = CollectAXTree(ContentView());
+  for (id elem : elements) {
+    EXPECT_NSNE(AXRole(elem), NSAccessibilityUnknownRole);
+  }
+}
+
+// Every element must have at least one of a title or a description.
+IN_PROC_BROWSER_TEST_F(AccessibilityTest, EveryElementHasText) {
+  if (!base::mac::IsAtLeastOS10_10())
+    return;
+  NSArray* elements = CollectAXTree(ContentView());
+  for (id elem : elements) {
+    NSString* text =
+        [AXTitle(elem) length] > 0 ? AXTitle(elem) : AXDescription(elem);
+    EXPECT_NSNE(text, @"");
+  }
+}
+
+IN_PROC_BROWSER_TEST_F(AccessibilityTest, ControlRoles) {
+  if (!base::mac::IsAtLeastOS10_10())
+    return;
+  // TODO(ellyjones): figure out a more principled way to ensure each control
+  // has the expected role. For now, this is just a regression test for
+  // https://crbug.com/754223
+  EXPECT_NSEQ(AXRole(ViewWithID(VIEW_ID_APP_MENU)),
+              NSAccessibilityPopUpButtonRole);
+}
diff --git a/chrome/browser/ui/cocoa/app_menu/app_menu_controller.mm b/chrome/browser/ui/cocoa/app_menu/app_menu_controller.mm
index e5f135a..deaffe0 100644
--- a/chrome/browser/ui/cocoa/app_menu/app_menu_controller.mm
+++ b/chrome/browser/ui/cocoa/app_menu/app_menu_controller.mm
@@ -110,7 +110,7 @@
     appMenuModel->UpdateZoomControls();
     const base::string16 level =
         appMenuModel->GetLabelForCommandId(IDC_ZOOM_PERCENT_DISPLAY);
-    [[controller_ zoomDisplay] setTitle:SysUTF16ToNSString(level)];
+    [[controller_ zoomDisplay] setTitle:base::SysUTF16ToNSString(level)];
   }
 
   std::unique_ptr<content::HostZoomMap::Subscription> subscription_;
diff --git a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h
index 594a3f7b..a3a729aa 100644
--- a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h
+++ b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h
@@ -129,7 +129,7 @@
   bool IsFullscreenOrPending() const override;
   void UpdateWindowIcon() override;
   void UpdateWindowTitle() override;
-  void UpdateShape(std::unique_ptr<SkRegion> region) override;
+  void UpdateShape(std::unique_ptr<ShapeRects> rects) override;
   void UpdateDraggableRegions(
       const std::vector<extensions::DraggableRegion>& regions) override;
   SkRegion* GetDraggableRegion() override;
diff --git a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm
index 595af1d..ae8dece3 100644
--- a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm
+++ b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm
@@ -540,7 +540,7 @@
   [window() setTitle:base::SysUTF16ToNSString(title)];
 }
 
-void NativeAppWindowCocoa::UpdateShape(std::unique_ptr<SkRegion> region) {
+void NativeAppWindowCocoa::UpdateShape(std::unique_ptr<ShapeRects> rects) {
   NOTIMPLEMENTED();
 }
 
diff --git a/chrome/browser/ui/cocoa/autofill/autofill_popup_view_cocoa.mm b/chrome/browser/ui/cocoa/autofill/autofill_popup_view_cocoa.mm
index 21c960f..0fa1525 100644
--- a/chrome/browser/ui/cocoa/autofill/autofill_popup_view_cocoa.mm
+++ b/chrome/browser/ui/cocoa/autofill/autofill_popup_view_cocoa.mm
@@ -38,6 +38,7 @@
 
 using autofill::AutofillPopupView;
 using autofill::AutofillPopupLayoutModel;
+using base::SysUTF16ToNSString;
 
 namespace {
 
diff --git a/chrome/browser/ui/cocoa/autofill/card_unmask_prompt_view_bridge.mm b/chrome/browser/ui/cocoa/autofill/card_unmask_prompt_view_bridge.mm
index 172bb41c..95aac44 100644
--- a/chrome/browser/ui/cocoa/autofill/card_unmask_prompt_view_bridge.mm
+++ b/chrome/browser/ui/cocoa/autofill/card_unmask_prompt_view_bridge.mm
@@ -34,6 +34,8 @@
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/native_theme/native_theme.h"
 
+using base::SysUTF16ToNSString;
+
 namespace {
 
 const CGFloat kButtonGap = 6.0f;
diff --git a/chrome/browser/ui/cocoa/autofill/save_card_bubble_view_bridge.mm b/chrome/browser/ui/cocoa/autofill/save_card_bubble_view_bridge.mm
index 380e0ca..745ce89 100644
--- a/chrome/browser/ui/cocoa/autofill/save_card_bubble_view_bridge.mm
+++ b/chrome/browser/ui/cocoa/autofill/save_card_bubble_view_bridge.mm
@@ -20,6 +20,8 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 
+using base::SysUTF16ToNSString;
+
 namespace {
 
 const CGFloat kDesiredBubbleWidth = 370;
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.mm
index 6fbfc70..cb2d766e 100644
--- a/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.mm
+++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.mm
@@ -241,7 +241,7 @@
                                           const BookmarkNode* node,
                                           NSImage* image,
                                           bool add_extra_items) {
-  NSString* title = SysUTF16ToNSString(node->GetTitle());
+  NSString* title = base::SysUTF16ToNSString(node->GetTitle());
   NSMenuItem* items = [[[NSMenuItem alloc]
                             initWithTitle:title
                                    action:nil
diff --git a/chrome/browser/ui/cocoa/browser_window_controller.mm b/chrome/browser/ui/cocoa/browser_window_controller.mm
index 198b67cc..7c3565a 100644
--- a/chrome/browser/ui/cocoa/browser_window_controller.mm
+++ b/chrome/browser/ui/cocoa/browser_window_controller.mm
@@ -2003,34 +2003,6 @@
   display::Screen* screen = display::Screen::GetScreen();
   BOOL hasMultipleMonitors = screen && screen->GetNumDisplays() > 1;
 
-  if (base::FeatureList::IsEnabled(features::kContentFullscreen)) {
-    // Getting the current's window view and its boundaries.
-    NSWindow* window = [self window];
-    WebContents* contents = browser_->tab_strip_model()->GetActiveWebContents();
-    NSView* view = contents->GetNativeView();
-    NSRect windowFrame = window.frame;
-    NSRect viewFrame = [view convertRect:view.bounds toView:nil];
-
-    // Moving the origin from the lower-left corner to the upper-left corner of
-    // the view and cropping out the scrollbar
-    viewFrame.origin.y = NSHeight(windowFrame) - NSMaxY(viewFrame);
-    viewFrame.size.width -= gfx::scrollbar_size();
-
-    // Taking a screenshot of the view and creating the custom view to display
-    CGImageRef windowScreenshot = (CGImageRef)[(id)CGWindowListCreateImage(
-        CGRectZero, kCGWindowListOptionIncludingWindow, [window windowNumber],
-        kCGWindowImageBoundsIgnoreFraming) autorelease];
-    CGImageRef viewScreenshot = (CGImageRef)[(id)CGImageCreateWithImageInRect(
-        windowScreenshot, [window convertRectToBacking:viewFrame]) autorelease];
-    FullscreenPlaceholderView* screenshotView =
-        [[[FullscreenPlaceholderView alloc]
-            initWithFrame:[[self tabContentArea] bounds]
-                    image:viewScreenshot] autorelease];
-    screenshotView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
-
-    [[self tabContentArea] addSubview:screenshotView];
-  }
-
   if (base::mac::IsAtLeastOS10_10() &&
       !(hasMultipleMonitors && ![NSScreen screensHaveSeparateSpaces])) {
     [self enterAppKitFullscreen];
diff --git a/chrome/browser/ui/cocoa/bubble_sync_promo_controller.mm b/chrome/browser/ui/cocoa/bubble_sync_promo_controller.mm
index ca662f7..51ad04e 100644
--- a/chrome/browser/ui/cocoa/bubble_sync_promo_controller.mm
+++ b/chrome/browser/ui/cocoa/bubble_sync_promo_controller.mm
@@ -86,8 +86,8 @@
   const base::string16 linkText = l10n_util::GetStringUTF16(linkStringId_);
   const base::string16 promoText =
       l10n_util::GetStringFUTF16(promoStringId_, linkText, &offset);
-  NSString* nsPromoText = SysUTF16ToNSString(promoText);
-  NSString* nsLinkText = SysUTF16ToNSString(linkText);
+  NSString* nsPromoText = base::SysUTF16ToNSString(promoText);
+  NSString* nsLinkText = base::SysUTF16ToNSString(linkText);
   NSFont* font = [NSFont labelFontOfSize:kFontSize];
   NSColor* linkColor = skia::SkColorToCalibratedNSColor(
       chrome_style::GetLinkColor());
diff --git a/chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa.mm b/chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa.mm
index 218ac2c..388da01 100644
--- a/chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa.mm
+++ b/chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa.mm
@@ -147,7 +147,7 @@
     [button addItemWithTitle:itemTitle];
     [[button lastItem] setTag:i];
 
-    if (UTF16ToUTF8(model->GetLabelAt(i)) == title)
+    if (base::UTF16ToUTF8(model->GetLabelAt(i)) == title)
       [button selectItemWithTag:i];
 
     // Determine the largest possible size for this button.
diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm
index fe1a09d..8bb132b 100644
--- a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm
+++ b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm
@@ -31,6 +31,7 @@
 #include "ui/base/l10n/l10n_util_mac.h"
 #include "ui/gfx/image/image_skia_util_mac.h"
 
+using base::SysUTF16ToNSString;
 using content::OpenURLParams;
 using content::Referrer;
 
diff --git a/chrome/browser/ui/cocoa/global_error_bubble_controller.mm b/chrome/browser/ui/cocoa/global_error_bubble_controller.mm
index 73f4d2c..c62742a 100644
--- a/chrome/browser/ui/cocoa/global_error_bubble_controller.mm
+++ b/chrome/browser/ui/cocoa/global_error_bubble_controller.mm
@@ -27,6 +27,8 @@
 #include "ui/base/material_design/material_design_controller.h"
 #include "ui/gfx/image/image.h"
 
+using base::SysUTF16ToNSString;
+
 namespace {
 
 const CGFloat kParagraphSpacing = 6;
diff --git a/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.mm b/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.mm
index 3010a560..6d223c1 100644
--- a/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.mm
+++ b/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.mm
@@ -830,10 +830,10 @@
   std::unique_ptr<PageInfoUI::SecurityDescription> security_description =
       identityInfo.GetSecurityDescription();
   [securitySummaryField_
-      setStringValue:SysUTF16ToNSString(security_description->summary)];
+      setStringValue:base::SysUTF16ToNSString(security_description->summary)];
 
   [securityDetailsField_
-      setStringValue:SysUTF16ToNSString(security_description->details)];
+      setStringValue:base::SysUTF16ToNSString(security_description->details)];
 
   certificate_ = identityInfo.certificate;
 
diff --git a/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.mm b/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.mm
index 28f0873..dcb2070 100644
--- a/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.mm
+++ b/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.mm
@@ -118,12 +118,11 @@
     const base::string16& message,
     const ui::ResourceBundle::FontStyle& font_style) {
   NSTextField* textField = constrained_window::CreateLabel();
-  [textField setAttributedStringValue:
-      constrained_window::GetAttributedLabelString(
-          SysUTF16ToNSString(message),
-          font_style,
-          NSNaturalTextAlignment,
-          NSLineBreakByWordWrapping)];
+  [textField
+      setAttributedStringValue:constrained_window::GetAttributedLabelString(
+                                   base::SysUTF16ToNSString(message),
+                                   font_style, NSNaturalTextAlignment,
+                                   NSLineBreakByWordWrapping)];
   [parent addSubview:textField];
   return textField;
 }
diff --git a/chrome/browser/ui/cocoa/separate_fullscreen_window.h b/chrome/browser/ui/cocoa/separate_fullscreen_window.h
new file mode 100644
index 0000000..d6b211a
--- /dev/null
+++ b/chrome/browser/ui/cocoa/separate_fullscreen_window.h
@@ -0,0 +1,20 @@
+// Copyright (c) 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_UI_COCOA_SEPARATE_FULLSCREEN_WINDOW_H_
+#define CHROME_BROWSER_UI_COCOA_SEPARATE_FULLSCREEN_WINDOW_H_
+
+#import <Cocoa/Cocoa.h>
+
+#include "ui/base/cocoa/touch_bar_forward_declarations.h"
+
+@interface SeparateFullscreenWindow : NSWindow
+// This window class is instantiated to display a WebContentsViewCocoa as its
+// subview in fullscreen mode as part of ContentFullscreen to enable users to
+// interact with the main browser window and its tab when they're displaying
+// content in this separate window. Related types include
+// FullscreenLowPowerWindow.
+@end
+
+#endif  // CHROME_BROWSER_UI_COCOA_SEPARATE_FULLSCREEN_WINDOW_H_
diff --git a/chrome/browser/ui/cocoa/separate_fullscreen_window.mm b/chrome/browser/ui/cocoa/separate_fullscreen_window.mm
new file mode 100644
index 0000000..89f07cf5
--- /dev/null
+++ b/chrome/browser/ui/cocoa/separate_fullscreen_window.mm
@@ -0,0 +1,17 @@
+// Copyright (c) 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "chrome/browser/ui/cocoa/separate_fullscreen_window.h"
+
+@implementation SeparateFullscreenWindow
+
+- (BOOL)canBecomeKeyWindow {
+  return YES;
+}
+
+- (BOOL)canBecomeMainWindow {
+  return YES;
+}
+
+@end
diff --git a/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.h b/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.h
index f04b529..7fe6d64 100644
--- a/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.h
+++ b/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.h
@@ -47,6 +47,13 @@
    // Set to true if the window is a popup.
    BOOL isPopup_;
 
+   // Reference to the FullscreenPlaceholderView displayed in the main window
+   // for the tab when our WebContentsView is in the SeparateFullscreenWindow.
+   NSView* fullscreenPlaceholderView_;
+   // Reference to the fullscreen window created to display the WebContents
+   // view separately.
+   NSWindow* separateFullscreenWindow_;
+
    base::scoped_nsobject<WebTextfieldTouchBarController> touchBarController_;
 }
 @property(readonly, nonatomic) content::WebContents* webContents;
diff --git a/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.mm b/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.mm
index 359e1a97..5ba9768 100644
--- a/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.mm
+++ b/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.mm
@@ -8,15 +8,20 @@
 
 #include <utility>
 
+#include "base/feature_list.h"
 #include "base/mac/scoped_cftyperef.h"
 #include "base/mac/scoped_nsobject.h"
 #include "base/macros.h"
 #include "chrome/browser/devtools/devtools_window.h"
 #import "chrome/browser/themes/theme_properties.h"
 #import "chrome/browser/themes/theme_service.h"
+#include "chrome/browser/ui/cocoa/fullscreen_placeholder_view.h"
+#include "chrome/browser/ui/cocoa/separate_fullscreen_window.h"
 #import "chrome/browser/ui/cocoa/themed_window.h"
 #import "chrome/browser/ui/cocoa/web_textfield_touch_bar_controller.h"
+#include "chrome/browser/ui/exclusive_access/fullscreen_within_tab_helper.h"
 #include "chrome/browser/ui/view_ids.h"
+#include "chrome/common/chrome_features.h"
 #include "chrome/grit/theme_resources.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/render_widget_host.h"
@@ -27,6 +32,7 @@
 #include "ui/base/cocoa/animation_utils.h"
 #import "ui/base/cocoa/touch_bar_forward_declarations.h"
 #include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/scrollbar_size.h"
 
 using content::WebContents;
 using content::WebContentsObserver;
@@ -62,7 +68,7 @@
 
   void DidToggleFullscreenModeForTab(bool entered_fullscreen,
                                      bool will_cause_resize) override {
-    [controller_ toggleFullscreenWidget:YES];
+    [controller_ toggleFullscreenWidget:entered_fullscreen];
   }
 
  private:
@@ -204,6 +210,15 @@
 
 @end  // @implementation TabContentsContainerView
 
+@interface TabContentsController (
+    SeparateFullscreenWindowDelegate)<NSWindowDelegate>
+
+- (NSView*)createScreenshotView;
+
+- (NSWindow*)createSeparateWindowForTab:(content::WebContents*)separatedTab;
+
+@end
+
 @implementation TabContentsController
 @synthesize webContents = contents_;
 @synthesize blockFullscreenResize = blockFullscreenResize_;
@@ -249,7 +264,9 @@
   content::RenderWidgetHostView* const fullscreenView =
       isEmbeddingFullscreenWidget_ ?
       contents_->GetFullscreenRenderWidgetHostView() : NULL;
-  if (fullscreenView) {
+  if (fullscreenPlaceholderView_) {
+    contentsNativeView = fullscreenPlaceholderView_;
+  } else if (fullscreenView) {
     contentsNativeView = fullscreenView->GetNativeView();
   } else {
     isEmbeddingFullscreenWidget_ = NO;
@@ -344,6 +361,17 @@
 - (void)toggleFullscreenWidget:(BOOL)enterFullscreen {
   isEmbeddingFullscreenWidget_ = enterFullscreen &&
       contents_ && contents_->GetFullscreenRenderWidgetHostView();
+  if (base::FeatureList::IsEnabled(features::kContentFullscreen)) {
+    if (enterFullscreen) {
+      fullscreenPlaceholderView_ = [self createScreenshotView];
+      separateFullscreenWindow_ = [self createSeparateWindowForTab:contents_];
+
+      [separateFullscreenWindow_ makeKeyAndOrderFront:nil];
+      [separateFullscreenWindow_ toggleFullScreen:nil];
+    } else {
+      [separateFullscreenWindow_ close];
+    }
+  }
   [self ensureContentsVisibleInSuperview:[[self view] superview]];
 }
 
@@ -411,3 +439,85 @@
 }
 
 @end
+
+@implementation TabContentsController (SeparateFullscreenWindowDelegate)
+
+- (void)windowDidEnterFullScreen:(NSNotification*)notification {
+  // Make the RenderWidgetHostViewCocoa the firstResponder for the
+  // SeparateFullscreenWindow.
+  contents_->Focus();
+}
+
+- (void)windowWillExitFullScreen:(NSNotification*)notification {
+  // Remove the screenshot view so that the WebContentsViewCocoa is
+  // retrieved and displayed again in the original window.
+  fullscreenPlaceholderView_ = nil;
+  [self ensureContentsVisibleInSuperview:[[self view] superview]];
+
+  // When exiting through the title bar Exit Fullscreen Window button, the
+  // WebContents must be notified of the change in fullscreen (like in
+  // FullscreenController::HandleUserPressedEscape).
+  contents_->ExitFullscreen(true);
+}
+
+- (void)windowDidExitFullScreen:(NSNotification*)notification {
+  // When exiting through the title bar Exit Fullscreen Window button, the
+  // SeparateFullscreenWindow doesn't close, so make sure it's closed.
+  [separateFullscreenWindow_ close];
+  separateFullscreenWindow_ = nil;
+}
+
+- (NSView*)createScreenshotView {
+  // Getting the current's window view and its boundaries.
+  NSWindow* window = [contents_->GetNativeView() window];
+  NSView* view = contents_->GetNativeView();
+  NSRect windowFrame = window.frame;
+  NSRect viewFrame = [view convertRect:view.bounds toView:nil];
+
+  // Moving the origin from the lower-left corner to the upper-left corner of
+  // the view and cropping out the scrollbar
+  viewFrame.origin.y = NSHeight(windowFrame) - NSMaxY(viewFrame);
+  viewFrame.size.width -= gfx::scrollbar_size();
+
+  // Taking a screenshot of the view and creating the custom view to display
+  CGImageRef windowScreenshot = (CGImageRef)[(id)CGWindowListCreateImage(
+      CGRectZero, kCGWindowListOptionIncludingWindow, [window windowNumber],
+      kCGWindowImageBoundsIgnoreFraming) autorelease];
+  CGImageRef viewScreenshot = (CGImageRef)[(id)CGImageCreateWithImageInRect(
+      windowScreenshot, [window convertRectToBacking:viewFrame]) autorelease];
+  FullscreenPlaceholderView* screenshotView =
+      [[[FullscreenPlaceholderView alloc] initWithFrame:[[self view] bounds]
+                                                  image:viewScreenshot]
+          autorelease];
+  screenshotView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
+
+  return screenshotView;
+}
+
+// Creates a new window with the tab without detaching it from its source
+// window.
+- (NSWindow*)createSeparateWindowForTab:(WebContents*)separatedTab {
+  DCHECK(separatedTab->GetNativeView());
+
+  NSView* separatedTabView = separatedTab->GetNativeView();
+  NSWindow* sourceWindow = [separatedTabView window];
+  NSRect windowRect =
+      [separatedTabView convertRect:[separatedTabView bounds] toView:nil];
+  SeparateFullscreenWindow* separateWindow = [[SeparateFullscreenWindow alloc]
+      initWithContentRect:[sourceWindow convertRectToScreen:windowRect]
+                styleMask:NSResizableWindowMask
+                  backing:NSBackingStoreBuffered
+                    defer:NO];
+
+  [separateWindow setDelegate:self];
+  [[separateWindow contentView] addSubview:separatedTabView];
+  [separateWindow
+      setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];
+
+  // Make TabContentsContainerView the first responder now as
+  // WebContentsViewCocoa is now in a separate window.
+  [sourceWindow makeFirstResponder:[self view]];
+
+  return separateWindow;
+}
+@end
diff --git a/chrome/browser/ui/cocoa/toolbar/app_toolbar_button.mm b/chrome/browser/ui/cocoa/toolbar/app_toolbar_button.mm
index ddc0eb5..99ff818c 100644
--- a/chrome/browser/ui/cocoa/toolbar/app_toolbar_button.mm
+++ b/chrome/browser/ui/cocoa/toolbar/app_toolbar_button.mm
@@ -4,7 +4,6 @@
 
 #import "chrome/browser/ui/cocoa/toolbar/app_toolbar_button.h"
 
-#include "base/command_line.h"
 #include "base/macros.h"
 #include "chrome/app/vector_icons/vector_icons.h"
 #import "chrome/browser/themes/theme_properties.h"
@@ -12,7 +11,7 @@
 #include "chrome/browser/ui/cocoa/animated_icon.h"
 #import "chrome/browser/ui/cocoa/themed_window.h"
 #import "chrome/browser/ui/cocoa/view_id_util.h"
-#include "chrome/common/chrome_switches.h"
+#include "chrome/common/chrome_features.h"
 #include "chrome/grit/chromium_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 #include "ui/base/material_design/material_design_controller.h"
@@ -33,8 +32,7 @@
   if ((self = [super initWithFrame:frame])) {
     [self commonInit];
 
-    base::CommandLine* commandLine = base::CommandLine::ForCurrentProcess();
-    if (commandLine->HasSwitch(switches::kEnableNewAppMenuIcon)) {
+    if (base::FeatureList::IsEnabled(features::kAnimatedAppMenuIcon)) {
       animatedIcon_.reset(new AnimatedIcon(kBrowserToolsAnimatedIcon, self));
       [self updateAnimatedIconColor];
 
diff --git a/chrome/browser/ui/exclusive_access/fullscreen_controller.cc b/chrome/browser/ui/exclusive_access/fullscreen_controller.cc
index dace90e..fab299d 100644
--- a/chrome/browser/ui/exclusive_access/fullscreen_controller.cc
+++ b/chrome/browser/ui/exclusive_access/fullscreen_controller.cc
@@ -32,7 +32,10 @@
 #include "content/public/browser/web_contents.h"
 #include "extensions/common/extension.h"
 
-#if !defined(OS_MACOSX)
+#if defined(OS_MACOSX)
+#include "base/feature_list.h"
+#include "chrome/common/chrome_features.h"
+#else
 #include "chrome/common/pref_names.h"
 #include "components/prefs/pref_service.h"
 #endif
@@ -96,7 +99,7 @@
 
 bool FullscreenController::IsFullscreenForTabOrPending(
     const WebContents* web_contents) const {
-  if (IsFullscreenForCapturedTab(web_contents))
+  if (IsFullscreenWithinTab(web_contents))
     return true;
   if (web_contents == exclusive_access_tab()) {
     DCHECK(web_contents ==
@@ -114,7 +117,7 @@
                                                      const GURL& origin) {
   DCHECK(web_contents);
 
-  if (MaybeToggleFullscreenForCapturedTab(web_contents, true)) {
+  if (MaybeToggleFullscreenWithinTab(web_contents, true)) {
     // During tab capture of fullscreen-within-tab views, the browser window
     // fullscreen state is unchanged, so return now.
     return;
@@ -158,7 +161,7 @@
 }
 
 void FullscreenController::ExitFullscreenModeForTab(WebContents* web_contents) {
-  if (MaybeToggleFullscreenForCapturedTab(web_contents, false)) {
+  if (MaybeToggleFullscreenWithinTab(web_contents, false)) {
     // During tab capture of fullscreen-within-tab views, the browser window
     // fullscreen state is unchanged, so return now.
     return;
@@ -199,7 +202,7 @@
 }
 
 void FullscreenController::OnTabDetachedFromView(WebContents* old_contents) {
-  if (!IsFullscreenForCapturedTab(old_contents))
+  if (!IsFullscreenWithinTab(old_contents))
     return;
 
   // A fullscreen-within-tab view undergoing screen capture has been detached
@@ -231,7 +234,7 @@
 }
 
 void FullscreenController::OnTabClosing(WebContents* web_contents) {
-  if (IsFullscreenForCapturedTab(web_contents))
+  if (IsFullscreenWithinTab(web_contents))
     web_contents->ExitFullscreen(
         /* will_cause_resize */ IsFullscreenCausedByTab());
   else
@@ -264,7 +267,7 @@
 bool FullscreenController::HandleUserPressedEscape() {
   WebContents* const active_web_contents =
       exclusive_access_manager()->context()->GetActiveWebContents();
-  if (IsFullscreenForCapturedTab(active_web_contents)) {
+  if (IsFullscreenWithinTab(active_web_contents)) {
     active_web_contents->ExitFullscreen(
         /* will_cause_resize */ IsFullscreenCausedByTab());
     return true;
@@ -415,17 +418,22 @@
   is_privileged_fullscreen_for_testing_ = is_privileged;
 }
 
-bool FullscreenController::MaybeToggleFullscreenForCapturedTab(
-    WebContents* web_contents, bool enter_fullscreen) {
+bool FullscreenController::MaybeToggleFullscreenWithinTab(
+    WebContents* web_contents,
+    bool enter_fullscreen) {
   if (enter_fullscreen) {
-    if (web_contents->GetCapturerCount() > 0) {
+    if (web_contents->GetCapturerCount() > 0
+#if defined(OS_MACOSX)
+        || base::FeatureList::IsEnabled(features::kContentFullscreen)
+#endif
+            ) {
       FullscreenWithinTabHelper::CreateForWebContents(web_contents);
-      FullscreenWithinTabHelper::FromWebContents(web_contents)->
-          SetIsFullscreenForCapturedTab(true);
+      FullscreenWithinTabHelper::FromWebContents(web_contents)
+          ->SetIsFullscreenWithinTab(true);
       return true;
     }
   } else {
-    if (IsFullscreenForCapturedTab(web_contents)) {
+    if (IsFullscreenWithinTab(web_contents)) {
       FullscreenWithinTabHelper::RemoveForWebContents(web_contents);
       return true;
     }
@@ -434,7 +442,7 @@
   return false;
 }
 
-bool FullscreenController::IsFullscreenForCapturedTab(
+bool FullscreenController::IsFullscreenWithinTab(
     const WebContents* web_contents) const {
   // Note: On Mac, some of the OnTabXXX() methods get called with a nullptr
   // value
@@ -442,7 +450,7 @@
   const FullscreenWithinTabHelper* const helper =
       web_contents ? FullscreenWithinTabHelper::FromWebContents(web_contents)
                    : nullptr;
-  if (helper && helper->is_fullscreen_for_captured_tab()) {
+  if (helper && helper->is_fullscreen_within_tab()) {
     DCHECK_NE(exclusive_access_tab(), web_contents);
     return true;
   }
diff --git a/chrome/browser/ui/exclusive_access/fullscreen_controller.h b/chrome/browser/ui/exclusive_access/fullscreen_controller.h
index 1edfeac..2449dec4 100644
--- a/chrome/browser/ui/exclusive_access/fullscreen_controller.h
+++ b/chrome/browser/ui/exclusive_access/fullscreen_controller.h
@@ -37,15 +37,25 @@
 // FullscreenWithinTab Note:
 // All fullscreen widgets are displayed within the tab contents area, and
 // FullscreenController will expand the browser window so that the tab contents
-// area fills the entire screen. However, special behavior applies when a tab is
-// being screen-captured. First, the browser window will not be
-// fullscreened. This allows the user to retain control of their desktop to work
-// in other browser tabs or applications while the fullscreen view is displayed
-// on a remote screen. Second, FullscreenController will auto-resize fullscreen
-// widgets to that of the capture video resolution when they are hidden (e.g.,
-// when a user has switched to another tab). This is both a performance and
-// quality improvement since scaling and letterboxing steps can be skipped in
-// the capture pipeline.
+// area fills the entire screen.
+// However, special behavior applies when a tab is screen-captured or the
+// content fullscreen feature is active.
+//
+// Screen-captured:
+// First, the browser window will not be fullscreened. This allows the user to
+// retain control of their desktop to work in other browser tabs or applications
+// while the fullscreen view is displayed on a remote screen. Second,
+// FullscreenController will auto-resize fullscreen widgets to that of the
+// capture video resolution when they are hidden (e.g., when a user has
+// switched to another tab). This is both a performance and quality improvement
+// since scaling and letterboxing steps can be skipped in the capture pipeline.
+//
+// Content-fullscreen (for macOS only):
+// First, the browser window will not be fullscreened. Second, the WebContents's
+// view will not be displayed in the browser window but rather in a
+// separate window, SeparateFullscreenWindow, which will be fullscreened and
+// moved to a new space. This enables the user to have both the browser window
+// and the fullscreen content displayed separately at the same time.
 
 // This class implements fullscreen behaviour.
 class FullscreenController : public ExclusiveAccessControllerBase {
@@ -155,13 +165,13 @@
 
   void SetPrivilegedFullscreenForTesting(bool is_privileged);
   // Returns true if |web_contents| was toggled into/out of fullscreen mode as a
-  // screen-captured tab. See 'FullscreenWithinTab Note'.
-  bool MaybeToggleFullscreenForCapturedTab(content::WebContents* web_contents,
-                                           bool enter_fullscreen);
+  // screen-captured tab or as a content-fullscreen tab.
+  // See 'FullscreenWithinTab Note'.
+  bool MaybeToggleFullscreenWithinTab(content::WebContents* web_contents,
+                                      bool enter_fullscreen);
   // Returns true if |web_contents| is in fullscreen mode as a screen-captured
   // tab. See 'FullscreenWithinTab Note'.
-  bool IsFullscreenForCapturedTab(const content::WebContents* web_contents)
-      const;
+  bool IsFullscreenWithinTab(const content::WebContents* web_contents) const;
 
   // Helper methods that should be used in a TAB context.
   GURL GetRequestingOrigin() const;
diff --git a/chrome/browser/ui/exclusive_access/fullscreen_within_tab_helper.cc b/chrome/browser/ui/exclusive_access/fullscreen_within_tab_helper.cc
index 374318a..2101c35 100644
--- a/chrome/browser/ui/exclusive_access/fullscreen_within_tab_helper.cc
+++ b/chrome/browser/ui/exclusive_access/fullscreen_within_tab_helper.cc
@@ -8,7 +8,7 @@
 
 FullscreenWithinTabHelper::FullscreenWithinTabHelper(
     content::WebContents* ignored)
-    : is_fullscreen_for_captured_tab_(false) {}
+    : is_fullscreen_within_tab_(false) {}
 
 FullscreenWithinTabHelper::~FullscreenWithinTabHelper() {}
 
diff --git a/chrome/browser/ui/exclusive_access/fullscreen_within_tab_helper.h b/chrome/browser/ui/exclusive_access/fullscreen_within_tab_helper.h
index e201bb79..37e91b4 100644
--- a/chrome/browser/ui/exclusive_access/fullscreen_within_tab_helper.h
+++ b/chrome/browser/ui/exclusive_access/fullscreen_within_tab_helper.h
@@ -24,12 +24,10 @@
  public:
   ~FullscreenWithinTabHelper() override;
 
-  bool is_fullscreen_for_captured_tab() const {
-    return is_fullscreen_for_captured_tab_;
-  }
+  bool is_fullscreen_within_tab() const { return is_fullscreen_within_tab_; }
 
-  void SetIsFullscreenForCapturedTab(bool is_fullscreen) {
-    is_fullscreen_for_captured_tab_ = is_fullscreen;
+  void SetIsFullscreenWithinTab(bool is_fullscreen) {
+    is_fullscreen_within_tab_ = is_fullscreen;
   }
 
   // Immediately remove and destroy the FullscreenWithinTabHelper instance
@@ -40,7 +38,7 @@
   friend class content::WebContentsUserData<FullscreenWithinTabHelper>;
   explicit FullscreenWithinTabHelper(content::WebContents* ignored);
 
-  bool is_fullscreen_for_captured_tab_;
+  bool is_fullscreen_within_tab_;
 
   DISALLOW_COPY_AND_ASSIGN(FullscreenWithinTabHelper);
 };
diff --git a/chrome/browser/ui/input_method/input_method_engine.cc b/chrome/browser/ui/input_method/input_method_engine.cc
index 8ebbd4b..9bb8ca7 100644
--- a/chrome/browser/ui/input_method/input_method_engine.cc
+++ b/chrome/browser/ui/input_method/input_method_engine.cc
@@ -138,10 +138,10 @@
   composition_.CopyFrom(composition_text);
 
   // Use a black thin underline by default.
-  if (composition_.underlines.empty()) {
-    composition_.underlines.push_back(
-        ui::CompositionUnderline(0, composition_.text.length(), SK_ColorBLACK,
-                                 false /* thick */, SK_ColorTRANSPARENT));
+  if (composition_.ime_text_spans.empty()) {
+    composition_.ime_text_spans.push_back(
+        ui::ImeTextSpan(0, composition_.text.length(), SK_ColorBLACK,
+                        false /* thick */, SK_ColorTRANSPARENT));
   }
 
   ui::IMEInputContextHandlerInterface* input_context =
diff --git a/chrome/browser/ui/input_method/input_method_engine_base.cc b/chrome/browser/ui/input_method/input_method_engine_base.cc
index b030117..120c0440 100644
--- a/chrome/browser/ui/input_method/input_method_engine_base.cc
+++ b/chrome/browser/ui/input_method/input_method_engine_base.cc
@@ -210,26 +210,26 @@
   // TODO: Add support for displaying selected text in the composition string.
   for (std::vector<SegmentInfo>::const_iterator segment = segments.begin();
        segment != segments.end(); ++segment) {
-    ui::CompositionUnderline underline;
+    ui::ImeTextSpan ime_text_span;
 
     switch (segment->style) {
       case SEGMENT_STYLE_UNDERLINE:
-        underline.color = SK_ColorBLACK;
+        ime_text_span.color = SK_ColorBLACK;
         break;
       case SEGMENT_STYLE_DOUBLE_UNDERLINE:
-        underline.color = SK_ColorBLACK;
-        underline.thick = true;
+        ime_text_span.color = SK_ColorBLACK;
+        ime_text_span.thick = true;
         break;
       case SEGMENT_STYLE_NO_UNDERLINE:
-        underline.color = SK_ColorTRANSPARENT;
+        ime_text_span.color = SK_ColorTRANSPARENT;
         break;
       default:
         continue;
     }
 
-    underline.start_offset = segment->start;
-    underline.end_offset = segment->end;
-    composition_text_->underlines.push_back(underline);
+    ime_text_span.start_offset = segment->start;
+    ime_text_span.end_offset = segment->end;
+    composition_text_->ime_text_spans.push_back(ime_text_span);
   }
 
   // TODO(nona): Makes focus out mode configuable, if necessary.
diff --git a/chrome/browser/ui/views/accessibility/invert_bubble_view.cc b/chrome/browser/ui/views/accessibility/invert_bubble_view.cc
index 5e58c77..441bbec 100644
--- a/chrome/browser/ui/views/accessibility/invert_bubble_view.cc
+++ b/chrome/browser/ui/views/accessibility/invert_bubble_view.cc
@@ -33,7 +33,7 @@
 const char kHighContrastExtensionUrl[] =
     "https://chrome.google.com/webstore/detail/djcfdncoelnlbldjfhinnjlhdjlikmph";
 const char kDarkThemeSearchUrl[] =
-    "https://chrome.google.com/webstore/search-themes/dark";
+    "https://chrome.google.com/webstore/category/collection/dark_themes";
 const char kLearnMoreUrl[] =
     "https://groups.google.com/a/googleproductforums.com/d/topic/chrome/Xrco2HsXS-8/discussion";
 
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc
index af8347b..92bf067b 100644
--- a/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc
+++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc
@@ -23,6 +23,7 @@
 #include "components/zoom/zoom_controller.h"
 #include "extensions/browser/app_window/app_delegate.h"
 #include "ui/gfx/image/image_skia_operations.h"
+#include "ui/gfx/skia_util.h"
 #include "ui/views/controls/webview/webview.h"
 #include "ui/views/widget/widget.h"
 
@@ -357,7 +358,17 @@
   return widget()->IsFullscreen();
 }
 
-void ChromeNativeAppWindowViews::UpdateShape(std::unique_ptr<SkRegion> region) {
+void ChromeNativeAppWindowViews::UpdateShape(
+    std::unique_ptr<ShapeRects> rects) {
+  shape_rects_ = std::move(rects);
+
+  // Build a region from the list of rects when it is supplied.
+  std::unique_ptr<SkRegion> region;
+  if (shape_rects_) {
+    region = base::MakeUnique<SkRegion>();
+    for (const gfx::Rect& input_rect : *shape_rects_.get())
+      region->op(gfx::RectToSkIRect(input_rect), SkRegion::kUnion_Op);
+  }
   shape_ = std::move(region);
   widget()->SetShape(shape() ? base::MakeUnique<SkRegion>(*shape()) : nullptr);
   widget()->OnSizeConstraintsChanged();
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views.h b/chrome/browser/ui/views/apps/chrome_native_app_window_views.h
index 3234213..4e0679c 100644
--- a/chrome/browser/ui/views/apps/chrome_native_app_window_views.h
+++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views.h
@@ -21,6 +21,7 @@
   ~ChromeNativeAppWindowViews() override;
 
   SkRegion* shape() { return shape_.get(); }
+  ShapeRects* shape_rects() { return shape_rects_.get(); }
 
  protected:
   // Called before views::Widget::Init() in InitializeDefaultWindow() to allow
@@ -60,7 +61,7 @@
   // NativeAppWindow implementation.
   void SetFullscreen(int fullscreen_types) override;
   bool IsFullscreenOrPending() const override;
-  void UpdateShape(std::unique_ptr<SkRegion> region) override;
+  void UpdateShape(std::unique_ptr<ShapeRects> rects) override;
   bool HasFrameColor() const override;
   SkColor ActiveFrameColor() const override;
   SkColor InactiveFrameColor() const override;
@@ -81,6 +82,8 @@
   // default shape, usually rectangular.
   std::unique_ptr<SkRegion> shape_;
 
+  std::unique_ptr<ShapeRects> shape_rects_;
+
   bool has_frame_color_;
   SkColor active_frame_color_;
   SkColor inactive_frame_color_;
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc
index 8efa79e..09a14e5 100644
--- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc
+++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc
@@ -110,10 +110,10 @@
 }
 
 void ChromeNativeAppWindowViewsAura::UpdateShape(
-    std::unique_ptr<SkRegion> region) {
+    std::unique_ptr<ShapeRects> rects) {
   bool had_shape = !!shape();
 
-  ChromeNativeAppWindowViews::UpdateShape(std::move(region));
+  ChromeNativeAppWindowViews::UpdateShape(std::move(rects));
 
   aura::Window* native_window = widget()->GetNativeWindow();
   if (shape() && !had_shape) {
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.h b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.h
index 9c84e8f..229eeb1 100644
--- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.h
+++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.h
@@ -36,7 +36,7 @@
   bool IsAlwaysOnTop() const override;
 
   // NativeAppWindow implementation.
-  void UpdateShape(std::unique_ptr<SkRegion> region) override;
+  void UpdateShape(std::unique_ptr<ShapeRects> rects) override;
 
  private:
   FRIEND_TEST_ALL_PREFIXES(ShapedAppWindowTargeterTest,
diff --git a/chrome/browser/ui/views/apps/shaped_app_window_targeter.cc b/chrome/browser/ui/views/apps/shaped_app_window_targeter.cc
index 6f0e7cd..ec273d2 100644
--- a/chrome/browser/ui/views/apps/shaped_app_window_targeter.cc
+++ b/chrome/browser/ui/views/apps/shaped_app_window_targeter.cc
@@ -21,6 +21,9 @@
   if (!shape)
     return false;
 
+  // TODO(varkha): Use app_window_->shape_rects() to obtain a list of hit-test
+  // rectangles. Use the rectangles directly rather than a mask which should
+  // allow this class to inherit directly from WindowTargeter.
   shape->getBoundaryPath(mask);
   return true;
 }
diff --git a/chrome/browser/ui/views/apps/shaped_app_window_targeter_unittest.cc b/chrome/browser/ui/views/apps/shaped_app_window_targeter_unittest.cc
index 416cd077a..8eb38820 100644
--- a/chrome/browser/ui/views/apps/shaped_app_window_targeter_unittest.cc
+++ b/chrome/browser/ui/views/apps/shaped_app_window_targeter_unittest.cc
@@ -20,6 +20,8 @@
 #include "ui/wm/core/default_activation_client.h"
 #include "ui/wm/core/easy_resize_window_targeter.h"
 
+using extensions::AppWindow;
+
 class ShapedAppWindowTargeterTest : public aura::test::AuraTestBase {
  public:
   ShapedAppWindowTargeterTest()
@@ -85,9 +87,9 @@
     EXPECT_EQ(window, move.target());
   }
 
-  std::unique_ptr<SkRegion> region(new SkRegion);
-  region->op(SkIRect::MakeXYWH(0, 0, 0, 0), SkRegion::kUnion_Op);
-  app_window()->UpdateShape(std::move(region));
+  auto rects = base::MakeUnique<AppWindow::ShapeRects>();
+  rects->emplace_back();
+  app_window()->UpdateShape(std::move(rects));
   {
     // With an empty custom shape, all events within the window should fall
     // through to the root window.
@@ -108,10 +110,10 @@
   //  90 +--------+     +---------+
   //              |     |
   // 130          +-----+
-  region.reset(new SkRegion);
-  region->op(SkIRect::MakeXYWH(40, 0, 20, 100), SkRegion::kUnion_Op);
-  region->op(SkIRect::MakeXYWH(0, 40, 100, 20), SkRegion::kUnion_Op);
-  app_window()->UpdateShape(std::move(region));
+  rects = base::MakeUnique<AppWindow::ShapeRects>();
+  rects->emplace_back(40, 0, 20, 100);
+  rects->emplace_back(0, 40, 100, 20);
+  app_window()->UpdateShape(std::move(rects));
   {
     // With the custom shape, the events that don't fall within the custom shape
     // will go through to the root window.
@@ -178,10 +180,10 @@
     EXPECT_EQ(window, move.target());
   }
 
-  std::unique_ptr<SkRegion> region(new SkRegion);
-  region->op(SkIRect::MakeXYWH(40, 0, 20, 100), SkRegion::kUnion_Op);
-  region->op(SkIRect::MakeXYWH(0, 40, 100, 20), SkRegion::kUnion_Op);
-  app_window()->UpdateShape(std::move(region));
+  auto rects = base::MakeUnique<AppWindow::ShapeRects>();
+  rects->emplace_back(40, 0, 20, 100);
+  rects->emplace_back(0, 40, 100, 20);
+  app_window()->UpdateShape(std::move(rects));
   {
     // With the custom shape, the events that don't fall within the custom shape
     // will go through to the root window.
@@ -193,7 +195,7 @@
 
   // Remove the custom shape. This should restore the behaviour of targeting the
   // app window for events just outside its bounds (for a resizable window).
-  app_window()->UpdateShape(std::unique_ptr<SkRegion>());
+  app_window()->UpdateShape(std::unique_ptr<AppWindow::ShapeRects>());
   SetWindowResizable(true);
   {
     ui::MouseEvent move(move_outside);
diff --git a/chrome/browser/ui/views/autofill/save_card_bubble_views.cc b/chrome/browser/ui/views/autofill/save_card_bubble_views.cc
index 172c67a..18b14d3 100644
--- a/chrome/browser/ui/views/autofill/save_card_bubble_views.cc
+++ b/chrome/browser/ui/views/autofill/save_card_bubble_views.cc
@@ -161,13 +161,6 @@
 
 base::string16 SaveCardBubbleViews::GetDialogButtonLabel(
     ui::DialogButton button) const {
-  if (!IsAutofillUpstreamShowNewUiExperimentEnabled()) {
-    // New UI experiment disabled:
-    return l10n_util::GetStringUTF16(button == ui::DIALOG_BUTTON_OK
-                                         ? IDS_AUTOFILL_SAVE_CARD_PROMPT_ACCEPT
-                                         : IDS_NO_THANKS);
-  }
-  // New UI experiment enabled:
   switch (GetCurrentFlowStep()) {
     // Local save has two buttons:
     case LOCAL_SAVE_ONLY_STEP:
@@ -176,14 +169,17 @@
                                          : IDS_NO_THANKS);
     // Upload save has one button but it can say three different things:
     case UPLOAD_SAVE_ONLY_STEP:
-      DCHECK(button == ui::DIALOG_BUTTON_OK);
-      return l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_CARD_PROMPT_ACCEPT);
+      return l10n_util::GetStringUTF16(
+          button == ui::DIALOG_BUTTON_OK ? IDS_AUTOFILL_SAVE_CARD_PROMPT_ACCEPT
+                                         : IDS_NO_THANKS);
     case UPLOAD_SAVE_CVC_FIX_FLOW_STEP_1_OFFER_UPLOAD:
-      DCHECK(button == ui::DIALOG_BUTTON_OK);
-      return l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_CARD_PROMPT_NEXT);
+      return l10n_util::GetStringUTF16(button == ui::DIALOG_BUTTON_OK
+                                           ? IDS_AUTOFILL_SAVE_CARD_PROMPT_NEXT
+                                           : IDS_NO_THANKS);
     case UPLOAD_SAVE_CVC_FIX_FLOW_STEP_2_REQUEST_CVC:
-      DCHECK(button == ui::DIALOG_BUTTON_OK);
-      return l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_CARD_PROMPT_CONFIRM);
+      return l10n_util::GetStringUTF16(
+          button == ui::DIALOG_BUTTON_OK ? IDS_AUTOFILL_SAVE_CARD_PROMPT_CONFIRM
+                                         : IDS_NO_THANKS);
     default:
       NOTREACHED();
       return base::string16();
@@ -315,17 +311,17 @@
       views::CreateSolidBorder(1, SkColorSetA(SK_ColorBLACK, 10)));
   description_view->AddChildView(card_type_icon);
 
-  // Old UI shows last four digits and expiration.  New UI shows network and
-  // last four digits, but no expiration.
+  // Old UI shows last four digits and expiration.  New UI shows network, last
+  // four digits, and expiration.
   if (IsAutofillUpstreamShowNewUiExperimentEnabled()) {
     description_view->AddChildView(
         new views::Label(card.NetworkAndLastFourDigits()));
   } else {
     description_view->AddChildView(new views::Label(
         base::string16(kMidlineEllipsis) + card.LastFourDigits()));
-    description_view->AddChildView(
-        new views::Label(card.AbbreviatedExpirationDateForDisplay()));
   }
+  description_view->AddChildView(
+      new views::Label(card.AbbreviatedExpirationDateForDisplay()));
 
   // If applicable, add the upload explanation label.  Appears below the card
   // info when new UI experiment is disabled.
diff --git a/chrome/browser/ui/views/first_run_bubble_browsertest.cc b/chrome/browser/ui/views/first_run_bubble_browsertest.cc
new file mode 100644
index 0000000..997cb49a
--- /dev/null
+++ b/chrome/browser/ui/views/first_run_bubble_browsertest.cc
@@ -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.
+
+#include "chrome/browser/ui/views/first_run_bubble.h"
+
+#include <string>
+
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/test/test_browser_dialog.h"
+
+class FirstRunBubbleBrowserTest : public DialogBrowserTest {
+ public:
+  FirstRunBubbleBrowserTest() {}
+
+  // DialogBrowserTest:
+  void ShowDialog(const std::string& name) override {
+    FirstRunBubble::Show(browser());
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(FirstRunBubbleBrowserTest);
+};
+
+// Invokes a dialog that tells the user they can type into the omnibox to search
+// with Google. See test_browser_dialog.h.
+IN_PROC_BROWSER_TEST_F(FirstRunBubbleBrowserTest, InvokeDialog_default) {
+  RunDialog();
+}
diff --git a/chrome/browser/ui/views/ime/input_ime_apitest_nonchromeos.cc b/chrome/browser/ui/views/ime/input_ime_apitest_nonchromeos.cc
index 43d7fefa..4ff7555e 100644
--- a/chrome/browser/ui/views/ime/input_ime_apitest_nonchromeos.cc
+++ b/chrome/browser/ui/views/ime/input_ime_apitest_nonchromeos.cc
@@ -90,9 +90,9 @@
   // Test the input.ime.setComposition API.
   ui::CompositionText composition;
   composition.text = base::UTF8ToUTF16("test_set_composition");
-  composition.underlines.push_back(
-      ui::CompositionUnderline(0, composition.text.length(), SK_ColorBLACK,
-                               false /* thick */, SK_ColorTRANSPARENT));
+  composition.ime_text_spans.push_back(
+      ui::ImeTextSpan(0, composition.text.length(), SK_ColorBLACK,
+                      false /* thick */, SK_ColorTRANSPARENT));
   composition.selection = gfx::Range(2, 2);
   const std::vector<ui::CompositionText>& composition_history =
       client->composition_history();
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
index 5bb4f0a..e97fa6d 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
@@ -478,7 +478,9 @@
                         g_bottom_shadow.Get().height());
 
   ui::ClipRecorder clip_recorder(paint_info.context());
-  clip_recorder.ClipRect(contents_bounds);
+  clip_recorder.ClipRect(gfx::ScaleToRoundedRect(
+      contents_bounds, paint_info.paint_recording_scale_x(),
+      paint_info.paint_recording_scale_y()));
   {
     ui::PaintRecorder recorder(paint_info.context(), size());
     SkColor background_color = result_view_at(0)->GetColor(
diff --git a/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc
index fa54754..527dab5 100644
--- a/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc
+++ b/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc
@@ -71,6 +71,9 @@
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 class PaymentRequestJourneyLoggerNoSupportedPaymentMethodTest
@@ -99,8 +102,31 @@
       "PaymentRequest.CheckoutFunnel.NoShow",
       JourneyLogger::NOT_SHOWN_REASON_NO_SUPPORTED_PAYMENT_METHOD, 1);
 
-  // Make sure that no events were logged.
-  histogram_tester.ExpectTotalCount("PaymentRequest.Events", 0);
+  // Make sure the correct events were logged.
+  std::vector<base::Bucket> buckets =
+      histogram_tester.GetAllSamples("PaymentRequest.Events");
+  ASSERT_EQ(1U, buckets.size());
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SHOWN);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED);
+  EXPECT_FALSE(buckets[0].min &
+               JourneyLogger::EVENT_RECEIVED_INSTRUMENT_DETAILS);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SKIPPED_SHOW);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_COMPLETED);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_USER_ABORTED);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_OTHER_ABORTED);
+  EXPECT_FALSE(buckets[0].min &
+               JourneyLogger::EVENT_HAD_INITIAL_FORM_OF_PAYMENT);
+  EXPECT_FALSE(buckets[0].min &
+               JourneyLogger::EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_SHIPPING);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 class PaymentRequestJourneyLoggerMultipleShowTest
@@ -165,6 +191,9 @@
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 IN_PROC_BROWSER_TEST_F(PaymentRequestJourneyLoggerMultipleShowTest,
@@ -205,7 +234,7 @@
   // Make sure the correct events were logged.
   std::vector<base::Bucket> buckets =
       histogram_tester.GetAllSamples("PaymentRequest.Events");
-  ASSERT_EQ(1U, buckets.size());
+  ASSERT_EQ(2U, buckets.size());
   EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_SHOWN);
   EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED);
   EXPECT_TRUE(buckets[0].min &
@@ -224,6 +253,31 @@
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
+  // We log the exact same events again.
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_SHOWN);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED);
+  EXPECT_TRUE(buckets[0].min &
+              JourneyLogger::EVENT_RECEIVED_INSTRUMENT_DETAILS);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SKIPPED_SHOW);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_COMPLETED);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_USER_ABORTED);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_OTHER_ABORTED);
+  EXPECT_TRUE(buckets[0].min &
+              JourneyLogger::EVENT_HAD_INITIAL_FORM_OF_PAYMENT);
+  EXPECT_TRUE(buckets[0].min &
+              JourneyLogger::EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_SHIPPING);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 class PaymentRequestJourneyLoggerAllSectionStatsTest
@@ -289,6 +343,9 @@
   EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 // Tests that the correct number of suggestions shown for each section is logged
@@ -343,6 +400,9 @@
   EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 class PaymentRequestJourneyLoggerNoShippingSectionStatsTest
@@ -410,6 +470,9 @@
   EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 // Tests that the correct number of suggestions shown for each section is logged
@@ -465,6 +528,9 @@
   EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 class PaymentRequestJourneyLoggerNoContactDetailSectionStatsTest
@@ -534,6 +600,9 @@
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 // Tests that the correct number of suggestions shown for each section is logged
@@ -593,6 +662,9 @@
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 class PaymentRequestNotShownTest : public PaymentRequestBrowserTestBase {
@@ -623,7 +695,9 @@
   ASSERT_EQ(1U, buckets.size());
   // Only USER_ABORTED and CAN_MAKE_PAYMENT_FALSE should be logged.
   EXPECT_EQ(JourneyLogger::EVENT_USER_ABORTED |
-                JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE,
+                JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE |
+                JourneyLogger::EVENT_REQUEST_METHOD_OTHER |
+                JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD,
             buckets[0].min);
 
   // Make sure that the metrics that required the Payment Request to be shown
@@ -686,6 +760,9 @@
   EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 IN_PROC_BROWSER_TEST_F(PaymentRequestCompleteSuggestionsForEverythingTest,
@@ -723,6 +800,9 @@
   EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -766,6 +846,9 @@
   EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 }  // namespace payments
diff --git a/chrome/browser/ui/views/toolbar/app_menu_button.cc b/chrome/browser/ui/views/toolbar/app_menu_button.cc
index 025e164..75eb9aa 100644
--- a/chrome/browser/ui/views/toolbar/app_menu_button.cc
+++ b/chrome/browser/ui/views/toolbar/app_menu_button.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/ui/views/toolbar/app_menu_button.h"
 
-#include "base/command_line.h"
 #include "base/location.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
@@ -26,7 +25,7 @@
 #include "chrome/browser/ui/views/toolbar/app_menu.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_button.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
-#include "chrome/common/chrome_switches.h"
+#include "chrome/common/chrome_features.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/base/theme_provider.h"
 #include "ui/gfx/canvas.h"
@@ -53,8 +52,7 @@
   SetInkDropMode(InkDropMode::ON);
   SetFocusPainter(nullptr);
 
-  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-  if (command_line->HasSwitch(switches::kEnableNewAppMenuIcon)) {
+  if (base::FeatureList::IsEnabled(features::kAnimatedAppMenuIcon)) {
     toolbar_view_->browser()->tab_strip_model()->AddObserver(this);
     should_use_new_icon_ = true;
   }
diff --git a/chrome/browser/ui/webui/chromeos/login/DEPS b/chrome/browser/ui/webui/chromeos/login/DEPS
new file mode 100644
index 0000000..d7ca3f3
--- /dev/null
+++ b/chrome/browser/ui/webui/chromeos/login/DEPS
@@ -0,0 +1,6 @@
+specific_include_rules = {
+  # TODO(mash): Remove. http://crbug.com/720917.
+  "oobe_display_chooser\.*": [
+    "+ui/events/devices/device_data_manager.h",
+  ]
+}
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
index 810cc0b..4359367 100644
--- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -331,6 +331,13 @@
     params.SetString("enterpriseEnrollmentDomain",
                      enterprise_enrollment_domain);
   }
+  params.SetBoolean("enterpriseManagedDevice",
+                    g_browser_process->platform_part()
+                        ->browser_policy_connector_chromeos()
+                        ->IsEnterpriseManaged());
+  params.SetBoolean(
+      "hasDeviceOwner",
+      user_manager::UserManager::Get()->GetOwnerAccountId().is_valid());
 
   params.SetString("chromeType", GetChromeType());
   params.SetString("clientId",
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
index 89c8f21..10588b0 100644
--- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
@@ -132,8 +132,18 @@
 const char kBackgroundLockScreenApps[] = "LOCK_SCREEN_APPS_STATE.BACKGROUND";
 const char kForegroundLockScreenApps[] = "LOCK_SCREEN_APPS_STATE.FOREGROUND";
 const char kAvailableLockScreenApps[] = "LOCK_SCREEN_APPS_STATE.AVAILABLE";
-const char kLaunchRequestedLockScreenApps[] =
-    "LOCK_SCREEN_APPS_STATE.LAUNCH_REQUESTED";
+
+// Constants for new lock screen note request type.
+const char kNewNoteRequestTap[] = "NEW_NOTE_REQUEST.TAP";
+const char kNewNoteRequestSwipe[] = "NEW_NOTE_REQUEST.SWIPE";
+const char kNewNoteRequestKeyboard[] = "NEW_NOTE_REQUEST.KEYBOARD";
+
+// Constants for reporting action taken on lock screen UI when lock screen app
+// window was in background.
+const char kRequestShutdownFromLockScreenAppUnlockUi[] =
+    "LOCK_SCREEN_APPS_UNLOCK_ACTION.SHUTDOWN";
+const char kRequestSignoutFromLockScreenAppUnlockUi[] =
+    "LOCK_SCREEN_APPS_UNLOCK_ACTION.SIGN_OUT";
 
 ash::WallpaperController* GetWallpaperController() {
   if (!ash::Shell::HasInstance())
@@ -546,6 +556,10 @@
               &SigninScreenHandler::HandleLaunchArcKioskApp);
   AddCallback("setLockScreenAppsState",
               &SigninScreenHandler::HandleSetLockScreenAppsState);
+  AddCallback("recordLockScreenAppUnlockAction",
+              &SigninScreenHandler::HandleRecordLockScreenAppUnlockUIAction);
+  AddCallback("requestNewLockScreenNote",
+              &SigninScreenHandler::HandleRequestNewNoteAction);
 }
 
 void SigninScreenHandler::Show(const LoginScreenContext& context) {
@@ -1519,6 +1533,44 @@
                                       weak_factory_.GetWeakPtr()));
 }
 
+void SigninScreenHandler::HandleRequestNewNoteAction(
+    const std::string& request_type) {
+  lock_screen_apps::StateController* state_controller =
+      lock_screen_apps::StateController::Get();
+
+  if (request_type == kNewNoteRequestTap) {
+    state_controller->HandleNewNoteRequestFromLockScreen(
+        lock_screen_apps::StateController::NewNoteRequestType::
+            kLockScreenUiTap);
+  } else if (request_type == kNewNoteRequestSwipe) {
+    state_controller->HandleNewNoteRequestFromLockScreen(
+        lock_screen_apps::StateController::NewNoteRequestType::
+            kLockScreenUiSwipe);
+  } else if (request_type == kNewNoteRequestKeyboard) {
+    state_controller->HandleNewNoteRequestFromLockScreen(
+        lock_screen_apps::StateController::NewNoteRequestType::
+            kLockScreenUiKeyboard);
+  } else {
+    NOTREACHED() << "Unknown request type " << request_type;
+  }
+}
+
+void SigninScreenHandler::HandleRecordLockScreenAppUnlockUIAction(
+    const std::string& action) {
+  lock_screen_apps::StateController* state_controller =
+      lock_screen_apps::StateController::Get();
+
+  if (action == kRequestShutdownFromLockScreenAppUnlockUi) {
+    state_controller->RecordLockScreenAppUnlockAction(
+        lock_screen_apps::StateController::LockScreenUnlockAction::kShutdown);
+  } else if (action == kRequestSignoutFromLockScreenAppUnlockUi) {
+    state_controller->RecordLockScreenAppUnlockAction(
+        lock_screen_apps::StateController::LockScreenUnlockAction::kSignOut);
+  } else {
+    NOTREACHED() << "Unknown action " << action;
+  }
+}
+
 void SigninScreenHandler::HandleSetLockScreenAppsState(
     const std::string& state) {
   lock_screen_apps::StateController* state_controller =
@@ -1528,8 +1580,6 @@
     state_controller->MoveToBackground();
   } else if (state == kForegroundLockScreenApps) {
     state_controller->MoveToForeground();
-  } else if (state == kLaunchRequestedLockScreenApps) {
-    state_controller->RequestNewLockScreenNote();
   }
 }
 
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
index 6c2cad97..1a1a349 100644
--- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
@@ -426,6 +426,8 @@
   void HandleFirstIncorrectPasswordAttempt(const AccountId& account_id);
   void HandleMaxIncorrectPasswordAttempts(const AccountId& account_id);
   void HandleSendFeedbackAndResyncUserData();
+  void HandleRequestNewNoteAction(const std::string& request_type);
+  void HandleRecordLockScreenAppUnlockUIAction(const std::string& action);
   void HandleSetLockScreenAppsState(const std::string& state);
 
   // Sends the list of |keyboard_layouts| available for the |locale| that is
diff --git a/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc b/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc
index 3db6e62..a327c58 100644
--- a/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc
+++ b/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc
@@ -63,8 +63,13 @@
     CrosSettings::Initialize();
 
     NetworkHandler::Initialize();
+    base::RunLoop().RunUntilIdle();
+  }
+
+  void SetEthernetService() {
     ShillServiceClient::TestInterface* service_test =
         DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface();
+    service_test->ClearServices();
     service_test->AddService("/service/eth",
                              "eth" /* guid */,
                              "eth",
@@ -73,6 +78,16 @@
     base::RunLoop().RunUntilIdle();
   }
 
+  void SetCellularService() {
+    ShillServiceClient::TestInterface* service_test =
+        DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface();
+    service_test->ClearServices();
+    service_test->AddService("/service/cell", "cell" /* guid */, "cell",
+                             shill::kTypeCellular, shill::kStateOnline,
+                             true /* visible */);
+    base::RunLoop().RunUntilIdle();
+  }
+
   void TearDown() override {
     NetworkHandler::Shutdown();
 
@@ -101,6 +116,7 @@
 // 4. When update engine becomes idle downloading of the stable channel is
 // initiated.
 TEST_F(VersionUpdaterCrosTest, TwoOverlappingSetChannelRequests) {
+  SetEthernetService();
   version_updater_->SetChannel("beta-channel", true);
 
   {
@@ -152,4 +168,27 @@
   EXPECT_EQ(2, fake_update_engine_client_->request_update_check_call_count());
 }
 
+// Test that when interactively checking for update, cellular connection is
+// allowed in Chrome by default, so that the request will be sent to Update
+// Engine.
+TEST_F(VersionUpdaterCrosTest, InteractiveCellularUpdateAllowed) {
+  SetCellularService();
+  EXPECT_EQ(0, fake_update_engine_client_->request_update_check_call_count());
+  version_updater_->CheckForUpdate(base::Bind(&CheckNotification),
+                                   VersionUpdater::PromoteCallback());
+  EXPECT_EQ(1, fake_update_engine_client_->request_update_check_call_count());
+}
+
+// Test that after update over cellular one time permission is set successfully,
+// an update check will be triggered.
+TEST_F(VersionUpdaterCrosTest, CellularUpdateOneTimePermission) {
+  SetCellularService();
+  EXPECT_EQ(0, fake_update_engine_client_->request_update_check_call_count());
+  const std::string& update_version = "9999.0.0";
+  const int64_t update_size = 99999;
+  version_updater_->SetUpdateOverCellularOneTimePermission(
+      base::Bind(&CheckNotification), update_version, update_size);
+  EXPECT_EQ(1, fake_update_engine_client_->request_update_check_call_count());
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/ui/webui/media_router/media_router_localized_strings_provider.cc b/chrome/browser/ui/webui/media_router/media_router_localized_strings_provider.cc
index 17af03a..416111a 100644
--- a/chrome/browser/ui/webui/media_router/media_router_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/media_router/media_router_localized_strings_provider.cc
@@ -49,6 +49,10 @@
                                   IDS_MEDIA_ROUTER_ROUTE_DETAILS_SEEK_TITLE);
   html_source->AddLocalizedString("volumeTitle",
                                   IDS_MEDIA_ROUTER_ROUTE_DETAILS_VOLUME_TITLE);
+  html_source->AddLocalizedString(
+      "currentTimeLabel", IDS_MEDIA_ROUTER_ROUTE_DETAILS_CURRENT_TIME_LABEL);
+  html_source->AddLocalizedString(
+      "durationLabel", IDS_MEDIA_ROUTER_ROUTE_DETAILS_DURATION_LABEL);
 }
 
 void AddIssuesStrings(content::WebUIDataSource* html_source) {
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
index 7e3fbe8..d0325e68 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -617,6 +617,11 @@
       "grantExtensionPrinterAccess",
       base::Bind(&PrintPreviewHandler::HandleGrantExtensionPrinterAccess,
                  base::Unretained(this)));
+}
+
+void PrintPreviewHandler::OnJavascriptAllowed() {
+  // Now that the UI is initialized, any future account changes will require
+  // a printer list refresh.
   RegisterForGaiaCookieChanges();
 }
 
@@ -624,6 +629,7 @@
   // Normally the handler and print preview will be destroyed together, but
   // this is necessary for refresh or navigation from the chrome://print page.
   weak_factory_.InvalidateWeakPtrs();
+  UnregisterForGaiaCookieChanges();
 }
 
 WebContents* PrintPreviewHandler::preview_web_contents() const {
@@ -1439,7 +1445,7 @@
 }
 
 void PrintPreviewHandler::OnPrintPreviewReady(int preview_uid, int request_id) {
-  if (request_id < 0 || preview_callbacks_.empty()) {
+  if (request_id < 0 || preview_callbacks_.empty() || !IsJavascriptAllowed()) {
     // invalid ID or extra message
     BadMessageReceived();
     return;
@@ -1451,7 +1457,7 @@
 }
 
 void PrintPreviewHandler::OnPrintPreviewFailed() {
-  if (preview_callbacks_.empty()) {
+  if (preview_callbacks_.empty() || !IsJavascriptAllowed()) {
     BadMessageReceived();
     return;
   }
@@ -1466,7 +1472,7 @@
 }
 
 void PrintPreviewHandler::OnInvalidPrinterSettings() {
-  if (preview_callbacks_.empty()) {
+  if (preview_callbacks_.empty() || !IsJavascriptAllowed()) {
     BadMessageReceived();
     return;
   }
@@ -1479,6 +1485,11 @@
 void PrintPreviewHandler::SendPrintPresetOptions(bool disable_scaling,
                                                  int copies,
                                                  int duplex) {
+  if (preview_callbacks_.empty() || !IsJavascriptAllowed()) {
+    BadMessageReceived();
+    return;
+  }
+
   FireWebUIListener("print-preset-options", base::Value(disable_scaling),
                     base::Value(copies), base::Value(duplex));
 }
@@ -1486,6 +1497,11 @@
 void PrintPreviewHandler::SendPageCountReady(int page_count,
                                              int request_id,
                                              int fit_to_page_scaling) {
+  if (preview_callbacks_.empty() || !IsJavascriptAllowed()) {
+    BadMessageReceived();
+    return;
+  }
+
   FireWebUIListener("page-count-ready", base::Value(page_count),
                     base::Value(request_id), base::Value(fit_to_page_scaling));
 }
@@ -1493,6 +1509,11 @@
 void PrintPreviewHandler::SendPageLayoutReady(
     const base::DictionaryValue& layout,
     bool has_custom_page_size_style) {
+  if (preview_callbacks_.empty() || !IsJavascriptAllowed()) {
+    BadMessageReceived();
+    return;
+  }
+
   FireWebUIListener("page-layout-ready", layout,
                     base::Value(has_custom_page_size_style));
 }
@@ -1500,12 +1521,17 @@
 void PrintPreviewHandler::SendPagePreviewReady(int page_index,
                                                int preview_uid,
                                                int preview_response_id) {
+  if (!IsJavascriptAllowed()) {
+    BadMessageReceived();
+    return;
+  }
+
   FireWebUIListener("page-preview-ready", base::Value(page_index),
                     base::Value(preview_uid), base::Value(preview_response_id));
 }
 
 void PrintPreviewHandler::OnPrintPreviewCancelled() {
-  if (preview_callbacks_.empty()) {
+  if (preview_callbacks_.empty() || !IsJavascriptAllowed()) {
     BadMessageReceived();
     return;
   }
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.h b/chrome/browser/ui/webui/print_preview/print_preview_handler.h
index 72654d9a..9cf1bd3e 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.h
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.h
@@ -54,7 +54,7 @@
 
   // WebUIMessageHandler implementation.
   void RegisterMessages() override;
-
+  void OnJavascriptAllowed() override;
   void OnJavascriptDisallowed() override;
 
   // SelectFileDialog::Listener implementation.
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 e6f86a8..f482fab 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
@@ -1497,7 +1497,6 @@
     {"cupsPrintersLearnMoreLabel",
      IDS_SETTINGS_PRINTING_CUPS_PRINTERS_LEARN_MORE_LABEL},
     {"addCupsPrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_ADD_PRINTER},
-    {"cupsPrinterDetails", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_DETAILS},
     {"editPrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_EDIT},
     {"removePrinter", IDS_SETTINGS_PRINTING_CUPS_PRINTERS_REMOVE},
     {"searchLabel", IDS_SETTINGS_PRINTING_CUPS_SEARCH_LABEL},
diff --git a/chrome/browser/ui/webui/snippets_internals_message_handler.cc b/chrome/browser/ui/webui/snippets_internals_message_handler.cc
index 96b03881..f79159d 100644
--- a/chrome/browser/ui/webui/snippets_internals_message_handler.cc
+++ b/chrome/browser/ui/webui/snippets_internals_message_handler.cc
@@ -33,7 +33,7 @@
 #include "components/ntp_snippets/category.h"
 #include "components/ntp_snippets/category_info.h"
 #include "components/ntp_snippets/category_rankers/category_ranker.h"
-#include "components/ntp_snippets/contextual_suggestions_source.h"
+#include "components/ntp_snippets/contextual/contextual_suggestions_source.h"
 #include "components/ntp_snippets/features.h"
 #include "components/ntp_snippets/pref_names.h"
 #include "components/ntp_snippets/remote/remote_suggestions_fetcher.h"
diff --git a/chrome/common/DEPS b/chrome/common/DEPS
index f50eedd..a715de2c 100644
--- a/chrome/common/DEPS
+++ b/chrome/common/DEPS
@@ -24,7 +24,7 @@
   "+components/password_manager/core/common",
   "+components/policy/core/common",
   "+components/printing/common",
-  "+components/safe_browsing/csd.pb.h",
+  "+components/safe_browsing/proto/csd.pb.h",
   "+components/safe_browsing/web_ui/constants.h",
   "+components/signin/core/common",
   "+components/translate/core/common",
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index e113fad..2dd561d5 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -35,6 +35,8 @@
 #endif  // defined(OS_MACOSX)
 
 #if !defined(OS_ANDROID)
+const base::Feature kAnimatedAppMenuIcon{"AnimatedAppMenuIcon",
+                                         base::FEATURE_DISABLED_BY_DEFAULT};
 const base::Feature kAppBanners {
   "AppBanners",
 #if defined(OS_CHROMEOS)
@@ -382,6 +384,12 @@
 // foreground tab's user experience.
 const base::Feature kStaggeredBackgroundTabOpen{
     "StaggeredBackgroundTabOpen", base::FEATURE_DISABLED_BY_DEFAULT};
+
+// This controls whether we are running experiment with staggered background
+// tab open. For control group, this should be disabled. This depends on
+// |kStaggeredBackgroundTabOpen| above.
+const base::Feature kStaggeredBackgroundTabOpenExperiment{
+    "StaggeredBackgroundTabOpenExperiment", base::FEATURE_ENABLED_BY_DEFAULT};
 #endif
 
 // Enables or disables the creation of (legacy) supervised users. Does not
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 0405db64..64a25d55 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -30,6 +30,7 @@
 #endif  // defined(OS_MACOSX)
 
 #if !defined(OS_ANDROID)
+extern const base::Feature kAnimatedAppMenuIcon;
 extern const base::Feature kAppBanners;
 #endif  // !defined(OS_ANDROID)
 
@@ -197,6 +198,7 @@
 
 #if !defined(OS_ANDROID)
 extern const base::Feature kStaggeredBackgroundTabOpen;
+extern const base::Feature kStaggeredBackgroundTabOpenExperiment;
 #endif
 
 extern const base::Feature kSupervisedUserCreation;
diff --git a/chrome/common/extensions/api/common_extension_api_unittest.cc b/chrome/common/extensions/api/common_extension_api_unittest.cc
index 94b67b94c..711e1fb 100644
--- a/chrome/common/extensions/api/common_extension_api_unittest.cc
+++ b/chrome/common/extensions/api/common_extension_api_unittest.cc
@@ -252,7 +252,8 @@
                            .Set("manifest_version", 2)
                            .Build())
           .Build();
-  Feature* test_feature = api_feature_provider.GetFeature("alias_api_source");
+  const Feature* test_feature =
+      api_feature_provider.GetFeature("alias_api_source");
   ASSERT_TRUE(test_feature);
   ASSERT_FALSE(api.IsAnyFeatureAvailableToContext(
       *test_feature, extension.get(), Feature::UNBLESSED_EXTENSION_CONTEXT,
@@ -327,7 +328,7 @@
       api.add_fake_schema(key);
     ExtensionAPI::OverrideSharedInstanceForTest scope(&api);
 
-    Feature* test_feature =
+    const Feature* test_feature =
         api_feature_provider.GetFeature(test_data[i].api_full_name);
     ASSERT_TRUE(test_feature);
     EXPECT_EQ(test_data[i].expect_is_available,
@@ -753,18 +754,19 @@
   std::unique_ptr<ExtensionAPI> api(
       ExtensionAPI::CreateWithDefaultConfiguration());
 
-  SimpleFeature* browser_action = static_cast<SimpleFeature*>(
+  const SimpleFeature* browser_action = static_cast<const SimpleFeature*>(
       api->GetFeatureDependency("api:browserAction"));
-  SimpleFeature* browser_action_set_title = static_cast<SimpleFeature*>(
-      api->GetFeatureDependency("api:browserAction.setTitle"));
+  const SimpleFeature* browser_action_set_title =
+      static_cast<const SimpleFeature*>(
+          api->GetFeatureDependency("api:browserAction.setTitle"));
 
   struct {
-    SimpleFeature* feature;
+    const SimpleFeature* feature;
     // TODO(aa): More stuff to test over time.
   } test_data[] = {{browser_action}, {browser_action_set_title}};
 
   for (size_t i = 0; i < arraysize(test_data); ++i) {
-    SimpleFeature* feature = test_data[i].feature;
+    const SimpleFeature* feature = test_data[i].feature;
     ASSERT_TRUE(feature) << i;
 
     EXPECT_TRUE(feature->whitelist().empty());
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 3b455db41..62df9387 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -144,8 +144,9 @@
 // shutdown. Used to determine the exit type the last time the profile was open.
 const char kSessionExitType[] = "profile.exit_type";
 
-// Stores the total amount of active session time for the user.
-const char kSessionTimeTotal[] = "profile.total_time";
+// Stores the total amount of observed active session time for the user.
+// Observed time is active session time.
+const char kObservedSessionTime[] = "profile.observed_time";
 
 // The last time that the site engagement service recorded an engagement event
 // for this profile for any URL. Recorded only during shutdown. Used to prevent
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index f4928d6..da46f99f 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -56,7 +56,7 @@
 extern const char kRestoreOnStartup[];
 extern const char kSessionExitedCleanly[];
 extern const char kSessionExitType[];
-extern const char kSessionTimeTotal[];
+extern const char kObservedSessionTime[];
 extern const char kSiteEngagementLastUpdateTime[];
 extern const char kSupervisedUserApprovedExtensions[];
 extern const char kSupervisedUserCustodianEmail[];
diff --git a/chrome/common/safe_browsing/archive_analyzer_results.h b/chrome/common/safe_browsing/archive_analyzer_results.h
index a9635aa..b0c6e110 100644
--- a/chrome/common/safe_browsing/archive_analyzer_results.h
+++ b/chrome/common/safe_browsing/archive_analyzer_results.h
@@ -12,7 +12,7 @@
 
 #include "base/files/file_path.h"
 #include "build/build_config.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 namespace safe_browsing {
 
@@ -33,4 +33,4 @@
 
 }  // namespace safe_browsing
 
-#endif  // CHROME_COMMON_SAFE_BROWSING_ARCHIVE_ANALYZER_RESULTS_H_
\ No newline at end of file
+#endif  // CHROME_COMMON_SAFE_BROWSING_ARCHIVE_ANALYZER_RESULTS_H_
diff --git a/chrome/common/safe_browsing/binary_feature_extractor.cc b/chrome/common/safe_browsing/binary_feature_extractor.cc
index 538a81e..896768a6 100644
--- a/chrome/common/safe_browsing/binary_feature_extractor.cc
+++ b/chrome/common/safe_browsing/binary_feature_extractor.cc
@@ -10,7 +10,7 @@
 #include "base/files/file.h"
 #include "base/files/file_path.h"
 #include "base/files/memory_mapped_file.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "crypto/secure_hash.h"
 #include "crypto/sha2.h"
 
diff --git a/chrome/common/safe_browsing/binary_feature_extractor_mac.cc b/chrome/common/safe_browsing/binary_feature_extractor_mac.cc
index 7d64fae..9edb648 100644
--- a/chrome/common/safe_browsing/binary_feature_extractor_mac.cc
+++ b/chrome/common/safe_browsing/binary_feature_extractor_mac.cc
@@ -8,7 +8,7 @@
 #include <stdint.h>
 
 #include "chrome/common/safe_browsing/mach_o_image_reader_mac.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 namespace safe_browsing {
 
diff --git a/chrome/common/safe_browsing/binary_feature_extractor_mac_unittest.cc b/chrome/common/safe_browsing/binary_feature_extractor_mac_unittest.cc
index ec29387..f4fa75f 100644
--- a/chrome/common/safe_browsing/binary_feature_extractor_mac_unittest.cc
+++ b/chrome/common/safe_browsing/binary_feature_extractor_mac_unittest.cc
@@ -7,7 +7,7 @@
 #include "base/files/file_path.h"
 #include "base/path_service.h"
 #include "chrome/common/chrome_paths.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace safe_browsing {
diff --git a/chrome/common/safe_browsing/binary_feature_extractor_unittest.cc b/chrome/common/safe_browsing/binary_feature_extractor_unittest.cc
index 48b1847..8cc9823 100644
--- a/chrome/common/safe_browsing/binary_feature_extractor_unittest.cc
+++ b/chrome/common/safe_browsing/binary_feature_extractor_unittest.cc
@@ -13,7 +13,7 @@
 #include "base/files/file.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/path_service.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "crypto/sha2.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/chrome/common/safe_browsing/binary_feature_extractor_win.cc b/chrome/common/safe_browsing/binary_feature_extractor_win.cc
index ffdb9186..52a11373 100644
--- a/chrome/common/safe_browsing/binary_feature_extractor_win.cc
+++ b/chrome/common/safe_browsing/binary_feature_extractor_win.cc
@@ -13,7 +13,7 @@
 #include "base/files/file_path.h"
 #include "base/logging.h"
 #include "chrome/common/safe_browsing/pe_image_reader_win.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 namespace safe_browsing {
 
diff --git a/chrome/common/safe_browsing/binary_feature_extractor_win_unittest.cc b/chrome/common/safe_browsing/binary_feature_extractor_win_unittest.cc
index 63974925..e72c7382 100644
--- a/chrome/common/safe_browsing/binary_feature_extractor_win_unittest.cc
+++ b/chrome/common/safe_browsing/binary_feature_extractor_win_unittest.cc
@@ -12,7 +12,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/path_service.h"
 #include "chrome/common/chrome_paths.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "net/cert/x509_cert_types.h"
 #include "net/cert/x509_certificate.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/common/safe_browsing/download_protection_util.h b/chrome/common/safe_browsing/download_protection_util.h
index dedc2865..d2e4579 100644
--- a/chrome/common/safe_browsing/download_protection_util.h
+++ b/chrome/common/safe_browsing/download_protection_util.h
@@ -6,7 +6,7 @@
 #define CHROME_COMMON_SAFE_BROWSING_DOWNLOAD_PROTECTION_UTIL_H_
 
 #include "base/files/file_path.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 namespace safe_browsing {
 namespace download_protection_util {
diff --git a/chrome/common/safe_browsing/zip_analyzer.cc b/chrome/common/safe_browsing/zip_analyzer.cc
index 0d31d080..29f625b 100644
--- a/chrome/common/safe_browsing/zip_analyzer.cc
+++ b/chrome/common/safe_browsing/zip_analyzer.cc
@@ -19,7 +19,7 @@
 #include "chrome/common/safe_browsing/binary_feature_extractor.h"
 #include "chrome/common/safe_browsing/download_protection_util.h"
 #include "chrome/common/safe_browsing/file_type_policies.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "crypto/secure_hash.h"
 #include "crypto/sha2.h"
 #include "third_party/zlib/google/zip_reader.h"
diff --git a/chrome/common/safe_browsing/zip_analyzer.h b/chrome/common/safe_browsing/zip_analyzer.h
index 5b3c009..2e2a965ad 100644
--- a/chrome/common/safe_browsing/zip_analyzer.h
+++ b/chrome/common/safe_browsing/zip_analyzer.h
@@ -9,7 +9,7 @@
 #define CHROME_COMMON_SAFE_BROWSING_ZIP_ANALYZER_H_
 
 #include "base/files/file.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 namespace safe_browsing {
 
diff --git a/chrome/installer/zucchini/BUILD.gn b/chrome/installer/zucchini/BUILD.gn
index 805ae5f..9e406904 100644
--- a/chrome/installer/zucchini/BUILD.gn
+++ b/chrome/installer/zucchini/BUILD.gn
@@ -3,6 +3,7 @@
 # found in the LICENSE file.
 
 import("//chrome/process_version_rc_template.gni")
+import("//testing/libfuzzer/fuzzer_test.gni")
 import("//testing/test.gni")
 
 static_library("zucchini_lib") {
@@ -19,6 +20,8 @@
     "disassembler.h",
     "disassembler_no_op.cc",
     "disassembler_no_op.h",
+    "element_detection.cc",
+    "element_detection.h",
     "encoded_view.cc",
     "encoded_view.h",
     "equivalence_map.cc",
@@ -79,12 +82,23 @@
   }
 }
 
+fuzzer_test("zucchini_patch_fuzzer") {
+  sources = [
+    "patch_fuzzer.cc",
+  ]
+  deps = [
+    ":zucchini_lib",
+    "//base",
+  ]
+}
+
 test("zucchini_unittests") {
   sources = [
     "buffer_sink_unittest.cc",
     "buffer_source_unittest.cc",
     "buffer_view_unittest.cc",
     "crc32_unittest.cc",
+    "element_detection_unittest.cc",
     "encoded_view_unittest.cc",
     "equivalence_map_unittest.cc",
     "image_index_unittest.cc",
diff --git a/chrome/installer/zucchini/element_detection.cc b/chrome/installer/zucchini/element_detection.cc
new file mode 100644
index 0000000..4debf36
--- /dev/null
+++ b/chrome/installer/zucchini/element_detection.cc
@@ -0,0 +1,65 @@
+// 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/installer/zucchini/element_detection.h"
+
+#include <utility>
+
+#include "base/logging.h"
+#include "chrome/installer/zucchini/disassembler.h"
+#include "chrome/installer/zucchini/disassembler_no_op.h"
+
+namespace zucchini {
+
+/******** Utility Functions ********/
+
+std::unique_ptr<Disassembler> MakeDisassemblerWithoutFallback(
+    ConstBufferView image) {
+  // TODO(etiennep): Add disassembler implementations.
+  return nullptr;
+}
+
+std::unique_ptr<Disassembler> MakeDisassemblerOfType(ConstBufferView image,
+                                                     ExecutableType exe_type) {
+  switch (exe_type) {
+    case kExeTypeNoOp:
+      return DisassemblerNoOp::Make(image);
+    default:
+      return nullptr;
+  }
+}
+
+std::unique_ptr<Disassembler> MakeNoOpDisassembler(ConstBufferView image) {
+  return DisassemblerNoOp::Make(image);
+}
+
+base::Optional<Element> DetectElementFromDisassembler(ConstBufferView image) {
+  std::unique_ptr<Disassembler> disasm = MakeDisassemblerWithoutFallback(image);
+  if (disasm)
+    return Element(disasm->GetExeType(), {0, disasm->size()});
+  return base::nullopt;
+}
+
+/******** ProgramScanner ********/
+
+ElementFinder::ElementFinder(ConstBufferView image, ElementDetector&& detector)
+    : image_(image), detector_(std::move(detector)) {}
+
+ElementFinder::~ElementFinder() = default;
+
+base::Optional<Element> ElementFinder::GetNext() {
+  for (; pos_ < image_.size(); ++pos_) {
+    ConstBufferView test_image =
+        ConstBufferView::FromRange(image_.begin() + pos_, image_.end());
+    base::Optional<Element> element = detector_.Run(test_image);
+    if (element) {
+      element->offset += pos_;
+      pos_ = element->EndOffset();
+      return element;
+    }
+  }
+  return base::nullopt;
+}
+
+}  // namespace zucchini
diff --git a/chrome/installer/zucchini/element_detection.h b/chrome/installer/zucchini/element_detection.h
new file mode 100644
index 0000000..c0f52d1
--- /dev/null
+++ b/chrome/installer/zucchini/element_detection.h
@@ -0,0 +1,63 @@
+// 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_INSTALLER_ZUCCHINI_ELEMENT_DETECTION_H_
+#define CHROME_INSTALLER_ZUCCHINI_ELEMENT_DETECTION_H_
+
+#include <stddef.h>
+
+#include <memory>
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "base/optional.h"
+#include "chrome/installer/zucchini/buffer_view.h"
+#include "chrome/installer/zucchini/image_utils.h"
+
+namespace zucchini {
+
+class Disassembler;
+
+// Attempts to detect an executable located at start of |image|. If found,
+// returns the corresponding disassembler. Otherwise returns null.
+std::unique_ptr<Disassembler> MakeDisassemblerWithoutFallback(
+    ConstBufferView image);
+
+// Attempts to create a disassembler corresponding to |exe_type| and initialize
+// it with |image|, On failure, returns null.
+std::unique_ptr<Disassembler> MakeDisassemblerOfType(ConstBufferView image,
+                                                     ExecutableType exe_type);
+
+// Returns a new instance of DisassemblerNoOp.
+std::unique_ptr<Disassembler> MakeNoOpDisassembler(ConstBufferView image);
+
+// Attempts to detect an element associated with |image| and returns it, or
+// returns nullopt if no element is detected.
+using ElementDetector =
+    base::RepeatingCallback<base::Optional<Element>(ConstBufferView image)>;
+
+// Implementation of ElementDetector using disassemblers.
+base::Optional<Element> DetectElementFromDisassembler(ConstBufferView image);
+
+// A class to scan through an image and iteratively detect elements.
+class ElementFinder {
+ public:
+  ElementFinder(ConstBufferView image, ElementDetector&& detector);
+  ~ElementFinder();
+
+  // Scans for the next executable using |detector|. Returns the next element
+  // found, or nullopt if no more element can be found.
+  base::Optional<Element> GetNext();
+
+ private:
+  ConstBufferView image_;
+  ElementDetector detector_;
+  offset_t pos_ = 0;
+
+  DISALLOW_COPY_AND_ASSIGN(ElementFinder);
+};
+
+}  // namespace zucchini
+
+#endif  // CHROME_INSTALLER_ZUCCHINI_ELEMENT_DETECTION_H_
diff --git a/chrome/installer/zucchini/element_detection_unittest.cc b/chrome/installer/zucchini/element_detection_unittest.cc
new file mode 100644
index 0000000..79f8a88
--- /dev/null
+++ b/chrome/installer/zucchini/element_detection_unittest.cc
@@ -0,0 +1,75 @@
+// 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/installer/zucchini/element_detection.h"
+
+#include <vector>
+
+#include "base/bind.h"
+#include "chrome/installer/zucchini/buffer_view.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace zucchini {
+
+namespace {
+
+using ElementVector = std::vector<Element>;
+
+}  // namespace
+
+TEST(ElementDetectionTest, ElementFinderEmpty) {
+  std::vector<uint8_t> buffer(10, 0);
+  ElementFinder finder(
+      ConstBufferView(buffer.data(), buffer.size()),
+      base::BindRepeating([](ConstBufferView image) -> base::Optional<Element> {
+        return base::nullopt;
+      }));
+  EXPECT_EQ(base::nullopt, finder.GetNext());
+}
+
+ElementVector TestElementFinder(std::vector<uint8_t> buffer) {
+  ConstBufferView image(buffer.data(), buffer.size());
+
+  ElementFinder finder(
+      image,
+      base::BindRepeating(
+          [](ConstBufferView image,
+             ConstBufferView region) -> base::Optional<Element> {
+            EXPECT_GE(region.begin(), image.begin());
+            EXPECT_LE(region.end(), image.end());
+            EXPECT_GE(region.size(), 0U);
+
+            if (region[0] != 0) {
+              offset_t length = 1;
+              while (length < region.size() && region[length] == region[0])
+                ++length;
+              return Element{static_cast<ExecutableType>(region[0]), 0U,
+                             length};
+            }
+            return base::nullopt;
+          },
+          image));
+  std::vector<Element> elements;
+  for (auto element = finder.GetNext(); element; element = finder.GetNext()) {
+    elements.push_back(*element);
+  }
+  return elements;
+}
+
+TEST(ElementDetectionTest, ElementFinder) {
+  EXPECT_EQ(ElementVector(), TestElementFinder({}));
+  EXPECT_EQ(ElementVector(), TestElementFinder({0, 0}));
+  EXPECT_EQ(ElementVector({{kExeTypeWin32X86, 0, 2}}),
+            TestElementFinder({1, 1}));
+  EXPECT_EQ(ElementVector({{kExeTypeWin32X86, 0, 2}, {kExeTypeWin32X64, 2, 2}}),
+            TestElementFinder({1, 1, 2, 2}));
+  EXPECT_EQ(ElementVector({{kExeTypeWin32X86, 1, 2}}),
+            TestElementFinder({0, 1, 1, 0}));
+  EXPECT_EQ(ElementVector({{kExeTypeWin32X86, 1, 2}, {kExeTypeWin32X64, 3, 3}}),
+            TestElementFinder({0, 1, 1, 2, 2, 2}));
+  EXPECT_EQ(ElementVector({{kExeTypeWin32X86, 1, 2}, {kExeTypeWin32X64, 4, 3}}),
+            TestElementFinder({0, 1, 1, 0, 2, 2, 2}));
+}
+
+}  // namespace zucchini
diff --git a/chrome/installer/zucchini/image_utils.h b/chrome/installer/zucchini/image_utils.h
index 6af8db7..77d1e07 100644
--- a/chrome/installer/zucchini/image_utils.h
+++ b/chrome/installer/zucchini/image_utils.h
@@ -147,15 +147,12 @@
   Element() = default;
   constexpr Element(ExecutableType exe_type, offset_t offset, offset_t length)
       : exe_type(exe_type), offset(offset), length(length) {}
-  constexpr explicit Element(BufferRegion region)
-      : exe_type(kExeTypeNoOp),
+  constexpr explicit Element(ExecutableType exe_type, BufferRegion region)
+      : exe_type(exe_type),
         offset(base::checked_cast<offset_t>(region.offset)),
         length(base::checked_cast<offset_t>(region.size)) {}
-
-  ExecutableType exe_type;
-  offset_t offset;
-  offset_t length;
-  // TODO(huangs): Use BufferRegion.
+  constexpr explicit Element(BufferRegion region)
+      : Element(kExeTypeNoOp, region) {}
 
   // Returns the end offset of this element.
   offset_t EndOffset() const { return offset + length; }
@@ -167,14 +164,24 @@
   }
 
   BufferRegion region() const { return {offset, length}; }
+
+  friend bool operator==(const Element& a, const Element& b) {
+    return a.exe_type == b.exe_type && a.offset == b.offset &&
+           a.length == b.length;
+  }
+
+  ExecutableType exe_type;
+  offset_t offset;
+  offset_t length;
+  // TODO(huangs): Use BufferRegion.
 };
 
 // A matched pair of Elements.
 struct ElementMatch {
+  bool IsValid() const { return old_element.exe_type == new_element.exe_type; }
+
   Element old_element;
   Element new_element;
-
-  bool IsValid() const { return old_element.exe_type == new_element.exe_type; }
 };
 
 }  // namespace zucchini
diff --git a/chrome/installer/zucchini/patch_fuzzer.cc b/chrome/installer/zucchini/patch_fuzzer.cc
new file mode 100644
index 0000000..e4d61c1
--- /dev/null
+++ b/chrome/installer/zucchini/patch_fuzzer.cc
@@ -0,0 +1,19 @@
+// 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 <stddef.h>
+#include <stdint.h>
+
+#include "base/optional.h"
+#include "chrome/installer/zucchini/buffer_view.h"
+#include "chrome/installer/zucchini/patch_reader.h"
+
+// Entry point for LibFuzzer.
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  logging::SetMinLogLevel(3);  // Disable console spamming.
+  zucchini::ConstBufferView patch(data, size);
+  base::Optional<zucchini::EnsemblePatchReader> patch_reader =
+      zucchini::EnsemblePatchReader::Create(patch);
+  return 0;
+}
diff --git a/chrome/profiling/BUILD.gn b/chrome/profiling/BUILD.gn
index 01b0589c..d6b1f49 100644
--- a/chrome/profiling/BUILD.gn
+++ b/chrome/profiling/BUILD.gn
@@ -40,7 +40,9 @@
     deps = [
       "//base",
       "//chrome/common",
+      "//content/public/child",
       "//mojo/edk/system",
+      "//services/resource_coordinator/public/cpp:resource_coordinator_cpp",
     ]
   }
 
diff --git a/chrome/profiling/DEPS b/chrome/profiling/DEPS
index 08bf5f3..a79c379 100644
--- a/chrome/profiling/DEPS
+++ b/chrome/profiling/DEPS
@@ -1,5 +1,6 @@
-include_rules = [

-  "+content/public/child",

-  "+mojo/edk/embedder",

-  "+services/service_manager/public/cpp",

-]

+include_rules = [
+  "+content/public/child",
+  "+mojo/edk/embedder",
+  "+services/resource_coordinator/public",
+  "+services/service_manager/public/cpp",
+]
diff --git a/chrome/profiling/json_exporter.cc b/chrome/profiling/json_exporter.cc
index 9e0bf06..e490fa6fb 100644
--- a/chrome/profiling/json_exporter.cc
+++ b/chrome/profiling/json_exporter.cc
@@ -7,6 +7,8 @@
 #include <map>
 
 #include "base/strings/string_number_conversions.h"
+#include "base/trace_event/trace_event_argument.h"
+#include "services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.h"
 
 namespace profiling {
 
@@ -54,21 +56,38 @@
       << "\"args\":{\"name\":\"Browser process\"}}";
 }
 
-// Writes the dictionary keys to preceed a "heaps_v2" trace argument. This is
-// "v2" heap dump format.
-void WriteHeapsV2Header(int pid, std::ostream& out) {
+// Writes the dictionary keys to preceed a "dumps" trace argument.
+void WriteDumpsHeader(int pid, std::ostream& out) {
   out << "{ \"pid\":" << pid << ",";
   out << "\"ph\":\"v\",";
   out << "\"name\":\"periodic_interval\",";
   out << "\"args\":{";
-  out << "\"dumps\":{";
-  out << "\"level_of_detail\":\"detailed\",";
+  out << "\"dumps\":{\n";
+}
+
+void WriteDumpsFooter(std::ostream& out) {
+  out << "}}}";  // dumps, args, event
+}
+
+// Writes the dictionary keys to preceed a "heaps_v2" trace argument inside a
+// "dumps". This is "v2" heap dump format.
+void WriteHeapsV2Header(std::ostream& out) {
+  out << "\"level_of_detail\":\"detailed\",\n";
   out << "\"heaps_v2\": {\n";
 }
 
 // Closes the dictionaries from the WriteHeapsV2Header function above.
 void WriteHeapsV2Footer(std::ostream& out) {
-  out << "}}}}";  // heaps_v2, dumps, args, event
+  out << "}";  // heaps_v2
+}
+
+void WriteMemoryMaps(
+    const std::vector<memory_instrumentation::mojom::VmRegionPtr>& maps,
+    std::ostream& out) {
+  base::trace_event::TracedValue traced_value;
+  memory_instrumentation::TracingObserver::MemoryMapsAsValueInto(maps,
+                                                                 &traced_value);
+  out << "\"process_mmaps\":" << traced_value.ToString();
 }
 
 // Inserts or retrieves the ID for a string in the string table.
@@ -200,13 +219,20 @@
 
 }  // namespace
 
-void ExportAllocationEventSetToJSON(int pid,
-                                    const AllocationEventSet& event_set,
-                                    std::ostream& out) {
+void ExportAllocationEventSetToJSON(
+    int pid,
+    const AllocationEventSet& event_set,
+    const std::vector<memory_instrumentation::mojom::VmRegionPtr>& maps,
+    std::ostream& out) {
   out << "{ \"traceEvents\": [";
   WriteProcessName(pid, out);
   out << ",\n";
-  WriteHeapsV2Header(pid, out);
+  WriteDumpsHeader(pid, out);
+
+  WriteMemoryMaps(maps, out);
+  out << ",\n";
+
+  WriteHeapsV2Header(out);
 
   StringTable string_table;
 
@@ -261,6 +287,7 @@
   out << "}}\n";  // End of allocators section.
 
   WriteHeapsV2Footer(out);
+  WriteDumpsFooter(out);
   out << "]}\n";
 }
 
diff --git a/chrome/profiling/json_exporter.h b/chrome/profiling/json_exporter.h
index 6f7ac767..fc5791c 100644
--- a/chrome/profiling/json_exporter.h
+++ b/chrome/profiling/json_exporter.h
@@ -6,14 +6,18 @@
 #define CHROME_PROFILING_JSON_EXPORTER_H_
 
 #include <iosfwd>
+#include <vector>
 
 #include "chrome/profiling/allocation_event.h"
+#include "services/resource_coordinator/public/interfaces/memory_instrumentation/memory_instrumentation.mojom.h"
 
 namespace profiling {
 
-void ExportAllocationEventSetToJSON(int pid,
-                                    const AllocationEventSet& set,
-                                    std::ostream& out);
+void ExportAllocationEventSetToJSON(
+    int pid,
+    const AllocationEventSet& set,
+    const std::vector<memory_instrumentation::mojom::VmRegionPtr>& maps,
+    std::ostream& out);
 
 }  // namespace profiling
 
diff --git a/chrome/profiling/json_exporter_unittest.cc b/chrome/profiling/json_exporter_unittest.cc
index 2f469ee..ffd1367 100644
--- a/chrome/profiling/json_exporter_unittest.cc
+++ b/chrome/profiling/json_exporter_unittest.cc
@@ -6,15 +6,20 @@
 
 #include <sstream>
 
+#include "base/gtest_prod_util.h"
 #include "base/json/json_reader.h"
+#include "base/process/process.h"
 #include "base/values.h"
 #include "chrome/profiling/backtrace_storage.h"
+#include "services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace profiling {
 
 namespace {
 
+using MemoryMap = std::vector<memory_instrumentation::mojom::VmRegionPtr>;
+
 // Finds the first period_interval trace event in the given JSON trace.
 // Returns null on failure.
 const base::Value* FindFirstPeriodicInterval(const base::Value& root) {
@@ -33,6 +38,37 @@
   return nullptr;
 }
 
+// Finds the first vm region in the given periodic interval. Returns null on
+// failure.
+const base::Value* FindFirstRegionWithAnyName(
+    const base::Value* periodic_interval) {
+  auto found_args =
+      periodic_interval->FindKeyOfType("args", base::Value::Type::DICTIONARY);
+  if (found_args == periodic_interval->DictEnd())
+    return nullptr;
+  auto found_dumps =
+      found_args->second.FindKeyOfType("dumps", base::Value::Type::DICTIONARY);
+  if (found_dumps == found_args->second.DictEnd())
+    return nullptr;
+  auto found_mmaps = found_dumps->second.FindKeyOfType(
+      "process_mmaps", base::Value::Type::DICTIONARY);
+  if (found_mmaps == found_dumps->second.DictEnd())
+    return nullptr;
+  auto found_regions =
+      found_mmaps->second.FindKeyOfType("vm_regions", base::Value::Type::LIST);
+  if (found_regions == found_mmaps->second.DictEnd())
+    return nullptr;
+
+  for (const base::Value& cur : found_regions->second.GetList()) {
+    auto found_name = cur.FindKeyOfType("mf", base::Value::Type::STRING);
+    if (found_name == cur.DictEnd())
+      return nullptr;
+    if (found_name->second.GetString() != "")
+      return &cur;
+  }
+  return nullptr;
+}
+
 }  // namespace
 
 TEST(ProfilingJsonExporter, Simple) {
@@ -53,7 +89,7 @@
   events.insert(AllocationEvent(Address(0x3), 16, bt1));
 
   std::ostringstream stream;
-  ExportAllocationEventSetToJSON(1234, events, stream);
+  ExportAllocationEventSetToJSON(1234, events, MemoryMap(), stream);
   std::string json = stream.str();
 
   // JSON should parse.
@@ -84,4 +120,38 @@
                counts->GetList()[1].GetInt() == 1));
 }
 
+TEST(ProfilingJsonExporterTest, MemoryMaps) {
+  AllocationEventSet events;
+  std::vector<memory_instrumentation::mojom::VmRegionPtr> memory_maps =
+      memory_instrumentation::OSMetrics::GetProcessMemoryMaps(
+          base::Process::Current().Pid());
+  ASSERT_GT(memory_maps.size(), 2u);
+
+  std::ostringstream stream;
+  ExportAllocationEventSetToJSON(1234, events, memory_maps, stream);
+  std::string json = stream.str();
+
+  // JSON should parse.
+  base::JSONReader reader(base::JSON_PARSE_RFC);
+  std::unique_ptr<base::Value> root = reader.ReadToValue(stream.str());
+  ASSERT_EQ(base::JSONReader::JSON_NO_ERROR, reader.error_code())
+      << reader.GetErrorMessage();
+  ASSERT_TRUE(root.get());
+
+  const base::Value* periodic_interval = FindFirstPeriodicInterval(*root);
+  ASSERT_TRUE(periodic_interval) << "Array contains no periodic_interval";
+  const base::Value* region = FindFirstRegionWithAnyName(periodic_interval);
+  ASSERT_TRUE(region) << "Array contains no named vm regions";
+
+  auto start_address = region->FindKeyOfType("sa", base::Value::Type::STRING);
+  ASSERT_NE(start_address, region->DictEnd());
+  EXPECT_NE(start_address->second.GetString(), "");
+  EXPECT_NE(start_address->second.GetString(), "0");
+
+  auto size = region->FindKeyOfType("sz", base::Value::Type::STRING);
+  ASSERT_NE(size, region->DictEnd());
+  EXPECT_NE(size->second.GetString(), "");
+  EXPECT_NE(size->second.GetString(), "0");
+}
+
 }  // namespace profiling
diff --git a/chrome/profiling/memlog_connection_manager.cc b/chrome/profiling/memlog_connection_manager.cc
index f1e5d70..ce3f9ba 100644
--- a/chrome/profiling/memlog_connection_manager.cc
+++ b/chrome/profiling/memlog_connection_manager.cc
@@ -91,8 +91,10 @@
                                  base::Unretained(this), pid));
 }
 
-void MemlogConnectionManager::DumpProcess(base::ProcessId pid,
-                                          base::File output_file) {
+void MemlogConnectionManager::DumpProcess(
+    base::ProcessId pid,
+    const std::vector<memory_instrumentation::mojom::VmRegionPtr>& maps,
+    base::File output_file) {
   base::AutoLock l(connections_lock_);
 
   // Lock all connections to prevent deallocations of atoms from
@@ -114,7 +116,8 @@
   Connection* connection = it->second.get();
 
   std::ostringstream oss;
-  ExportAllocationEventSetToJSON(pid, connection->tracker.live_allocs(), oss);
+  ExportAllocationEventSetToJSON(pid, connection->tracker.live_allocs(), maps,
+                                 oss);
   std::string reply = oss.str();
   output_file.WriteAtCurrentPos(reply.c_str(), reply.size());
 }
diff --git a/chrome/profiling/memlog_connection_manager.h b/chrome/profiling/memlog_connection_manager.h
index 4339d0f..26e4635b 100644
--- a/chrome/profiling/memlog_connection_manager.h
+++ b/chrome/profiling/memlog_connection_manager.h
@@ -6,6 +6,7 @@
 #define CHROME_PROFILING_MEMLOG_CONNECTION_MANAGER_H_
 
 #include <string>
+#include <vector>
 
 #include "base/containers/flat_map.h"
 #include "base/files/file.h"
@@ -15,11 +16,14 @@
 #include "base/synchronization/lock.h"
 #include "build/build_config.h"
 #include "chrome/profiling/backtrace_storage.h"
+#include "services/resource_coordinator/public/interfaces/memory_instrumentation/memory_instrumentation.mojom.h"
 
 namespace base {
+
 class SequencedTaskRunner;
 class SingleThreadTaskRunner;
-}
+
+}  // namespace base
 
 namespace profiling {
 
@@ -36,8 +40,13 @@
                           BacktraceStorage* backtrace_storage);
   ~MemlogConnectionManager();
 
-  // Dumps the memory log for the given process into |output_file|.
-  void DumpProcess(base::ProcessId pid, base::File output_file);
+  // Dumps the memory log for the given process into |output_file|.  This must
+  // be provided the memory map for the given process since that is not tracked
+  // as part of the normal allocation process.
+  void DumpProcess(
+      base::ProcessId pid,
+      const std::vector<memory_instrumentation::mojom::VmRegionPtr>& maps,
+      base::File output_file);
 
   void OnNewConnection(base::ScopedPlatformFile file, base::ProcessId pid);
 
diff --git a/chrome/profiling/memlog_impl.cc b/chrome/profiling/memlog_impl.cc
index 8b61c672..cc772e8 100644
--- a/chrome/profiling/memlog_impl.cc
+++ b/chrome/profiling/memlog_impl.cc
@@ -4,9 +4,12 @@
 
 #include "chrome/profiling/memlog_impl.h"
 
+#include "base/trace_event/memory_dump_request_args.h"
 #include "chrome/profiling/memlog_receiver_pipe.h"
 #include "content/public/child/child_thread.h"
+#include "content/public/common/service_names.mojom.h"
 #include "mojo/public/cpp/system/platform_handle.h"
+#include "services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.h"
 
 namespace profiling {
 
@@ -14,7 +17,8 @@
     : io_runner_(content::ChildThread::Get()->GetIOTaskRunner()),
       connection_manager_(
           new MemlogConnectionManager(io_runner_, &backtrace_storage_),
-          DeleteOnRunner(FROM_HERE, io_runner_.get())) {}
+          DeleteOnRunner(FROM_HERE, io_runner_.get())),
+      weak_factory_(this) {}
 
 MemlogImpl::~MemlogImpl() {}
 
@@ -42,10 +46,48 @@
     return;
   }
   base::File file(platform_file);
+
+  // Need a memory map to make sense of the dump. The dump will be triggered
+  // in the memory map global dump callback.
+  // TODO(brettw) this should be a OnceCallback to avoid base::Passed.
+  memory_instrumentation::MemoryInstrumentation::GetInstance()
+      ->GetVmRegionsForHeapProfiler(base::Bind(
+          &MemlogImpl::OnGetVmRegionsComplete, weak_factory_.GetWeakPtr(), pid,
+          base::Passed(std::move(file))));
+}
+
+void MemlogImpl::OnGetVmRegionsComplete(
+    base::ProcessId pid,
+    base::File file,
+    bool success,
+    memory_instrumentation::mojom::GlobalMemoryDumpPtr dump) {
+  if (!success) {
+    LOG(ERROR) << "Global dump failed";
+    return;
+  }
+
+  // Find the process's memory dump we want.
+  // TODO(bug 752621) we should be asking and getting the memory map of only
+  // the process we want rather than querying all processes and filtering.
+  memory_instrumentation::mojom::ProcessMemoryDump* process_dump = nullptr;
+  for (const auto& proc : dump->process_dumps) {
+    if (proc->pid == pid) {
+      process_dump = &*proc;
+      break;
+    }
+  }
+  if (!process_dump) {
+    LOG(ERROR) << "Don't have a memory dump for PID " << pid;
+    return;
+  }
+
   io_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&MemlogConnectionManager::DumpProcess,
-                                base::Unretained(connection_manager_.get()),
-                                pid, std::move(file)));
+      FROM_HERE,
+      base::BindOnce(
+          &MemlogConnectionManager::DumpProcess,
+          base::Unretained(connection_manager_.get()), pid,
+          std::move(process_dump->os_dump->memory_maps_for_heap_profiler),
+          std::move(file)));
 }
 
 }  // namespace profiling
diff --git a/chrome/profiling/memlog_impl.h b/chrome/profiling/memlog_impl.h
index 50cafa7..4a8d8919 100644
--- a/chrome/profiling/memlog_impl.h
+++ b/chrome/profiling/memlog_impl.h
@@ -5,12 +5,15 @@
 #ifndef CHROME_PROFILING_MEMLOG_IMPL_H_
 #define CHROME_PROFILING_MEMLOG_IMPL_H_
 
+#include "base/files/file.h"
 #include "base/files/platform_file.h"
 #include "base/macros.h"
+#include "base/memory/weak_ptr.h"
 #include "chrome/common/profiling/memlog.mojom.h"
 #include "chrome/profiling/backtrace_storage.h"
 #include "chrome/profiling/memlog_connection_manager.h"
 #include "mojo/public/cpp/bindings/binding.h"
+#include "services/resource_coordinator/public/interfaces/memory_instrumentation/memory_instrumentation.mojom.h"
 #include "services/service_manager/public/cpp/service_context_ref.h"
 
 namespace profiling {
@@ -46,10 +49,19 @@
     base::SequencedTaskRunner* runner;
   };
 
+  void OnGetVmRegionsComplete(
+      base::ProcessId pid,
+      base::File file,
+      bool success,
+      memory_instrumentation::mojom::GlobalMemoryDumpPtr dump);
+
   scoped_refptr<base::SequencedTaskRunner> io_runner_;
   BacktraceStorage backtrace_storage_;
   std::unique_ptr<MemlogConnectionManager, DeleteOnRunner> connection_manager_;
 
+  // Must be last.
+  base::WeakPtrFactory<MemlogImpl> weak_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(MemlogImpl);
 };
 
diff --git a/chrome/profiling/profiling_service.h b/chrome/profiling/profiling_service.h
index 9724fbb..fabc75e 100644
--- a/chrome/profiling/profiling_service.h
+++ b/chrome/profiling/profiling_service.h
@@ -21,7 +21,7 @@
 // ServiceManager) to set manage the global state as well as the bound
 // interface.
 //
-// Currently the servcie only manages a memlog interface, but there could be
+// Currently the service only manages a memlog interface, but there could be
 // more in the future.
 //
 // The expectation is each memlog sender will bind a connection to this service
diff --git a/chrome/renderer/safe_browsing/DEPS b/chrome/renderer/safe_browsing/DEPS
index 4db2367..5f5942167 100644
--- a/chrome/renderer/safe_browsing/DEPS
+++ b/chrome/renderer/safe_browsing/DEPS
@@ -1,6 +1,6 @@
 include_rules = [
   "+components/safe_browsing/common",
-  "+components/safe_browsing/csd.pb.h",
+  "+components/safe_browsing/proto/csd.pb.h",
   "+components/safe_browsing/renderer",
   "+components/safe_browsing/features.h",
   "+third_party/smhasher",
diff --git a/chrome/renderer/safe_browsing/phishing_classifier.cc b/chrome/renderer/safe_browsing/phishing_classifier.cc
index 9c793c16..b4c21b47 100644
--- a/chrome/renderer/safe_browsing/phishing_classifier.cc
+++ b/chrome/renderer/safe_browsing/phishing_classifier.cc
@@ -22,7 +22,7 @@
 #include "chrome/renderer/safe_browsing/phishing_term_feature_extractor.h"
 #include "chrome/renderer/safe_browsing/phishing_url_feature_extractor.h"
 #include "chrome/renderer/safe_browsing/scorer.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/renderer/render_frame.h"
 #include "crypto/sha2.h"
 #include "third_party/WebKit/public/platform/WebURL.h"
diff --git a/chrome/renderer/safe_browsing/phishing_classifier_browsertest.cc b/chrome/renderer/safe_browsing/phishing_classifier_browsertest.cc
index 148fcec..3bac8333 100644
--- a/chrome/renderer/safe_browsing/phishing_classifier_browsertest.cc
+++ b/chrome/renderer/safe_browsing/phishing_classifier_browsertest.cc
@@ -18,7 +18,7 @@
 #include "chrome/renderer/safe_browsing/murmurhash3_util.h"
 #include "chrome/renderer/safe_browsing/scorer.h"
 #include "chrome/test/base/chrome_render_view_test.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/renderer/render_frame.h"
 #include "content/public/renderer/render_view.h"
 #include "crypto/sha2.h"
diff --git a/chrome/renderer/safe_browsing/phishing_classifier_delegate.cc b/chrome/renderer/safe_browsing/phishing_classifier_delegate.cc
index 4149a7e..61406c8 100644
--- a/chrome/renderer/safe_browsing/phishing_classifier_delegate.cc
+++ b/chrome/renderer/safe_browsing/phishing_classifier_delegate.cc
@@ -16,7 +16,7 @@
 #include "chrome/renderer/safe_browsing/phishing_classifier.h"
 #include "chrome/renderer/safe_browsing/scorer.h"
 #include "components/safe_browsing/common/safebrowsing_messages.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/renderer/document_state.h"
 #include "content/public/renderer/navigation_state.h"
 #include "content/public/renderer/render_frame.h"
diff --git a/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc b/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc
index 03783b5a..552a4a1 100644
--- a/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc
+++ b/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc
@@ -13,7 +13,7 @@
 #include "chrome/test/base/chrome_render_view_test.h"
 #include "chrome/test/base/chrome_unit_test_suite.h"
 #include "components/safe_browsing/common/safebrowsing_messages.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/renderer/render_frame.h"
 #include "content/public/renderer/render_view.h"
 #include "testing/gmock/include/gmock/gmock.h"
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index efc312a35..5f13785 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -2071,6 +2071,7 @@
         "../browser/ui/views/bookmarks/bookmark_editor_view_browsertest.cc",
         "../browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc",
         "../browser/ui/views/external_protocol_dialog_browsertest.cc",
+        "../browser/ui/views/first_run_bubble_browsertest.cc",
         "../browser/ui/views/frame/browser_non_client_frame_view_browsertest_win.cc",
         "../browser/ui/views/frame/browser_window_property_manager_browsertest_win.cc",
         "../browser/ui/views/importer/import_lock_dialog_view_browsertest.cc",
@@ -2352,6 +2353,7 @@
         "//services/preferences/public/interfaces",
         "//services/service_manager/public/cpp",
         "//ui/login:resources",
+        "//url",
       ]
 
       if (use_dbus) {
@@ -2489,6 +2491,7 @@
       if (!mac_views_browser) {
         sources += [
           "../browser/ui/cocoa/accelerators_cocoa_browsertest.mm",
+          "../browser/ui/cocoa/accessibility_browsertest.mm",
           "../browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm",
           "../browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm",
           "../browser/ui/cocoa/browser_window_controller_browsertest.mm",
@@ -2936,6 +2939,7 @@
     "//testing/scripts/common.py",
     "//testing/xvfb.py",
     "//testing/scripts/run_telemetry_as_googletest.py",
+
     # For smoke testing run_telemetry_benchmark_as_googletest
     "//testing/scripts/run_telemetry_benchmark_as_googletest.py",
   ]
@@ -3873,8 +3877,11 @@
   }
 
   if ((is_linux && !is_chromeos) || is_win) {
-    sources +=
-        [ "../browser/feature_engagement/new_tab/new_tab_tracker_unittest.cc" ]
+    sources += [
+      "../browser/feature_engagement/feature_tracker_unittest.cc",
+      "../browser/feature_engagement/new_tab/new_tab_tracker_unittest.cc",
+      "../browser/feature_engagement/session_duration_updater_unittest.cc",
+    ]
     deps += [ "//components/feature_engagement/test:test_support" ]
   }
 
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py
index a99fb82..ae18082 100755
--- a/chrome/test/chromedriver/test/run_py_tests.py
+++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -106,7 +106,10 @@
     # Xvfb doesn't support maximization.
     'ChromeDriverTest.testWindowMaximize',
 ]
-_OS_SPECIFIC_FILTER['mac'] = []
+_OS_SPECIFIC_FILTER['mac'] = [
+    # https://bugs.chromium.org/p/chromedriver/issues/detail?id=1927
+    'MobileEmulationCapabilityTest.testTapElement',
+]
 
 _DESKTOP_NEGATIVE_FILTER = [
     # Desktop doesn't support touch (without --touch-events).
diff --git a/chrome/test/data/android/webvr_instrumentation/html/test_webvr_disabled_without_flag_set.html b/chrome/test/data/android/webvr_instrumentation/html/test_webvr_disabled_without_flag_set.html
new file mode 100644
index 0000000..598cded
--- /dev/null
+++ b/chrome/test/data/android/webvr_instrumentation/html/test_webvr_disabled_without_flag_set.html
@@ -0,0 +1,23 @@
+<!doctype html>
+<!--
+Tests that the WebVR API is not present if the flag to enable it is not set.
+-->
+<html>
+  <head>
+    <link rel="stylesheet" type="text/css" href="../resources/webvr_e2e.css">
+  </head>
+  <body>
+    <canvas id="webgl-canvas"></canvas>
+    <script src="../../../../../../third_party/WebKit/LayoutTests/resources/testharness.js"></script>
+    <script src="../resources/webvr_e2e.js"></script>
+  </body>
+  <script>
+    var t = async_test("WebVR API is not visible");
+    if (navigator.getVRDisplays) {
+      t.step( () => {
+        assert_unreached("API is visible");
+      });
+    }
+    t.done();
+  </script>
+</html>
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index 39bca75..20e8069 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -77,6 +77,7 @@
     "ntp4.js",
     "polymer_browser_test_base.js",
     "sandboxstatus_browsertest.js",
+    "settings/about_a11y_test.js",
     "settings/accessibility_audit_rules.js",
     "settings/accessibility_browsertest.js",
     "settings/accessibility_test.js",
diff --git a/chrome/test/data/webui/settings/about_a11y_test.js b/chrome/test/data/webui/settings/about_a11y_test.js
new file mode 100644
index 0000000..33b42a7
--- /dev/null
+++ b/chrome/test/data/webui/settings/about_a11y_test.js
@@ -0,0 +1,48 @@
+// 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.
+
+/**
+ * @fileoverview Define accessibility tests for the ABOUT route.
+ */
+
+/** @const {string} Path to root from chrome/test/data/webui/settings/. */
+var ROOT_PATH = '../../../../../';
+
+// SettingsAccessibilityTest fixture.
+GEN_INCLUDE([
+  ROOT_PATH + 'chrome/test/data/webui/settings/accessibility_browsertest.js',
+]);
+
+AccessibilityTest.define('SettingsAccessibilityTest', {
+  /** @override */
+  name: 'ABOUT',
+  /** @override */
+  axeOptions: {
+    'rules': {
+      // TODO(hcarmona): enable 'region' after addressing violation.
+      'region': {enabled: false},
+    }
+  },
+  /** @override */
+  setup: function() {
+    settings.router.navigateTo(settings.routes.ABOUT);
+    Polymer.dom.flush();
+  },
+  /** @override */
+  tests: {
+    'Accessible with No Changes': function() {}
+  },
+  /** @override */
+  violationFilter: {
+    // TODO(quacht): remove this exception once the color contrast issue is
+    // solved.
+    // http://crbug.com/748608
+    'color-contrast': function(nodeResult) {
+      return nodeResult.element.id === 'prompt';
+    },
+    'aria-valid-attr': function(nodeResult) {
+      return nodeResult.element.hasAttribute('aria-active-attribute');
+    },
+  }
+});
\ No newline at end of file
diff --git a/chrome/test/data/webui/settings/accessibility_test.js b/chrome/test/data/webui/settings/accessibility_test.js
index cb6865dc..cd87ea6 100644
--- a/chrome/test/data/webui/settings/accessibility_test.js
+++ b/chrome/test/data/webui/settings/accessibility_test.js
@@ -121,8 +121,10 @@
       axeOptions.runOnly.values : AccessibilityTest.ruleIds;
   rules.forEach((ruleId) => {
     // Skip rules disabled in axeOptions.
-    if (ruleId in axeOptions.rules && !axeOptions.rules[ruleId].enabled)
+    if (axeOptions.rules && ruleId in axeOptions.rules &&
+        !axeOptions.rules[ruleId].enabled) {
       return;
+    }
 
     let newTestDef = Object.assign({}, testDef);
     newTestDef.name += '_' + ruleId;
diff --git a/chrome/tools/safe_browsing/DEPS b/chrome/tools/safe_browsing/DEPS
index 322a686..5574d3b4 100644
--- a/chrome/tools/safe_browsing/DEPS
+++ b/chrome/tools/safe_browsing/DEPS
@@ -1,3 +1,3 @@
 include_rules = [
-  "+components/safe_browsing/csd.pb.h",
+  "+components/safe_browsing/proto/csd.pb.h",
 ]
diff --git a/chrome/tools/safe_browsing/sb_sigutil.cc b/chrome/tools/safe_browsing/sb_sigutil.cc
index c33ffa7..81973a4 100644
--- a/chrome/tools/safe_browsing/sb_sigutil.cc
+++ b/chrome/tools/safe_browsing/sb_sigutil.cc
@@ -16,7 +16,7 @@
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
 #include "chrome/common/safe_browsing/binary_feature_extractor.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 
 // Command-line switch for the executable to extract a signature from.
 static const char kExecutable[] = "executable";
diff --git a/chrome/utility/safe_browsing/mac/DEPS b/chrome/utility/safe_browsing/mac/DEPS
index 322a686..5574d3b4 100644
--- a/chrome/utility/safe_browsing/mac/DEPS
+++ b/chrome/utility/safe_browsing/mac/DEPS
@@ -1,3 +1,3 @@
 include_rules = [
-  "+components/safe_browsing/csd.pb.h",
+  "+components/safe_browsing/proto/csd.pb.h",
 ]
diff --git a/chrome/utility/safe_browsing/mac/dmg_analyzer.cc b/chrome/utility/safe_browsing/mac/dmg_analyzer.cc
index 6ba4e583..00d8ad6 100644
--- a/chrome/utility/safe_browsing/mac/dmg_analyzer.cc
+++ b/chrome/utility/safe_browsing/mac/dmg_analyzer.cc
@@ -16,7 +16,7 @@
 #include "chrome/common/safe_browsing/mach_o_image_reader_mac.h"
 #include "chrome/utility/safe_browsing/mac/dmg_iterator.h"
 #include "chrome/utility/safe_browsing/mac/read_stream.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "crypto/secure_hash.h"
 #include "crypto/sha2.h"
 
diff --git a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsActivity.java b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsActivity.java
index 2903ad2..d911508 100644
--- a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsActivity.java
+++ b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsActivity.java
@@ -258,8 +258,11 @@
         if (DEBUG) Log.d(TAG, "onWindowFocusChanged(%b)", hasFocus);
         super.onWindowFocusChanged(hasFocus);
         if (hasFocus) {
+            // switch to fullscreen (immersive) mode
             getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
-                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN);
+                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+                    | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
         }
     }
 
diff --git a/chromecast/media/audio/cast_audio_output_stream_unittest.cc b/chromecast/media/audio/cast_audio_output_stream_unittest.cc
index 1a66c0293..e62e493a 100644
--- a/chromecast/media/audio/cast_audio_output_stream_unittest.cc
+++ b/chromecast/media/audio/cast_audio_output_stream_unittest.cc
@@ -518,6 +518,7 @@
   EXPECT_TRUE(audio_device);
   EXPECT_EQ(FakeMediaPipelineBackend::kStateRunning, GetBackend()->state());
 
+  stream->Stop();
   stream->Close();
 }
 
diff --git a/chromecast/media/cma/backend/BUILD.gn b/chromecast/media/cma/backend/BUILD.gn
index 3d4b52e..f2b0134 100644
--- a/chromecast/media/cma/backend/BUILD.gn
+++ b/chromecast/media/cma/backend/BUILD.gn
@@ -8,6 +8,8 @@
 
 source_set("backend") {
   sources = [
+    "audio_decoder_wrapper.cc",
+    "audio_decoder_wrapper.h",
     "media_pipeline_backend_factory.h",
     "media_pipeline_backend_factory_impl.cc",
     "media_pipeline_backend_factory_impl.h",
diff --git a/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input.h b/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input.h
index 2d77008c5..918c4a2 100644
--- a/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input.h
+++ b/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input.h
@@ -70,8 +70,10 @@
   // will continue to play sound while this input is paused.
   void SetPaused(bool paused);
 
-  // Sets the volume multiplier for this input. If |multiplier| is outside the
-  // range [0.0, 1.0], it is clamped to that range.
+  // Sets the volume multiplier for this input. If |multiplier| is less than 0,
+  // it is clamped to 0. Volume multipliers greater than 1.0 are allowed, but
+  // the total volume for the stream (including stream type volume) is clamped
+  // to 1.0.
   void SetVolumeMultiplier(float multiplier);
 
  private:
diff --git a/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.cc b/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.cc
index 34d95f26..92aa527 100644
--- a/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.cc
+++ b/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.cc
@@ -561,19 +561,19 @@
 void StreamMixerAlsaInputImpl::SetVolumeMultiplier(float multiplier) {
   RUN_ON_MIXER_THREAD(SetVolumeMultiplier, multiplier);
   DCHECK(!IsDeleting());
-  stream_volume_multiplier_ = std::max(0.0f, std::min(multiplier, 1.0f));
+  stream_volume_multiplier_ = std::max(0.0f, multiplier);
+  float effective_volume = EffectiveVolume();
   LOG(INFO) << device_id_ << "(" << this
             << "): stream volume = " << stream_volume_multiplier_
-            << ", effective multiplier = " << EffectiveVolume();
+            << ", effective multiplier = " << effective_volume;
   slew_volume_.SetMaxSlewTimeMs(kDefaultSlewTimeMs);
-  slew_volume_.SetVolume(EffectiveVolume());
+  slew_volume_.SetVolume(effective_volume);
 }
 
 void StreamMixerAlsaInputImpl::SetContentTypeVolume(float volume, int fade_ms) {
   DCHECK(mixer_task_runner_->BelongsToCurrentThread());
   type_volume_multiplier_ = std::max(0.0f, std::min(volume, 1.0f));
-  float effective_volume = stream_volume_multiplier_ * type_volume_multiplier_ *
-                           mute_volume_multiplier_;
+  float effective_volume = EffectiveVolume();
   LOG(INFO) << device_id_ << "(" << this
             << "): type volume = " << type_volume_multiplier_
             << ", effective multiplier = " << effective_volume;
@@ -589,8 +589,7 @@
 void StreamMixerAlsaInputImpl::SetMuted(bool muted) {
   DCHECK(mixer_task_runner_->BelongsToCurrentThread());
   mute_volume_multiplier_ = muted ? 0.0f : 1.0f;
-  float effective_volume = stream_volume_multiplier_ * type_volume_multiplier_ *
-                           mute_volume_multiplier_;
+  float effective_volume = EffectiveVolume();
   LOG(INFO) << device_id_ << "(" << this
             << "): mute volume = " << mute_volume_multiplier_
             << ", effective multiplier = " << effective_volume;
@@ -599,8 +598,9 @@
 }
 
 float StreamMixerAlsaInputImpl::EffectiveVolume() {
-  return stream_volume_multiplier_ * type_volume_multiplier_ *
-         mute_volume_multiplier_;
+  float volume = stream_volume_multiplier_ * type_volume_multiplier_ *
+                 mute_volume_multiplier_;
+  return std::max(0.0f, std::min(volume, 1.0f));
 }
 
 void StreamMixerAlsaInputImpl::VolumeScaleAccumulate(bool repeat_transition,
diff --git a/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.h b/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.h
index a85b858c..5daf21d 100644
--- a/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.h
+++ b/chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.h
@@ -107,8 +107,7 @@
   void SetPaused(bool paused);
 
   // Sets the volume multiplier for this stream. If |multiplier| < 0, sets the
-  // volume multiplier to 0. If |multiplier| > 1, sets the volume multiplier
-  // to 1.
+  // volume multiplier to 0.
   void SetVolumeMultiplier(float multiplier);
 
   // Prevents any further calls to the delegate (ie, called when the delegate
diff --git a/chromecast/media/cma/backend/audio_decoder_wrapper.cc b/chromecast/media/cma/backend/audio_decoder_wrapper.cc
new file mode 100644
index 0000000..7aea08d
--- /dev/null
+++ b/chromecast/media/cma/backend/audio_decoder_wrapper.cc
@@ -0,0 +1,65 @@
+// 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 "chromecast/media/cma/backend/audio_decoder_wrapper.h"
+
+#include "base/logging.h"
+#include "chromecast/media/cma/backend/media_pipeline_backend_manager.h"
+
+namespace chromecast {
+namespace media {
+
+AudioDecoderWrapper::AudioDecoderWrapper(
+    MediaPipelineBackendManager* backend_manager,
+    AudioDecoder* decoder,
+    AudioContentType type)
+    : backend_manager_(backend_manager),
+      decoder_(decoder),
+      content_type_(type),
+      global_volume_multiplier_(1.0f),
+      stream_volume_multiplier_(1.0f) {
+  DCHECK(backend_manager_);
+  DCHECK(decoder_);
+
+  backend_manager_->AddAudioDecoder(this);
+}
+
+AudioDecoderWrapper::~AudioDecoderWrapper() {
+  backend_manager_->RemoveAudioDecoder(this);
+}
+
+void AudioDecoderWrapper::SetGlobalVolumeMultiplier(float multiplier) {
+  global_volume_multiplier_ = multiplier;
+  decoder_->SetVolume(stream_volume_multiplier_ * global_volume_multiplier_);
+}
+
+void AudioDecoderWrapper::SetDelegate(Delegate* delegate) {
+  decoder_->SetDelegate(delegate);
+}
+
+MediaPipelineBackend::BufferStatus AudioDecoderWrapper::PushBuffer(
+    CastDecoderBuffer* buffer) {
+  return decoder_->PushBuffer(buffer);
+}
+
+bool AudioDecoderWrapper::SetConfig(const AudioConfig& config) {
+  return decoder_->SetConfig(config);
+}
+
+bool AudioDecoderWrapper::SetVolume(float multiplier) {
+  stream_volume_multiplier_ = std::max(0.0f, std::min(multiplier, 1.0f));
+  return decoder_->SetVolume(stream_volume_multiplier_ *
+                             global_volume_multiplier_);
+}
+
+AudioDecoderWrapper::RenderingDelay AudioDecoderWrapper::GetRenderingDelay() {
+  return decoder_->GetRenderingDelay();
+}
+
+void AudioDecoderWrapper::GetStatistics(Statistics* statistics) {
+  decoder_->GetStatistics(statistics);
+}
+
+}  // namespace media
+}  // namespace chromecast
diff --git a/chromecast/media/cma/backend/audio_decoder_wrapper.h b/chromecast/media/cma/backend/audio_decoder_wrapper.h
new file mode 100644
index 0000000..f1929d8
--- /dev/null
+++ b/chromecast/media/cma/backend/audio_decoder_wrapper.h
@@ -0,0 +1,50 @@
+// 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 CHROMECAST_MEDIA_CMA_BACKEND_AUDIO_DECODER_WRAPPER_H_
+#define CHROMECAST_MEDIA_CMA_BACKEND_AUDIO_DECODER_WRAPPER_H_
+
+#include "base/macros.h"
+#include "chromecast/public/media/media_pipeline_backend.h"
+
+namespace chromecast {
+namespace media {
+
+enum class AudioContentType;
+class MediaPipelineBackendManager;
+
+class AudioDecoderWrapper : public MediaPipelineBackend::AudioDecoder {
+ public:
+  AudioDecoderWrapper(MediaPipelineBackendManager* backend_manager,
+                      MediaPipelineBackend::AudioDecoder* decoder,
+                      AudioContentType type);
+  ~AudioDecoderWrapper() override;
+
+  void SetGlobalVolumeMultiplier(float multiplier);
+
+  AudioContentType content_type() const { return content_type_; }
+
+ private:
+  // MediaPipelineBackend::AudioDecoder implementation:
+  void SetDelegate(Delegate* delegate) override;
+  BufferStatus PushBuffer(CastDecoderBuffer* buffer) override;
+  bool SetConfig(const AudioConfig& config) override;
+  bool SetVolume(float multiplier) override;
+  RenderingDelay GetRenderingDelay() override;
+  void GetStatistics(Statistics* statistics) override;
+
+  MediaPipelineBackendManager* const backend_manager_;
+  MediaPipelineBackend::AudioDecoder* const decoder_;
+  const AudioContentType content_type_;
+
+  float global_volume_multiplier_;
+  float stream_volume_multiplier_;
+
+  DISALLOW_COPY_AND_ASSIGN(AudioDecoderWrapper);
+};
+
+}  // namespace media
+}  // namespace chromecast
+
+#endif  // CHROMECAST_MEDIA_CMA_BACKEND_AUDIO_DECODER_WRAPPER_H_
diff --git a/chromecast/media/cma/backend/media_pipeline_backend_manager.cc b/chromecast/media/cma/backend/media_pipeline_backend_manager.cc
index f3807ce9..4d6c6b5e 100644
--- a/chromecast/media/cma/backend/media_pipeline_backend_manager.cc
+++ b/chromecast/media/cma/backend/media_pipeline_backend_manager.cc
@@ -7,10 +7,13 @@
 #include <algorithm>
 #include <limits>
 
+#include "base/bind.h"
 #include "base/location.h"
 #include "base/memory/ptr_util.h"
 #include "chromecast/chromecast_features.h"
+#include "chromecast/media/cma/backend/audio_decoder_wrapper.h"
 #include "chromecast/media/cma/backend/media_pipeline_backend_wrapper.h"
+#include "chromecast/public/volume_control.h"
 
 namespace chromecast {
 namespace media {
@@ -27,13 +30,19 @@
     : media_task_runner_(std::move(media_task_runner)),
       playing_noneffects_audio_streams_count_(0),
       allow_volume_feedback_observers_(
-          new base::ObserverListThreadSafe<AllowVolumeFeedbackObserver>()) {
+          new base::ObserverListThreadSafe<AllowVolumeFeedbackObserver>()),
+      global_volume_multipliers_({{AudioContentType::kMedia, 1.0f},
+                                  {AudioContentType::kAlarm, 1.0f},
+                                  {AudioContentType::kCommunication, 1.0f}},
+                                 base::KEEP_FIRST_OF_DUPES),
+      weak_factory_(this) {
   for (int i = 0; i < NUM_DECODER_TYPES; ++i) {
     decoder_count_[i] = 0;
   }
 }
 
 MediaPipelineBackendManager::~MediaPipelineBackendManager() {
+  DCHECK(media_task_runner_->BelongsToCurrentThread());
 }
 
 std::unique_ptr<MediaPipelineBackend>
@@ -103,5 +112,38 @@
   wrapper->LogicalResume();
 }
 
+void MediaPipelineBackendManager::SetGlobalVolumeMultiplier(
+    AudioContentType type,
+    float multiplier) {
+  if (!media_task_runner_->BelongsToCurrentThread()) {
+    media_task_runner_->PostTask(
+        FROM_HERE,
+        base::Bind(&MediaPipelineBackendManager::SetGlobalVolumeMultiplier,
+                   weak_factory_.GetWeakPtr(), type, multiplier));
+    return;
+  }
+
+  DCHECK_GE(multiplier, 0.0f);
+  global_volume_multipliers_[type] = multiplier;
+  for (auto* a : audio_decoders_) {
+    if (a->content_type() == type) {
+      a->SetGlobalVolumeMultiplier(multiplier);
+    }
+  }
+}
+
+void MediaPipelineBackendManager::AddAudioDecoder(
+    AudioDecoderWrapper* decoder) {
+  DCHECK(decoder);
+  audio_decoders_.insert(decoder);
+  decoder->SetGlobalVolumeMultiplier(
+      global_volume_multipliers_[decoder->content_type()]);
+}
+
+void MediaPipelineBackendManager::RemoveAudioDecoder(
+    AudioDecoderWrapper* decoder) {
+  audio_decoders_.erase(decoder);
+}
+
 }  // namespace media
 }  // namespace chromecast
diff --git a/chromecast/media/cma/backend/media_pipeline_backend_manager.h b/chromecast/media/cma/backend/media_pipeline_backend_manager.h
index e112b54..f8d1693b 100644
--- a/chromecast/media/cma/backend/media_pipeline_backend_manager.h
+++ b/chromecast/media/cma/backend/media_pipeline_backend_manager.h
@@ -9,8 +9,11 @@
 #include <memory>
 #include <vector>
 
+#include "base/containers/flat_map.h"
+#include "base/containers/flat_set.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
 #include "base/observer_list_threadsafe.h"
 #include "base/single_thread_task_runner.h"
 #include "chromecast/public/media/media_pipeline_backend.h"
@@ -19,6 +22,9 @@
 namespace chromecast {
 namespace media {
 
+enum class AudioContentType;
+class AudioDecoderWrapper;
+
 // This class tracks all created media backends, tracking whether or not volume
 // feedback sounds should be enabled based on the currently active backends.
 // Volume feedback sounds are only enabled when there are no active audio
@@ -53,20 +59,30 @@
     return media_task_runner_.get();
   }
 
-  // Adds/removes an observer for when folume feedback sounds are allowed.
+  // Adds/removes an observer for when volume feedback sounds are allowed.
   // An observer must be removed on the same thread that added it.
   void AddAllowVolumeFeedbackObserver(AllowVolumeFeedbackObserver* observer);
   void RemoveAllowVolumeFeedbackObserver(AllowVolumeFeedbackObserver* observer);
 
-  // Logically pause/resume a backend instance, without actually pausing or
+  // Logically pauses/resumes a backend instance, without actually pausing or
   // resuming it. This is used by multiroom output to avoid playback stutter on
   // resume. |backend| must have been created via a call to this instance's
   // CreateMediaPipelineBackend().
   void LogicalPause(MediaPipelineBackend* backend);
   void LogicalResume(MediaPipelineBackend* backend);
 
+  // Sets a global multiplier for output volume for streams fo the given |type|.
+  // The multiplier may be any value >= 0; if the resulting volume for an
+  // individual stream would be > 1.0, that stream's volume is clamped to 1.0.
+  // The default multiplier is 1.0. May be called on any thread.
+  void SetGlobalVolumeMultiplier(AudioContentType type, float multiplier);
+
  private:
   friend class MediaPipelineBackendWrapper;
+  friend class AudioDecoderWrapper;
+
+  void AddAudioDecoder(AudioDecoderWrapper* decoder);
+  void RemoveAudioDecoder(AudioDecoderWrapper* decoder);
 
   // Backend wrapper instances must use these APIs when allocating and releasing
   // decoder objects, so we can enforce global limit on #concurrent decoders.
@@ -87,6 +103,11 @@
   scoped_refptr<base::ObserverListThreadSafe<AllowVolumeFeedbackObserver>>
       allow_volume_feedback_observers_;
 
+  base::flat_set<AudioDecoderWrapper*> audio_decoders_;
+  base::flat_map<AudioContentType, float> global_volume_multipliers_;
+
+  base::WeakPtrFactory<MediaPipelineBackendManager> weak_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(MediaPipelineBackendManager);
 };
 
diff --git a/chromecast/media/cma/backend/media_pipeline_backend_wrapper.cc b/chromecast/media/cma/backend/media_pipeline_backend_wrapper.cc
index 7ea3f9a..462ab2d 100644
--- a/chromecast/media/cma/backend/media_pipeline_backend_wrapper.cc
+++ b/chromecast/media/cma/backend/media_pipeline_backend_wrapper.cc
@@ -6,6 +6,7 @@
 
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
+#include "chromecast/media/cma/backend/audio_decoder_wrapper.h"
 #include "chromecast/media/cma/backend/media_pipeline_backend_manager.h"
 #include "chromecast/public/cast_media_shlib.h"
 
@@ -20,9 +21,9 @@
     : backend_(base::WrapUnique(
           media::CastMediaShlib::CreateMediaPipelineBackend(params))),
       backend_manager_(backend_manager),
+      content_type_(params.content_type),
       sfx_backend_(params.audio_type ==
                    media::MediaPipelineDeviceParams::kAudioStreamSoundEffects),
-      have_audio_decoder_(false),
       have_video_decoder_(false),
       playing_(false) {
   DCHECK(backend_);
@@ -30,7 +31,7 @@
 }
 
 MediaPipelineBackendWrapper::~MediaPipelineBackendWrapper() {
-  if (have_audio_decoder_)
+  if (audio_decoder_)
     backend_manager_->DecrementDecoderCount(
         sfx_backend_ ? DecoderType::SFX_DECODER : DecoderType::AUDIO_DECODER);
   if (have_video_decoder_)
@@ -38,7 +39,7 @@
 
   if (playing_) {
     LOG(WARNING) << "Destroying media backend while still in 'playing' state";
-    if (have_audio_decoder_ && !sfx_backend_) {
+    if (audio_decoder_ && !sfx_backend_) {
       backend_manager_->UpdatePlayingAudioCount(-1);
     }
   }
@@ -54,14 +55,19 @@
 
 MediaPipelineBackend::AudioDecoder*
 MediaPipelineBackendWrapper::CreateAudioDecoder() {
-  DCHECK(!have_audio_decoder_);
+  DCHECK(!audio_decoder_);
 
   if (!backend_manager_->IncrementDecoderCount(
           sfx_backend_ ? DecoderType::SFX_DECODER : DecoderType::AUDIO_DECODER))
     return nullptr;
-  have_audio_decoder_ = true;
-
-  return backend_->CreateAudioDecoder();
+  MediaPipelineBackend::AudioDecoder* real_decoder =
+      backend_->CreateAudioDecoder();
+  if (!real_decoder) {
+    return nullptr;
+  }
+  audio_decoder_ = base::MakeUnique<AudioDecoderWrapper>(
+      backend_manager_, real_decoder, content_type_);
+  return audio_decoder_.get();
 }
 
 MediaPipelineBackend::VideoDecoder*
@@ -121,7 +127,7 @@
     return;
   }
   playing_ = playing;
-  if (have_audio_decoder_ && !sfx_backend_) {
+  if (audio_decoder_ && !sfx_backend_) {
     backend_manager_->UpdatePlayingAudioCount(playing_ ? 1 : -1);
   }
 }
diff --git a/chromecast/media/cma/backend/media_pipeline_backend_wrapper.h b/chromecast/media/cma/backend/media_pipeline_backend_wrapper.h
index 848c7ce..879063e 100644
--- a/chromecast/media/cma/backend/media_pipeline_backend_wrapper.h
+++ b/chromecast/media/cma/backend/media_pipeline_backend_wrapper.h
@@ -18,6 +18,8 @@
 namespace chromecast {
 namespace media {
 
+enum class AudioContentType;
+class AudioDecoderWrapper;
 class MediaPipelineBackendManager;
 
 class MediaPipelineBackendWrapper : public MediaPipelineBackend {
@@ -45,9 +47,11 @@
 
   const std::unique_ptr<MediaPipelineBackend> backend_;
   MediaPipelineBackendManager* const backend_manager_;
+  const AudioContentType content_type_;
+
+  std::unique_ptr<AudioDecoderWrapper> audio_decoder_;
 
   bool sfx_backend_;
-  bool have_audio_decoder_;
   bool have_video_decoder_;
   bool playing_;
 
diff --git a/chromeos/BUILD.gn b/chromeos/BUILD.gn
index 6d58162..4e49ab5 100644
--- a/chromeos/BUILD.gn
+++ b/chromeos/BUILD.gn
@@ -130,6 +130,8 @@
     "cryptohome/system_salt_getter.h",
     "dbus/arc_obb_mounter_client.cc",
     "dbus/arc_obb_mounter_client.h",
+    "dbus/arc_oemcrypto_client.cc",
+    "dbus/arc_oemcrypto_client.h",
     "dbus/audio_node.cc",
     "dbus/audio_node.h",
     "dbus/auth_policy_client.cc",
@@ -161,6 +163,8 @@
     "dbus/easy_unlock_client.h",
     "dbus/fake_arc_obb_mounter_client.cc",
     "dbus/fake_arc_obb_mounter_client.h",
+    "dbus/fake_arc_oemcrypto_client.cc",
+    "dbus/fake_arc_oemcrypto_client.h",
     "dbus/fake_auth_policy_client.cc",
     "dbus/fake_auth_policy_client.h",
     "dbus/fake_cras_audio_client.cc",
diff --git a/chromeos/dbus/arc_oemcrypto_client.cc b/chromeos/dbus/arc_oemcrypto_client.cc
new file mode 100644
index 0000000..a54ba140
--- /dev/null
+++ b/chromeos/dbus/arc_oemcrypto_client.cc
@@ -0,0 +1,73 @@
+// 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 "chromeos/dbus/arc_oemcrypto_client.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/callback.h"
+#include "dbus/bus.h"
+#include "dbus/message.h"
+#include "dbus/object_proxy.h"
+#include "third_party/cros_system_api/dbus/service_constants.h"
+
+namespace chromeos {
+
+namespace {
+
+class ArcOemCryptoClientImpl : public ArcOemCryptoClient {
+ public:
+  ArcOemCryptoClientImpl() : weak_ptr_factory_(this) {}
+  ~ArcOemCryptoClientImpl() override {}
+
+  // ArcOemCryptoClient override:
+  void BootstrapMojoConnection(base::ScopedFD fd,
+                               VoidDBusMethodCallback callback) override {
+    dbus::MethodCall method_call(arc_oemcrypto::kArcOemCryptoServiceInterface,
+                                 arc_oemcrypto::kBootstrapMojoConnection);
+    dbus::MessageWriter writer(&method_call);
+    writer.AppendFileDescriptor(fd.release());
+    proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+                       base::Bind(&ArcOemCryptoClientImpl::OnVoidDBusMethod,
+                                  weak_ptr_factory_.GetWeakPtr(),
+                                  base::Passed(std::move(callback))));
+  }
+
+ protected:
+  // DBusClient override.
+  void Init(dbus::Bus* bus) override {
+    proxy_ = bus->GetObjectProxy(
+        arc_oemcrypto::kArcOemCryptoServiceName,
+        dbus::ObjectPath(arc_oemcrypto::kArcOemCryptoServicePath));
+  }
+
+ private:
+  // Runs the callback with the method call result.
+  void OnVoidDBusMethod(VoidDBusMethodCallback callback,
+                        dbus::Response* response) {
+    std::move(callback).Run(response ? DBUS_METHOD_CALL_SUCCESS
+                                     : DBUS_METHOD_CALL_FAILURE);
+  }
+
+  dbus::ObjectProxy* proxy_ = nullptr;
+
+  base::WeakPtrFactory<ArcOemCryptoClientImpl> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(ArcOemCryptoClientImpl);
+};
+
+}  // namespace
+
+ArcOemCryptoClient::ArcOemCryptoClient() {}
+
+ArcOemCryptoClient::~ArcOemCryptoClient() {}
+
+// static
+ArcOemCryptoClient* ArcOemCryptoClient::Create() {
+  return new ArcOemCryptoClientImpl();
+}
+
+}  // namespace chromeos
diff --git a/chromeos/dbus/arc_oemcrypto_client.h b/chromeos/dbus/arc_oemcrypto_client.h
new file mode 100644
index 0000000..5b6cb60
--- /dev/null
+++ b/chromeos/dbus/arc_oemcrypto_client.h
@@ -0,0 +1,42 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMEOS_DBUS_ARC_OEMCRYPTO_CLIENT_H_
+#define CHROMEOS_DBUS_ARC_OEMCRYPTO_CLIENT_H_
+
+#include <stdint.h>
+
+#include <string>
+
+#include "base/callback_forward.h"
+#include "base/files/scoped_file.h"
+#include "base/macros.h"
+#include "chromeos/chromeos_export.h"
+#include "chromeos/dbus/dbus_client.h"
+#include "chromeos/dbus/dbus_method_call_status.h"
+
+namespace chromeos {
+
+// ArcOemCryptoClient is used to communicate with the ArcOemCrypto service
+// which performs Widevine L1 DRM operations for ARC. The only purpose of
+// the D-Bus service is to bootstrap a Mojo IPC connection.
+// All methods should be called from the origin thread (UI thread) which
+// initializes the DBusThreadManager instance.
+class CHROMEOS_EXPORT ArcOemCryptoClient : public DBusClient {
+ public:
+  ArcOemCryptoClient();
+  ~ArcOemCryptoClient() override;
+
+  // Factory function, creates a new instance and returns ownership.
+  // For normal usage, access the singleton via DBusThreadManager::Get().
+  static ArcOemCryptoClient* Create();
+
+  // Bootstraps the Mojo IPC connection between Chrome and the service daemon.
+  // This should pass in the child end of a Mojo pipe.
+  virtual void BootstrapMojoConnection(base::ScopedFD fd,
+                                       VoidDBusMethodCallback callback) = 0;
+};
+}  // namespace chromeos
+
+#endif  // CHROMEOS_DBUS_ARC_OEMCRYPTO_CLIENT_H_
diff --git a/chromeos/dbus/dbus_clients_browser.cc b/chromeos/dbus/dbus_clients_browser.cc
index d5a54861..93353d7 100644
--- a/chromeos/dbus/dbus_clients_browser.cc
+++ b/chromeos/dbus/dbus_clients_browser.cc
@@ -6,6 +6,7 @@
 
 #include "base/logging.h"
 #include "chromeos/dbus/arc_obb_mounter_client.h"
+#include "chromeos/dbus/arc_oemcrypto_client.h"
 #include "chromeos/dbus/auth_policy_client.h"
 #include "chromeos/dbus/cros_disks_client.h"
 #include "chromeos/dbus/dbus_client_implementation_type.h"
@@ -13,6 +14,7 @@
 #include "chromeos/dbus/debug_daemon_client.h"
 #include "chromeos/dbus/easy_unlock_client.h"
 #include "chromeos/dbus/fake_arc_obb_mounter_client.h"
+#include "chromeos/dbus/fake_arc_oemcrypto_client.h"
 #include "chromeos/dbus/fake_auth_policy_client.h"
 #include "chromeos/dbus/fake_debug_daemon_client.h"
 #include "chromeos/dbus/fake_easy_unlock_client.h"
@@ -36,6 +38,11 @@
     arc_obb_mounter_client_.reset(new FakeArcObbMounterClient);
 
   if (use_real_clients)
+    arc_oemcrypto_client_.reset(ArcOemCryptoClient::Create());
+  else
+    arc_oemcrypto_client_.reset(new FakeArcOemCryptoClient);
+
+  if (use_real_clients)
     auth_policy_client_.reset(AuthPolicyClient::Create());
   else
     auth_policy_client_.reset(new FakeAuthPolicyClient);
@@ -86,6 +93,7 @@
   DCHECK(DBusThreadManager::IsInitialized());
 
   arc_obb_mounter_client_->Init(system_bus);
+  arc_oemcrypto_client_->Init(system_bus);
   auth_policy_client_->Init(system_bus);
   cros_disks_client_->Init(system_bus);
   debug_daemon_client_->Init(system_bus);
diff --git a/chromeos/dbus/dbus_clients_browser.h b/chromeos/dbus/dbus_clients_browser.h
index a484eed..340f65e 100644
--- a/chromeos/dbus/dbus_clients_browser.h
+++ b/chromeos/dbus/dbus_clients_browser.h
@@ -17,6 +17,7 @@
 namespace chromeos {
 
 class ArcObbMounterClient;
+class ArcOemCryptoClient;
 class AuthPolicyClient;
 class CrosDisksClient;
 class DebugDaemonClient;
@@ -43,6 +44,7 @@
   friend class DBusThreadManagerSetter;
 
   std::unique_ptr<ArcObbMounterClient> arc_obb_mounter_client_;
+  std::unique_ptr<ArcOemCryptoClient> arc_oemcrypto_client_;
   std::unique_ptr<AuthPolicyClient> auth_policy_client_;
   std::unique_ptr<CrosDisksClient> cros_disks_client_;
   std::unique_ptr<DebugDaemonClient> debug_daemon_client_;
diff --git a/chromeos/dbus/dbus_thread_manager.cc b/chromeos/dbus/dbus_thread_manager.cc
index 88571830..9112f42 100644
--- a/chromeos/dbus/dbus_thread_manager.cc
+++ b/chromeos/dbus/dbus_thread_manager.cc
@@ -13,6 +13,7 @@
 #include "base/threading/thread.h"
 #include "chromeos/chromeos_switches.h"
 #include "chromeos/dbus/arc_obb_mounter_client.h"
+#include "chromeos/dbus/arc_oemcrypto_client.h"
 #include "chromeos/dbus/auth_policy_client.h"
 #include "chromeos/dbus/biod/biod_client.h"
 #include "chromeos/dbus/cras_audio_client.h"
@@ -115,6 +116,11 @@
                           : nullptr;
 }
 
+ArcOemCryptoClient* DBusThreadManager::GetArcOemCryptoClient() {
+  return clients_browser_ ? clients_browser_->arc_oemcrypto_client_.get()
+                          : nullptr;
+}
+
 AuthPolicyClient* DBusThreadManager::GetAuthPolicyClient() {
   return clients_browser_ ? clients_browser_->auth_policy_client_.get()
                           : nullptr;
diff --git a/chromeos/dbus/dbus_thread_manager.h b/chromeos/dbus/dbus_thread_manager.h
index b16c9eeb..33fd70b 100644
--- a/chromeos/dbus/dbus_thread_manager.h
+++ b/chromeos/dbus/dbus_thread_manager.h
@@ -25,6 +25,7 @@
 
 // Style Note: Clients are sorted by names.
 class ArcObbMounterClient;
+class ArcOemCryptoClient;
 class AuthPolicyClient;
 class BiodClient;
 class CrasAudioClient;
@@ -121,6 +122,7 @@
   // TODO(jamescook): Replace this with calls to FooClient::Get().
   // http://crbug.com/647367
   ArcObbMounterClient* GetArcObbMounterClient();
+  ArcOemCryptoClient* GetArcOemCryptoClient();
   AuthPolicyClient* GetAuthPolicyClient();
   BiodClient* GetBiodClient();
   CrasAudioClient* GetCrasAudioClient();
diff --git a/chromeos/dbus/dbus_thread_manager_unittest.cc b/chromeos/dbus/dbus_thread_manager_unittest.cc
index ba141028..201de8e6 100644
--- a/chromeos/dbus/dbus_thread_manager_unittest.cc
+++ b/chromeos/dbus/dbus_thread_manager_unittest.cc
@@ -21,6 +21,7 @@
 
   // Clients were created.
   EXPECT_TRUE(manager->GetArcObbMounterClient());
+  EXPECT_TRUE(manager->GetArcOemCryptoClient());
   EXPECT_TRUE(manager->GetCrasAudioClient());
   EXPECT_TRUE(manager->GetCrosDisksClient());
   EXPECT_TRUE(manager->GetCryptohomeClient());
@@ -73,6 +74,7 @@
 
   // Clients for the browser were created.
   EXPECT_TRUE(manager->GetArcObbMounterClient());
+  EXPECT_TRUE(manager->GetArcOemCryptoClient());
   EXPECT_TRUE(manager->GetCrosDisksClient());
   EXPECT_TRUE(manager->GetDebugDaemonClient());
   EXPECT_TRUE(manager->GetEasyUnlockClient());
@@ -108,6 +110,7 @@
 
   // Clients for other processes were not created.
   EXPECT_FALSE(manager->GetArcObbMounterClient());
+  EXPECT_FALSE(manager->GetArcOemCryptoClient());
   EXPECT_FALSE(manager->GetCrosDisksClient());
   EXPECT_FALSE(manager->GetDebugDaemonClient());
   EXPECT_FALSE(manager->GetEasyUnlockClient());
diff --git a/chromeos/dbus/fake_arc_oemcrypto_client.cc b/chromeos/dbus/fake_arc_oemcrypto_client.cc
new file mode 100644
index 0000000..4716d75
--- /dev/null
+++ b/chromeos/dbus/fake_arc_oemcrypto_client.cc
@@ -0,0 +1,28 @@
+// 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 "chromeos/dbus/fake_arc_oemcrypto_client.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/threading/thread_task_runner_handle.h"
+
+namespace chromeos {
+
+FakeArcOemCryptoClient::FakeArcOemCryptoClient() {}
+
+FakeArcOemCryptoClient::~FakeArcOemCryptoClient() {}
+
+void FakeArcOemCryptoClient::Init(dbus::Bus* bus) {}
+
+void FakeArcOemCryptoClient::BootstrapMojoConnection(
+    base::ScopedFD fd,
+    VoidDBusMethodCallback callback) {
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(std::move(callback), DBUS_METHOD_CALL_FAILURE));
+}
+
+}  // namespace chromeos
diff --git a/chromeos/dbus/fake_arc_oemcrypto_client.h b/chromeos/dbus/fake_arc_oemcrypto_client.h
new file mode 100644
index 0000000..183fa94
--- /dev/null
+++ b/chromeos/dbus/fake_arc_oemcrypto_client.h
@@ -0,0 +1,31 @@
+// 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 CHROMEOS_DBUS_FAKE_ARC_OEMCRYPTO_CLIENT_H_
+#define CHROMEOS_DBUS_FAKE_ARC_OEMCRYPTO_CLIENT_H_
+
+#include "chromeos/dbus/arc_oemcrypto_client.h"
+
+namespace chromeos {
+
+// A fake implementation of ArcOemCryptoClient.
+class CHROMEOS_EXPORT FakeArcOemCryptoClient : public ArcOemCryptoClient {
+ public:
+  FakeArcOemCryptoClient();
+  ~FakeArcOemCryptoClient() override;
+
+  // DBusClient override:
+  void Init(dbus::Bus* bus) override;
+
+  // ArcOemCryptoClient override:
+  void BootstrapMojoConnection(base::ScopedFD fd,
+                               VoidDBusMethodCallback callback) override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(FakeArcOemCryptoClient);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROMEOS_DBUS_FAKE_ARC_OEMCRYPTO_CLIENT_H_
diff --git a/chromeos/dbus/fake_update_engine_client.cc b/chromeos/dbus/fake_update_engine_client.cc
index 1ab1ab3e..db0a9c3 100644
--- a/chromeos/dbus/fake_update_engine_client.cc
+++ b/chromeos/dbus/fake_update_engine_client.cc
@@ -102,7 +102,9 @@
 void FakeUpdateEngineClient::SetUpdateOverCellularOneTimePermission(
     const std::string& target_version,
     int64_t target_size,
-    const UpdateOverCellularOneTimePermissionCallback& callback) {}
+    const UpdateOverCellularOneTimePermissionCallback& callback) {
+  callback.Run(true);
+}
 
 void FakeUpdateEngineClient::set_default_status(
     const UpdateEngineClient::Status& status) {
diff --git a/components/arc/common/typemaps.gni b/components/arc/common/typemaps.gni
index 32ca073c..8902a9b 100644
--- a/components/arc/common/typemaps.gni
+++ b/components/arc/common/typemaps.gni
@@ -11,5 +11,6 @@
   "//components/arc/common/intent_helper.typemap",
   "//components/arc/common/video_common.typemap",
   "//components/arc/common/video_encode_accelerator.typemap",
+  "//components/arc/common/voice_interaction_framework.typemap",
   "//components/arc/common/volume_mounter.typemap",
 ]
diff --git a/components/arc/common/voice_interaction_framework.mojom b/components/arc/common/voice_interaction_framework.mojom
index ad26b90..192e543 100644
--- a/components/arc/common/voice_interaction_framework.mojom
+++ b/components/arc/common/voice_interaction_framework.mojom
@@ -2,14 +2,21 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Next MinVersion: 8
+// Next MinVersion: 9
 
 module arc.mojom;
 
 import "screen_rect.mojom";
 
+[Extensible]
+enum VoiceInteractionState {
+  NOT_READY = 0,
+  STOPPED,
+  RUNNING
+};
+
 // Handles voice interaction queries from Android.
-// Next method ID: 5
+// Next method ID: 6
 interface VoiceInteractionFrameworkHost {
   // Returns a screenshot of currently focused window or empty array if
   // no window is focused. |data| represents the image encoded in JPEG
@@ -28,6 +35,9 @@
 
   // Notifies Chrome whether voice interaction session is running.
   [MinVersion=6]SetVoiceInteractionRunning@4(bool running);
+
+  // Notifies Chrome the state of voice interaction session.
+  [MinVersion=8]SetVoiceInteractionState@5(VoiceInteractionState state);
 };
 
 // Indicates voice interaction configuration status.
@@ -69,6 +79,6 @@
   [MinVersion=5] StartVoiceInteractionSetupWizard@6();
 
   // Queries voice interaction settings status.
-  [MinVersion=7] GetVoiceInteractionSettings@7() => 
+  [MinVersion=7] GetVoiceInteractionSettings@7() =>
     (VoiceInteractionStatus status);
-};
\ No newline at end of file
+};
diff --git a/components/arc/common/voice_interaction_framework.typemap b/components/arc/common/voice_interaction_framework.typemap
new file mode 100644
index 0000000..8254719
--- /dev/null
+++ b/components/arc/common/voice_interaction_framework.typemap
@@ -0,0 +1,13 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+mojom = "//components/arc/common/voice_interaction_framework.mojom"
+public_headers = [ "//ash/public/cpp/voice_interaction_state.h" ]
+public_deps = [
+  "//ash/public/cpp:ash_public_cpp",
+]
+traits_headers =
+    [ "//components/arc/voice_interaction/voice_interaction_struct_traits.h" ]
+sources = []
+type_mappings = [ "arc.mojom.VoiceInteractionState=ash::VoiceInteractionState" ]
diff --git a/components/arc/ime/arc_ime_bridge_impl.cc b/components/arc/ime/arc_ime_bridge_impl.cc
index c7f17e2..304788b 100644
--- a/components/arc/ime/arc_ime_bridge_impl.cc
+++ b/components/arc/ime/arc_ime_bridge_impl.cc
@@ -59,14 +59,14 @@
 std::vector<mojom::CompositionSegmentPtr> ConvertSegments(
     const ui::CompositionText& composition) {
   std::vector<mojom::CompositionSegmentPtr> segments;
-  for (const ui::CompositionUnderline& underline : composition.underlines) {
+  for (const ui::ImeTextSpan& ime_text_span : composition.ime_text_spans) {
     mojom::CompositionSegmentPtr segment = mojom::CompositionSegment::New();
-    segment->start_offset = underline.start_offset;
-    segment->end_offset = underline.end_offset;
+    segment->start_offset = ime_text_span.start_offset;
+    segment->end_offset = ime_text_span.end_offset;
     segment->emphasized =
-        (underline.thick ||
-         (composition.selection.start() == underline.start_offset &&
-          composition.selection.end() == underline.end_offset));
+        (ime_text_span.thick ||
+         (composition.selection.start() == ime_text_span.start_offset &&
+          composition.selection.end() == ime_text_span.end_offset));
     segments.push_back(std::move(segment));
   }
   return segments;
diff --git a/components/arc/voice_interaction/OWNERS b/components/arc/voice_interaction/OWNERS
new file mode 100644
index 0000000..bb65116
--- /dev/null
+++ b/components/arc/voice_interaction/OWNERS
@@ -0,0 +1,2 @@
+per-file *_struct_traits*.*=set noparent
+per-file *_struct_traits*.*=file://ipc/SECURITY_OWNERS
diff --git a/components/arc/voice_interaction/voice_interaction_struct_traits.h b/components/arc/voice_interaction/voice_interaction_struct_traits.h
new file mode 100644
index 0000000..c519f96
--- /dev/null
+++ b/components/arc/voice_interaction/voice_interaction_struct_traits.h
@@ -0,0 +1,53 @@
+// 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_ARC_VOICE_INTERACTION_VOICE_INTERACTION_STRUCT_TRAITS_H_
+#define COMPONENTS_ARC_VOICE_INTERACTION_VOICE_INTERACTION_STRUCT_TRAITS_H_
+
+#include "ash/public/cpp/voice_interaction_state.h"
+#include "components/arc/common/voice_interaction_framework.mojom.h"
+
+namespace mojo {
+
+template <>
+struct EnumTraits<arc::mojom::VoiceInteractionState,
+                  ash::VoiceInteractionState> {
+  static arc::mojom::VoiceInteractionState ToMojom(
+      ash::VoiceInteractionState state) {
+    switch (state) {
+      case ash::VoiceInteractionState::NOT_READY:
+        return arc::mojom::VoiceInteractionState::NOT_READY;
+      case ash::VoiceInteractionState::STOPPED:
+        return arc::mojom::VoiceInteractionState::STOPPED;
+      case ash::VoiceInteractionState::RUNNING:
+        return arc::mojom::VoiceInteractionState::RUNNING;
+    }
+
+    NOTREACHED() << "Invalid state: " << static_cast<int>(state);
+    return arc::mojom::VoiceInteractionState::NOT_READY;
+  }
+
+  static bool FromMojom(arc::mojom::VoiceInteractionState mojom_state,
+                        ash::VoiceInteractionState* state) {
+    switch (mojom_state) {
+      case arc::mojom::VoiceInteractionState::NOT_READY:
+        *state = ash::VoiceInteractionState::NOT_READY;
+        return true;
+      case arc::mojom::VoiceInteractionState::STOPPED:
+        *state = ash::VoiceInteractionState::STOPPED;
+        return true;
+      case arc::mojom::VoiceInteractionState::RUNNING:
+        *state = ash::VoiceInteractionState::RUNNING;
+        return true;
+    }
+
+    NOTREACHED() << "Invalid state: " << static_cast<int>(mojom_state);
+    *state = ash::VoiceInteractionState::NOT_READY;
+    return false;
+  }
+};
+
+}  // namespace mojo
+
+#endif  // COMPONENTS_ARC_VOICE_INTERACTION_VOICE_INTERACTION_STRUCT_TRAITS_H_
diff --git a/components/autofill/content/renderer/autofill_agent.cc b/components/autofill/content/renderer/autofill_agent.cc
index 6d7e12ab..d3ff7bf 100644
--- a/components/autofill/content/renderer/autofill_agent.cc
+++ b/components/autofill/content/renderer/autofill_agent.cc
@@ -188,7 +188,6 @@
     OnSameDocumentNavigationCompleted();
   } else {
     // Navigation to a new page or a page refresh.
-    element_.Reset();
     form_cache_.Reset();
     submitted_forms_.clear();
     last_interacted_form_.Reset();
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index be8c652..dbb5b23 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -17,6 +17,8 @@
     "address_rewriter.cc",
     "address_rewriter.h",
     "address_rewriter_rules.cc",
+    "address_validation_util.cc",
+    "address_validation_util.h",
     "autocomplete_history_manager.cc",
     "autocomplete_history_manager.h",
     "autofill-inl.h",
@@ -56,6 +58,8 @@
     "autofill_profile.h",
     "autofill_profile_comparator.cc",
     "autofill_profile_comparator.h",
+    "autofill_profile_validator.cc",
+    "autofill_profile_validator.h",
     "autofill_provider.cc",
     "autofill_provider.h",
     "autofill_scanner.cc",
@@ -321,6 +325,7 @@
     "address_i18n_unittest.cc",
     "address_rewriter_unittest.cc",
     "address_unittest.cc",
+    "address_validation_util_unittest.cc",
     "autocomplete_history_manager_unittest.cc",
     "autofill_country_unittest.cc",
     "autofill_data_model_unittest.cc",
@@ -335,6 +340,7 @@
     "autofill_metrics_unittest.cc",
     "autofill_profile_comparator_unittest.cc",
     "autofill_profile_unittest.cc",
+    "autofill_profile_validator_unittest.cc",
     "autofill_type_unittest.cc",
     "contact_info_unittest.cc",
     "country_combobox_model_unittest.cc",
diff --git a/components/autofill/core/browser/address_validation_util.cc b/components/autofill/core/browser/address_validation_util.cc
new file mode 100644
index 0000000..76b056dc
--- /dev/null
+++ b/components/autofill/core/browser/address_validation_util.cc
@@ -0,0 +1,155 @@
+// 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/autofill/core/browser/address_validation_util.h"
+
+#include <utility>
+
+#include "base/logging.h"
+#include "base/memory/ptr_util.h"
+#include "base/stl_util.h"
+#include "base/strings/utf_string_conversions.h"
+#include "components/autofill/core/browser/address_i18n.h"
+#include "components/autofill/core/browser/country_data.h"
+#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h"
+#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_validator.h"
+
+namespace autofill {
+
+namespace {
+
+using ::i18n::addressinput::COUNTRY;
+using ::i18n::addressinput::ADMIN_AREA;
+using ::i18n::addressinput::LOCALITY;
+using ::i18n::addressinput::DEPENDENT_LOCALITY;
+using ::i18n::addressinput::SORTING_CODE;
+using ::i18n::addressinput::POSTAL_CODE;
+using ::i18n::addressinput::STREET_ADDRESS;
+using ::i18n::addressinput::RECIPIENT;
+
+using ::i18n::addressinput::AddressData;
+using ::i18n::addressinput::AddressField;
+using ::i18n::addressinput::AddressProblem;
+using ::i18n::addressinput::FieldProblemMap;
+
+using ::i18n::addressinput::INVALID_FORMAT;
+using ::i18n::addressinput::MISMATCHING_VALUE;
+using ::i18n::addressinput::MISSING_REQUIRED_FIELD;
+using ::i18n::addressinput::UNEXPECTED_FIELD;
+using ::i18n::addressinput::UNKNOWN_VALUE;
+
+const AddressField kFields[] = {COUNTRY, ADMIN_AREA, POSTAL_CODE};
+const AddressProblem kProblems[] = {UNEXPECTED_FIELD, MISSING_REQUIRED_FIELD,
+                                    UNKNOWN_VALUE, INVALID_FORMAT,
+                                    MISMATCHING_VALUE};
+
+// If the |address_field| is valid, set the validity state of the
+// |address_field| in the |profile| to the |state| and return true.
+// Otherwise, return false.
+bool SetValidityStateForAddressField(AutofillProfile* profile,
+                                     AddressField address_field,
+                                     AutofillProfile::ValidityState state) {
+  ServerFieldType server_field = i18n::TypeForField(address_field,
+                                                    /*billing=*/false);
+  if (server_field == UNKNOWN_TYPE)
+    return false;
+  DCHECK(profile);
+  profile->SetValidityState(server_field, state);
+  return true;
+}
+
+// Set the validity state of all address fields in the |profile| to |state|.
+void SetAllValidityStates(AutofillProfile* profile,
+                          AutofillProfile::ValidityState state) {
+  DCHECK(profile);
+  for (auto field : kFields)
+    SetValidityStateForAddressField(profile, field, state);
+}
+
+// Returns all relevant pairs of (field, problem), where field is in
+// |kFields|, and problem is in |kProblems|.
+FieldProblemMap* CreateFieldProblemMap() {
+  FieldProblemMap* filter = new FieldProblemMap();
+  for (auto field : kFields) {
+    for (auto problem : kProblems) {
+      filter->insert(std::make_pair(field, problem));
+    }
+  }
+  return filter;
+}
+
+// GetFilter() will make sure that the validation only returns problems that
+// are relevant.
+const FieldProblemMap* GetFilter() {
+  static const FieldProblemMap* const filter = CreateFieldProblemMap();
+  return filter;
+}
+
+// Initializes |address| data from the address info in the |profile|.
+void InitializeAddressFromProfile(const AutofillProfile& profile,
+                                  AddressData* address) {
+  address->region_code =
+      base::UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_COUNTRY));
+  address->administrative_area =
+      base::UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_STATE));
+  address->postal_code =
+      base::UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_ZIP));
+}
+
+}  // namespace
+
+namespace address_validation_util {
+
+AutofillProfile::ValidityState ValidateAddress(
+    AutofillProfile* profile,
+    AddressValidator* address_validator) {
+  DCHECK(address_validator);
+  if (!profile)
+    return AutofillProfile::UNVALIDATED;
+
+  if (!base::ContainsValue(
+          CountryDataMap::GetInstance()->country_codes(),
+          base::UTF16ToUTF8(profile->GetRawInfo(ADDRESS_HOME_COUNTRY)))) {
+    // If the country code is not in the database, the country code and the
+    // profile are invalid, and other fields cannot be validated, because it is
+    // unclear which, if any, rule should apply.
+    SetAllValidityStates(profile, AutofillProfile::UNVALIDATED);
+    SetValidityStateForAddressField(profile, COUNTRY, AutofillProfile::INVALID);
+    return AutofillProfile::INVALID;
+  }
+
+  AddressData address;
+  InitializeAddressFromProfile(*profile, &address);
+
+  AutofillProfile::ValidityState profile_validity;
+  FieldProblemMap problems;
+  // status denotes if the rule was successfully loaded before validation.
+  AddressValidator::Status status =
+      address_validator->ValidateAddress(address, GetFilter(), &problems);
+
+  if (status == AddressValidator::SUCCESS) {
+    // The rules were found and applied. Initialize all fields to VALID here and
+    // update the fields with problems below.
+    profile_validity = AutofillProfile::VALID;
+    SetAllValidityStates(profile, AutofillProfile::VALID);
+  } else {
+    // If the rules are not yet available, ValidateAddress can still check for
+    // MISSING_REQUIRED_FIELD. In this case, the address fields will be either
+    // UNVALIDATED or INVALID.
+    profile_validity = AutofillProfile::UNVALIDATED;
+    SetAllValidityStates(profile, AutofillProfile::UNVALIDATED);
+    SetValidityStateForAddressField(profile, COUNTRY, AutofillProfile::VALID);
+  }
+
+  for (auto problem : problems) {
+    if (SetValidityStateForAddressField(profile, problem.first,
+                                        AutofillProfile::INVALID)) {
+      profile_validity = AutofillProfile::INVALID;
+    }
+  }
+  return profile_validity;
+}
+
+}  // namespace address_validation_util
+}  // namespace autofill
diff --git a/components/autofill/core/browser/address_validation_util.h b/components/autofill/core/browser/address_validation_util.h
new file mode 100644
index 0000000..c58c6959
--- /dev/null
+++ b/components/autofill/core/browser/address_validation_util.h
@@ -0,0 +1,23 @@
+// 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_AUTOFILL_CORE_BROWSER_ADDRESS_VALIDATION_UTIL_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_ADDRESS_VALIDATION_UTIL_H_
+
+#include "components/autofill/core/browser/autofill_profile.h"
+#include "third_party/libaddressinput/chromium/chrome_address_validator.h"
+
+namespace autofill {
+namespace address_validation_util {
+
+// Validates the address fields of the |profile|.
+// Returns the ValidityState of the |profile| according to its address fields.
+AutofillProfile::ValidityState ValidateAddress(
+    AutofillProfile* profile,
+    AddressValidator* address_validator);
+
+}  // namespace address_validation_util
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_ADDRESS_VALIDATION_UTIL_H_
diff --git a/components/autofill/core/browser/address_validation_util_unittest.cc b/components/autofill/core/browser/address_validation_util_unittest.cc
new file mode 100644
index 0000000..c45f682d
--- /dev/null
+++ b/components/autofill/core/browser/address_validation_util_unittest.cc
@@ -0,0 +1,235 @@
+// 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/autofill/core/browser/address_validation_util.h"
+
+#include <memory>
+#include <string>
+
+#include "base/bind.h"
+#include "base/guid.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_task_environment.h"
+#include "components/autofill/core/browser/autofill_test_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/libaddressinput/src/cpp/include/libaddressinput/null_storage.h"
+#include "third_party/libaddressinput/src/cpp/test/testdata_source.h"
+
+namespace autofill {
+
+using ::i18n::addressinput::Source;
+using ::i18n::addressinput::Storage;
+using ::i18n::addressinput::NullStorage;
+using ::i18n::addressinput::TestdataSource;
+
+// Used to load region rules for this test.
+class ValidationTestDataSource : public TestdataSource {
+ public:
+  ValidationTestDataSource() : TestdataSource(true) {}
+
+  ~ValidationTestDataSource() override {}
+
+  void Get(const std::string& key, const Callback& data_ready) const override {
+    data_ready(
+        true, key,
+        new std::string(
+            "{"
+            "\"data/CA\": "
+            "{\"lang\": \"en\", \"upper\": \"ACNOSZ\", "
+            "\"zipex\": \"H3Z 2Y7,V8X 3X4,T0L 1K0,T0H 1A0\", "
+            "\"name\": \"CANADA\", "
+            "\"fmt\": \"%N%n%O%n%A%n%C %S %Z\", \"id\": \"data/CA\", "
+            "\"languages\": \"en~fr\", \"sub_keys\": \"NB~QC\", \"key\": "
+            "\"CA\", "
+            "\"require\": \"ACSZ\", \"sub_names\": \"New Brunswick~Quebec\", "
+            "\"sub_zips\": \"E~G|H|J\"}, "
+            "\"data/CA--fr\": "
+            "{\"lang\": \"fr\", \"upper\": \"ACNOSZ\", "
+            "\"zipex\": \"H3Z 2Y7,V8X 3X4,T0L 1K0,T0H 1A0\", "
+            "\"name\": \"CANADA\", "
+            "\"fmt\": \"%N%n%O%n%A%n%C %S %Z\", \"require\": \"ACSZ\", "
+            "\"sub_keys\": \"NB~QC\", \"key\": \"CA\", "
+            "\"id\": \"data/CA--fr\", "
+            "\"sub_names\":\"Nouveau-Brunswick~Québec\","
+            "\"sub_zips\": \"E~G|H|J\"}, "
+            "\"data/CA/QC\": "
+            "{\"lang\": \"en\", \"key\": \"QC\", "
+            "\"id\": \"data/CA/QC\", \"zip\": \"G|H|J\", \"name\": \"Quebec\"},"
+            "\"data/CA/QC--fr\": "
+            "{\"lang\": \"fr\", \"key\": \"QC\", \"id\": \"data/CA/QC--fr\", "
+            "\"zip\": \"G|H|J\", \"name\": \"Québec\"}, "
+            "\"data/CA/NB\": "
+            "{\"lang\": \"en\", \"key\": \"NB\", \"id\": \"data/CA/NB\", "
+            "\"zip\": \"E\", \"name\": \"New Brunswick\"}, "
+            "\"data/CA/NB--fr\": "
+            "{\"lang\": \"fr\", \"key\": \"NB\", \"id\": \"data/CA/NB--fr\", "
+            "\"zip\": \"E\", \"name\": \"Nouveau-Brunswick\"}"
+            "}"));
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ValidationTestDataSource);
+};
+
+class AutofillAddressValidationTest : public testing::Test, LoadRulesListener {
+ public:
+  AutofillAddressValidationTest()
+      : validator_(std::unique_ptr<Source>(new ValidationTestDataSource()),
+                   std::unique_ptr<Storage>(new NullStorage),
+                   this) {
+    validator_.LoadRules("CA");
+  }
+
+  AutofillProfile::ValidityState ValidateAddressTest(AutofillProfile* profile) {
+    return address_validation_util::ValidateAddress(profile, &validator_);
+  }
+
+  ~AutofillAddressValidationTest() override {}
+
+ private:
+  AddressValidator validator_;
+
+  // LoadRulesListener implementation.
+  void OnAddressValidationRulesLoaded(const std::string& country_code,
+                                      bool success) override {}
+
+  DISALLOW_COPY_AND_ASSIGN(AutofillAddressValidationTest);
+};
+
+TEST_F(AutofillAddressValidationTest, ValidateNULLProfile) {
+  EXPECT_EQ(AutofillProfile::UNVALIDATED, ValidateAddressTest(nullptr));
+}
+
+TEST_F(AutofillAddressValidationTest, ValidateFullValidProfile) {
+  // This is a valid profile according to the rules in ValidationTestDataSource:
+  // Address Line 1: "666 Notre-Dame Ouest",
+  // Address Line 2: "Apt 8", City: "Montreal", Province: "QC",
+  // Postal Code: "H3B 2T9", Country Code: "CA",
+  AutofillProfile profile(autofill::test::GetFullValidProfile());
+  EXPECT_EQ(AutofillProfile::VALID, ValidateAddressTest(&profile));
+  EXPECT_EQ(AutofillProfile::VALID,
+            profile.GetValidityState(ADDRESS_HOME_COUNTRY));
+  EXPECT_EQ(AutofillProfile::VALID,
+            profile.GetValidityState(ADDRESS_HOME_STATE));
+  EXPECT_EQ(AutofillProfile::VALID, profile.GetValidityState(ADDRESS_HOME_ZIP));
+}
+
+TEST_F(AutofillAddressValidationTest, ValidateFullProfile_CountryCodeNotExist) {
+  // This is a profile with invalid country code, therefore it cannot be
+  // validated according to ValidationTestDataSource.
+  const std::string country_code = "PP";
+  AutofillProfile profile(autofill::test::GetFullValidProfile());
+  profile.SetRawInfo(ADDRESS_HOME_COUNTRY, base::UTF8ToUTF16(country_code));
+  EXPECT_EQ(AutofillProfile::INVALID, ValidateAddressTest(&profile));
+  EXPECT_EQ(AutofillProfile::INVALID,
+            profile.GetValidityState(ADDRESS_HOME_COUNTRY));
+  EXPECT_EQ(AutofillProfile::UNVALIDATED,
+            profile.GetValidityState(ADDRESS_HOME_STATE));
+  EXPECT_EQ(AutofillProfile::UNVALIDATED,
+            profile.GetValidityState(ADDRESS_HOME_ZIP));
+}
+
+TEST_F(AutofillAddressValidationTest, ValidateFullProfile_RuleNotAvailable) {
+  // This is a profile with valid country code, but the rule is not available in
+  // the ValidationTestDataSource.
+  const std::string country_code = "US";
+  AutofillProfile profile(autofill::test::GetFullValidProfile());
+  profile.SetRawInfo(ADDRESS_HOME_COUNTRY, base::UTF8ToUTF16(country_code));
+  EXPECT_EQ(AutofillProfile::UNVALIDATED, ValidateAddressTest(&profile));
+  EXPECT_EQ(AutofillProfile::VALID,
+            profile.GetValidityState(ADDRESS_HOME_COUNTRY));
+  EXPECT_EQ(AutofillProfile::UNVALIDATED,
+            profile.GetValidityState(ADDRESS_HOME_STATE));
+  EXPECT_EQ(AutofillProfile::UNVALIDATED,
+            profile.GetValidityState(ADDRESS_HOME_ZIP));
+}
+
+TEST_F(AutofillAddressValidationTest, ValidateAddress_AdminAreaNotExists) {
+  const std::string admin_area_code = "QQ";
+  AutofillProfile profile(autofill::test::GetFullValidProfile());
+  profile.SetRawInfo(ADDRESS_HOME_STATE, base::UTF8ToUTF16(admin_area_code));
+
+  EXPECT_EQ(AutofillProfile::INVALID, ValidateAddressTest(&profile));
+  EXPECT_EQ(AutofillProfile::VALID,
+            profile.GetValidityState(ADDRESS_HOME_COUNTRY));
+  EXPECT_EQ(AutofillProfile::INVALID,
+            profile.GetValidityState(ADDRESS_HOME_STATE));
+  EXPECT_EQ(AutofillProfile::VALID, profile.GetValidityState(ADDRESS_HOME_ZIP));
+}
+
+TEST_F(AutofillAddressValidationTest, ValidateAddress_AdminAreaFullName) {
+  const std::string admin_area = "Quebec";
+  AutofillProfile profile(autofill::test::GetFullValidProfile());
+  profile.SetRawInfo(ADDRESS_HOME_STATE, base::UTF8ToUTF16(admin_area));
+
+  EXPECT_EQ(AutofillProfile::VALID, ValidateAddressTest(&profile));
+  EXPECT_EQ(AutofillProfile::VALID,
+            profile.GetValidityState(ADDRESS_HOME_COUNTRY));
+  EXPECT_EQ(AutofillProfile::VALID,
+            profile.GetValidityState(ADDRESS_HOME_STATE));
+  EXPECT_EQ(AutofillProfile::VALID, profile.GetValidityState(ADDRESS_HOME_ZIP));
+}
+
+TEST_F(AutofillAddressValidationTest, ValidateAddress_AdminAreaSmallCode) {
+  const std::string admin_area = "qc";
+  AutofillProfile profile(autofill::test::GetFullValidProfile());
+  profile.SetRawInfo(ADDRESS_HOME_STATE, base::UTF8ToUTF16(admin_area));
+
+  EXPECT_EQ(AutofillProfile::VALID, ValidateAddressTest(&profile));
+  EXPECT_EQ(AutofillProfile::VALID,
+            profile.GetValidityState(ADDRESS_HOME_COUNTRY));
+  EXPECT_EQ(AutofillProfile::VALID,
+            profile.GetValidityState(ADDRESS_HOME_STATE));
+  EXPECT_EQ(AutofillProfile::VALID, profile.GetValidityState(ADDRESS_HOME_ZIP));
+}
+
+TEST_F(AutofillAddressValidationTest, ValidateAddress_AdminAreaSpecialLetter) {
+  const std::string admin_area = "Québec";
+  AutofillProfile profile(autofill::test::GetFullValidProfile());
+  profile.SetRawInfo(ADDRESS_HOME_STATE, base::UTF8ToUTF16(admin_area));
+
+  EXPECT_EQ(AutofillProfile::VALID, ValidateAddressTest(&profile));
+  EXPECT_EQ(AutofillProfile::VALID,
+            profile.GetValidityState(ADDRESS_HOME_COUNTRY));
+  EXPECT_EQ(AutofillProfile::VALID,
+            profile.GetValidityState(ADDRESS_HOME_STATE));
+  EXPECT_EQ(AutofillProfile::VALID, profile.GetValidityState(ADDRESS_HOME_ZIP));
+}
+
+TEST_F(AutofillAddressValidationTest, ValidateAddress_ValidZipNoSpace) {
+  // TODO(crbug/752614): postal codes in lower case letters should also be
+  // considered as valid. Now, they are considered as INVALID.
+  const std::string postal_code = "H3C6S3";
+  AutofillProfile profile(autofill::test::GetFullValidProfile());
+  profile.SetRawInfo(ADDRESS_HOME_ZIP, base::UTF8ToUTF16(postal_code));
+
+  EXPECT_EQ(AutofillProfile::VALID, ValidateAddressTest(&profile));
+  EXPECT_EQ(AutofillProfile::VALID,
+            profile.GetValidityState(ADDRESS_HOME_COUNTRY));
+  EXPECT_EQ(AutofillProfile::VALID,
+            profile.GetValidityState(ADDRESS_HOME_STATE));
+  EXPECT_EQ(AutofillProfile::VALID, profile.GetValidityState(ADDRESS_HOME_ZIP));
+}
+
+TEST_F(AutofillAddressValidationTest, ValidateAddress_InvalidZip) {
+  const std::string postal_code = "ABC 123";
+  AutofillProfile profile(autofill::test::GetFullValidProfile());
+  profile.SetRawInfo(ADDRESS_HOME_ZIP, base::UTF8ToUTF16(postal_code));
+
+  EXPECT_EQ(AutofillProfile::INVALID, ValidateAddressTest(&profile));
+  EXPECT_EQ(AutofillProfile::VALID,
+            profile.GetValidityState(ADDRESS_HOME_COUNTRY));
+  EXPECT_EQ(AutofillProfile::VALID,
+            profile.GetValidityState(ADDRESS_HOME_STATE));
+  EXPECT_EQ(AutofillProfile::INVALID,
+            profile.GetValidityState(ADDRESS_HOME_ZIP));
+}
+
+// TODO(crbug/754727): add tests for a non-default language.
+// Ex: Nouveau-Brunswick for Canada.
+
+// TODO(crbug/754729): Add tests for a country whose default language is a
+// non-Western one, such as China.
+
+}  // namespace autofill
diff --git a/components/autofill/core/browser/autofill_profile_validator.cc b/components/autofill/core/browser/autofill_profile_validator.cc
new file mode 100644
index 0000000..5fd3b327
--- /dev/null
+++ b/components/autofill/core/browser/autofill_profile_validator.cc
@@ -0,0 +1,129 @@
+// 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/autofill/core/browser/autofill_profile_validator.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/cancelable_callback.h"
+#include "base/logging.h"
+#include "base/memory/ptr_util.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/threading/sequenced_task_runner_handle.h"
+#include "base/time/time.h"
+#include "components/autofill/core/browser/address_validation_util.h"
+#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h"
+#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_validator.h"
+
+namespace autofill {
+namespace {
+
+using ::i18n::addressinput::COUNTRY;
+using ::i18n::addressinput::ADMIN_AREA;
+using ::i18n::addressinput::LOCALITY;
+using ::i18n::addressinput::DEPENDENT_LOCALITY;
+using ::i18n::addressinput::SORTING_CODE;
+using ::i18n::addressinput::POSTAL_CODE;
+using ::i18n::addressinput::STREET_ADDRESS;
+using ::i18n::addressinput::RECIPIENT;
+
+const int kRulesLoadingTimeoutSeconds = 5;
+
+}  // namespace
+
+AutofillProfileValidator::ValidationRequest::ValidationRequest(
+    AutofillProfile* profile,
+    autofill::AddressValidator* validator,
+    AutofillProfileValidatorCallback on_validated)
+    : profile_(profile),
+      validator_(validator),
+      on_validated_(std::move(on_validated)),
+      has_responded_(false),
+      on_timeout_(base::Bind(&ValidationRequest::OnRulesLoaded,
+                             base::Unretained(this))) {
+  DCHECK(profile_);
+  base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, on_timeout_.callback(),
+      base::TimeDelta::FromSeconds(kRulesLoadingTimeoutSeconds));
+}
+
+AutofillProfileValidator::ValidationRequest::~ValidationRequest() {
+  on_timeout_.Cancel();
+}
+
+void AutofillProfileValidator::ValidationRequest::OnRulesLoaded() {
+  on_timeout_.Cancel();
+  // Check if the timeout happened before the rules were loaded.
+  if (has_responded_)
+    return;
+  has_responded_ = true;
+  AutofillProfile::ValidityState profile_validity =
+      address_validation_util::ValidateAddress(profile_, validator_);
+  std::move(on_validated_).Run(profile_validity);
+}
+
+AutofillProfileValidator::AutofillProfileValidator(
+    std::unique_ptr<Source> source,
+    std::unique_ptr<Storage> storage)
+    : address_validator_(std::move(source), std::move(storage), this) {}
+
+AutofillProfileValidator::~AutofillProfileValidator() {}
+
+void AutofillProfileValidator::ValidateProfile(
+    AutofillProfile* profile,
+    AutofillProfileValidatorCallback cb) {
+  if (!profile) {
+    // An null profile is an unvalidated profile.
+    std::move(cb).Run(AutofillProfile::UNVALIDATED);
+    return;
+  }
+  std::unique_ptr<ValidationRequest> request(
+      base::MakeUnique<ValidationRequest>(profile, &address_validator_,
+                                          std::move(cb)));
+
+  // If the |region_code| is not a valid code according to our source, calling
+  // LoadRules would result in calling OnAddressValidationRulesLoaded with
+  // success = false. Thus, we can handle illegitimate |region_code|'s as well.
+  std::string region_code =
+      base::UTF16ToUTF8(profile->GetRawInfo(ADDRESS_HOME_COUNTRY));
+  if (address_validator_.AreRulesLoadedForRegion(region_code)) {
+    request->OnRulesLoaded();
+  } else {
+    // Setup the variables to start validation when the rules are loaded.
+    pending_requests_[region_code].push_back(std::move(request));
+
+    // Start loading the rules for the region. If the rules were already in the
+    // process of being loaded, this call will do nothing.
+    address_validator_.LoadRules(region_code);
+  }
+}
+
+void AutofillProfileValidator::OnAddressValidationRulesLoaded(
+    const std::string& region_code,
+    bool success) {
+  // Even if success = false, we can still validate address partially. We can
+  // check for missing fields or unexpected fields.
+
+  // Check if there is any request for that region code.
+  auto it = pending_requests_.find(region_code);
+  if (it != pending_requests_.end()) {
+    for (auto& request : it->second) {
+      request->OnRulesLoaded();
+    }
+    pending_requests_.erase(it);
+  }
+}
+
+bool AutofillProfileValidator::AreRulesLoadedForRegion(
+    const std::string& region_code) {
+  return address_validator_.AreRulesLoadedForRegion(region_code);
+}
+
+void AutofillProfileValidator::LoadRulesForRegion(
+    const std::string& region_code) {
+  address_validator_.LoadRules(region_code);
+}
+}  // namespace autofill
diff --git a/components/autofill/core/browser/autofill_profile_validator.h b/components/autofill/core/browser/autofill_profile_validator.h
new file mode 100644
index 0000000..e1d4bab
--- /dev/null
+++ b/components/autofill/core/browser/autofill_profile_validator.h
@@ -0,0 +1,108 @@
+// 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_AUTOFILL_CORE_BROWSER_AUTOFILL_PROFILE_VALIDATOR_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_PROFILE_VALIDATOR_H_
+
+#include <stddef.h>
+
+#include <map>
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "base/cancelable_callback.h"
+#include "base/macros.h"
+#include "components/autofill/core/browser/address_i18n.h"
+#include "components/autofill/core/browser/address_validation_util.h"
+#include "components/autofill/core/browser/autofill_profile.h"
+#include "third_party/libaddressinput/chromium/chrome_address_validator.h"
+#include "third_party/libaddressinput/src/cpp/include/libaddressinput/preload_supplier.h"
+#include "third_party/libaddressinput/src/cpp/include/libaddressinput/source.h"
+#include "third_party/libaddressinput/src/cpp/include/libaddressinput/storage.h"
+
+namespace autofill {
+
+using ::i18n::addressinput::BuildCallback;
+using ::i18n::addressinput::PreloadSupplier;
+using ::i18n::addressinput::Source;
+using ::i18n::addressinput::Storage;
+
+using AutofillProfileValidatorCallback =
+    base::OnceCallback<void(AutofillProfile::ValidityState)>;
+
+// AutofillProfileValidator Loads Rules from the server and validates an
+// autofill profile. For a given autofill profile, it will set the ValidityState
+// of several fields in the profile such as country, administrative area, etc.
+// See implementation for more details.
+class AutofillProfileValidator : public autofill::LoadRulesListener {
+ public:
+  // Takes ownership of |source| and |storage|.
+  AutofillProfileValidator(
+      std::unique_ptr<::i18n::addressinput::Source> source,
+      std::unique_ptr<::i18n::addressinput::Storage> storage);
+
+  ~AutofillProfileValidator() override;
+
+  // If the rule corresponding to the |profile| is loaded, this validates the
+  // profile, synchronously. If it is not loaded yet, it sets up a
+  // task to validate the profile when the rule is loaded (asynchronous). If the
+  // loading has not yet started, it will also start loading the rules.
+  void ValidateProfile(AutofillProfile* profile,
+                       AutofillProfileValidatorCallback cb);
+
+ private:
+  // ValidationRequest loads Rules from the server and validates various fields
+  // in an autofill profile.
+  class ValidationRequest {
+   public:
+    ValidationRequest(AutofillProfile* profile,
+                      autofill::AddressValidator* validator,
+                      AutofillProfileValidatorCallback on_validated);
+
+    ~ValidationRequest();
+
+    // Validates various fields of the |profile_|, and calls |on_validated_|.
+    void OnRulesLoaded();
+
+   private:
+    // Not owned. Not Null. Outlives this object.
+    AutofillProfile* profile_;
+    // Not owned. Outlives this object.
+    autofill::AddressValidator* validator_;
+
+    AutofillProfileValidatorCallback on_validated_;
+
+    bool has_responded_ = false;
+    base::CancelableCallback<void()> on_timeout_;
+
+    DISALLOW_COPY_AND_ASSIGN(ValidationRequest);
+  };
+
+  friend class AutofillProfileValidatorTest;
+
+  // Returns whether the rules for the specified |region_code| is loaded.
+  bool AreRulesLoadedForRegion(const std::string& region_code);
+
+  // Starts loading the rules for the specified |region_code|.
+  void LoadRulesForRegion(const std::string& region_code);
+
+  // Implementation of the LoadRulesListener interface. Called when the address
+  // rules for the |region_code| have finished loading.
+  void OnAddressValidationRulesLoaded(const std::string& region_code,
+                                      bool success) override;
+
+  // A map of the region code and the pending requests for that region code.
+  std::map<std::string, std::vector<std::unique_ptr<ValidationRequest>>>
+      pending_requests_;
+
+  // The address validator used to load rules.
+  autofill::AddressValidator address_validator_;
+
+  DISALLOW_COPY_AND_ASSIGN(AutofillProfileValidator);
+};
+
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_PROFILE_VALIDATOR_H_
diff --git a/components/autofill/core/browser/autofill_profile_validator_unittest.cc b/components/autofill/core/browser/autofill_profile_validator_unittest.cc
new file mode 100644
index 0000000..e17c0196
--- /dev/null
+++ b/components/autofill/core/browser/autofill_profile_validator_unittest.cc
@@ -0,0 +1,165 @@
+// 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/autofill/core/browser/autofill_profile_validator.h"
+
+#include <stddef.h>
+#include <set>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/guid.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_task_environment.h"
+#include "components/autofill/core/browser/autofill_test_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/libaddressinput/src/cpp/include/libaddressinput/null_storage.h"
+#include "third_party/libaddressinput/src/cpp/test/testdata_source.h"
+
+namespace autofill {
+
+using ::i18n::addressinput::NullStorage;
+using ::i18n::addressinput::TestdataSource;
+
+using ::i18n::addressinput::COUNTRY;
+using ::i18n::addressinput::ADMIN_AREA;
+using ::i18n::addressinput::LOCALITY;
+using ::i18n::addressinput::DEPENDENT_LOCALITY;
+using ::i18n::addressinput::SORTING_CODE;
+using ::i18n::addressinput::POSTAL_CODE;
+using ::i18n::addressinput::STREET_ADDRESS;
+using ::i18n::addressinput::RECIPIENT;
+
+// Used to load region rules for this test.
+class ValidationTestDataSource : public TestdataSource {
+ public:
+  ValidationTestDataSource() : TestdataSource(true) {}
+
+  ~ValidationTestDataSource() override {}
+
+  void Get(const std::string& key, const Callback& data_ready) const override {
+    data_ready(
+        true, key,
+        new std::string(
+            "{"
+            "\"data/CA\": "
+            "{\"lang\": \"en\", \"upper\": \"ACNOSZ\", "
+            "\"zipex\": \"H3Z 2Y7,V8X 3X4,T0L 1K0,T0H 1A0\", "
+            "\"name\": \"CANADA\", "
+            "\"fmt\": \"%N%n%O%n%A%n%C %S %Z\", \"id\": \"data/CA\", "
+            "\"languages\": \"en\", \"sub_keys\": \"QC\", \"key\": "
+            "\"CA\", "
+            "\"require\": \"ACSZ\", \"sub_names\": \"Quebec\", "
+            "\"sub_zips\": \"G|H|J\"}, "
+            "\"data/CA/QC\": "
+            "{\"lang\": \"en\", \"key\": \"QC\", "
+            "\"id\": \"data/CA/QC\", \"zip\": \"G|H|J\", \"name\": \"Quebec\"}"
+            "}"));
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ValidationTestDataSource);
+};
+
+class AutofillProfileValidatorTest : public testing::Test {
+ public:
+  AutofillProfileValidatorTest()
+      : validator_(new AutofillProfileValidator(
+            std::unique_ptr<Source>(new ValidationTestDataSource()),
+            std::unique_ptr<Storage>(new NullStorage))),
+        onvalidated_cb_(
+            base::BindOnce(&AutofillProfileValidatorTest::OnValidated,
+                           base::Unretained(this))) {}
+
+ protected:
+  const std::unique_ptr<AutofillProfileValidator> validator_;
+
+  ~AutofillProfileValidatorTest() override {}
+
+  void OnValidated(AutofillProfile::ValidityState profile_valid) {
+    EXPECT_EQ(expected_validity_state_, profile_valid);
+  }
+
+  void set_expected_status(AutofillProfile::ValidityState profile_valid) {
+    expected_validity_state_ = profile_valid;
+  }
+
+  bool AreRulesLoadedForRegion(std::string region_code) {
+    return validator_->AreRulesLoadedForRegion(region_code);
+  }
+
+  void LoadRulesForRegion(std::string region_code) {
+    validator_->LoadRulesForRegion(region_code);
+  }
+
+  AutofillProfileValidatorCallback onvalidated_cb_;
+
+ private:
+  AutofillProfile::ValidityState expected_validity_state_;
+
+  base::test::ScopedTaskEnvironment scoped_task_scheduler;
+
+  DISALLOW_COPY_AND_ASSIGN(AutofillProfileValidatorTest);
+};
+
+// Validate a Null profile.
+TEST_F(AutofillProfileValidatorTest, ValidateNullProfile) {
+  set_expected_status(AutofillProfile::UNVALIDATED);
+  validator_->ValidateProfile(nullptr, std::move(onvalidated_cb_));
+}
+// Validate a valid profile, for which the rules are not loaded, yet.
+TEST_F(AutofillProfileValidatorTest, ValidateFullValidProfile_RulesNotLoaded) {
+  // This is a valid profile, and the rules are loaded in the constructors
+  // Province: "QC", Country: "CA"
+  AutofillProfile profile(autofill::test::GetFullValidProfile());
+  set_expected_status(AutofillProfile::VALID);
+
+  std::string country_code =
+      base::UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_COUNTRY));
+  EXPECT_EQ(false, AreRulesLoadedForRegion(country_code));
+
+  validator_->ValidateProfile(&profile, std::move(onvalidated_cb_));
+}
+
+// Validate a Full Profile, for which the rules are already loaded.
+TEST_F(AutofillProfileValidatorTest, ValidateAddress_RulesLoaded) {
+  AutofillProfile profile(autofill::test::GetFullValidProfile());
+  set_expected_status(AutofillProfile::VALID);
+
+  std::string country_code =
+      base::UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_COUNTRY));
+  LoadRulesForRegion(country_code);
+  EXPECT_EQ(true, AreRulesLoadedForRegion(country_code));
+
+  validator_->ValidateProfile(&profile, std::move(onvalidated_cb_));
+}
+
+// When country code is invalid, the profile is invalid.
+TEST_F(AutofillProfileValidatorTest, ValidateAddress_CountryCodeNotExists) {
+  const std::string country_code = "PP";
+  AutofillProfile profile(autofill::test::GetFullValidProfile());
+  profile.SetRawInfo(ADDRESS_HOME_COUNTRY, base::UTF8ToUTF16(country_code));
+  set_expected_status(AutofillProfile::INVALID);
+
+  EXPECT_EQ(false, AreRulesLoadedForRegion(country_code));
+
+  validator_->ValidateProfile(&profile, std::move(onvalidated_cb_));
+}
+
+// When country code is valid, but the rule is not in the source, the profile
+// is unvalidated.
+TEST_F(AutofillProfileValidatorTest, ValidateAddress_RuleNotExists) {
+  const std::string country_code = "US";
+  AutofillProfile profile(autofill::test::GetFullValidProfile());
+  profile.SetRawInfo(ADDRESS_HOME_COUNTRY, base::UTF8ToUTF16(country_code));
+  set_expected_status(AutofillProfile::UNVALIDATED);
+
+  EXPECT_EQ(false, AreRulesLoadedForRegion(country_code));
+
+  validator_->ValidateProfile(&profile, std::move(onvalidated_cb_));
+}
+
+}  // namespace autofill
diff --git a/components/autofill/core/browser/autofill_test_utils.cc b/components/autofill/core/browser/autofill_test_utils.cc
index f6a122ef..aa3b5952 100644
--- a/components/autofill/core/browser/autofill_test_utils.cc
+++ b/components/autofill/core/browser/autofill_test_utils.cc
@@ -183,6 +183,14 @@
     profile->SetRawInfo(type, base::UTF8ToUTF16(value));
 }
 
+AutofillProfile GetFullValidProfile() {
+  AutofillProfile profile(base::GenerateGUID(), "http://www.example.com/");
+  SetProfileInfo(&profile, "Alice", "", "Wonderland", "alice@wonderland.ca",
+                 "Fiction", "666 Notre-Dame Ouest", "Apt 8", "Montreal", "QC",
+                 "H3B 2T9", "CA", "15141112233");
+  return profile;
+}
+
 AutofillProfile GetFullProfile() {
   AutofillProfile profile(base::GenerateGUID(), "http://www.example.com/");
   SetProfileInfo(&profile,
diff --git a/components/autofill/core/browser/autofill_test_utils.h b/components/autofill/core/browser/autofill_test_utils.h
index 65817d8..708f3a64 100644
--- a/components/autofill/core/browser/autofill_test_utils.h
+++ b/components/autofill/core/browser/autofill_test_utils.h
@@ -65,6 +65,9 @@
 void CreateTestAddressFormData(FormData* form,
                                std::vector<ServerFieldTypeSet>* types);
 
+// Returns a full profile with valid info.
+AutofillProfile GetFullValidProfile();
+
 // Returns a profile full of dummy info.
 AutofillProfile GetFullProfile();
 
diff --git a/components/autofill/core/browser/validation.cc b/components/autofill/core/browser/validation.cc
index 60726b8e..c09ea98 100644
--- a/components/autofill/core/browser/validation.cc
+++ b/components/autofill/core/browser/validation.cc
@@ -48,7 +48,7 @@
 
   // Credit card numbers are at most 19 digits in length, 12 digits seems to
   // be a fairly safe lower-bound [1].  Specific card issuers have more rigidly
-  // defined sizes. 
+  // defined sizes.
   // (Last updated: May 29, 2017)
   // [1] https://en.wikipedia.org/wiki/Payment_card_number.
   // CardEditor.isCardNumberLengthMaxium() needs to be kept in sync.
@@ -176,6 +176,23 @@
   }
 }
 
+base::string16 GetEditDialogTitleForCard(CreditCardCompletionStatus status) {
+  switch (status) {
+    case CREDIT_CARD_COMPLETE:
+    case CREDIT_CARD_EXPIRED:
+      return l10n_util::GetStringUTF16(IDS_PAYMENTS_EDIT_CARD);
+    case CREDIT_CARD_NO_CARDHOLDER:
+      return l10n_util::GetStringUTF16(IDS_PAYMENTS_ADD_NAME_ON_CARD);
+    case CREDIT_CARD_NO_NUMBER:
+      return l10n_util::GetStringUTF16(IDS_PAYMENTS_ADD_VALID_CARD_NUMBER);
+    case CREDIT_CARD_NO_BILLING_ADDRESS:
+      return l10n_util::GetStringUTF16(IDS_PAYMENTS_ADD_BILLING_ADDRESS);
+    default:
+      // Multiple things are missing
+      return l10n_util::GetStringUTF16(IDS_PAYMENTS_ADD_MORE_INFORMATION);
+  }
+}
+
 bool IsValidEmailAddress(const base::string16& text) {
   // E-Mail pattern as defined by the WhatWG. (4.10.7.1.5 E-Mail state)
   const base::string16 kEmailPattern = base::ASCIIToUTF16(
diff --git a/components/autofill/core/browser/validation.h b/components/autofill/core/browser/validation.h
index 531cf27..ebcf5db 100644
--- a/components/autofill/core/browser/validation.h
+++ b/components/autofill/core/browser/validation.h
@@ -69,6 +69,11 @@
 // missing, the message will be a generic "more information required".
 base::string16 GetCompletionMessageForCard(CreditCardCompletionStatus status);
 
+// Returns the title string for a card edit dialog. The title string will
+// mention what needs to be added/fixed to make the card valid if it is not
+// valid. Otherwise, it will be "Edit card".
+base::string16 GetEditDialogTitleForCard(CreditCardCompletionStatus status);
+
 // Returns true if |text| looks like a valid e-mail address.
 bool IsValidEmailAddress(const base::string16& text);
 
diff --git a/components/crash/content/browser/child_process_crash_observer_android.cc b/components/crash/content/browser/child_process_crash_observer_android.cc
index b9ae22bb..b59a0dd 100644
--- a/components/crash/content/browser/child_process_crash_observer_android.cc
+++ b/components/crash/content/browser/child_process_crash_observer_android.cc
@@ -45,8 +45,8 @@
       FROM_HERE, {base::MayBlock(), base::TaskPriority::BACKGROUND},
       base::Bind(&CrashDumpManager::ProcessMinidumpFileFromChild,
                  base::Unretained(CrashDumpManager::GetInstance()),
-                 crash_dump_dir_, pid, process_type, termination_status,
-                 app_state));
+                 crash_dump_dir_, child_process_id, process_type,
+                 termination_status, app_state));
 }
 
 }  // namespace breakpad
diff --git a/components/dom_distiller/content/renderer/distiller_js_render_frame_observer.h b/components/dom_distiller/content/renderer/distiller_js_render_frame_observer.h
index e8cbe79..6a67caec 100644
--- a/components/dom_distiller/content/renderer/distiller_js_render_frame_observer.h
+++ b/components/dom_distiller/content/renderer/distiller_js_render_frame_observer.h
@@ -12,7 +12,6 @@
 #include "content/public/renderer/render_frame.h"
 #include "content/public/renderer/render_frame_observer.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
-#include "third_party/WebKit/public/web/WebLocalFrame.h"
 #include "v8/include/v8.h"
 
 namespace dom_distiller {
diff --git a/components/dom_distiller/content/renderer/distiller_native_javascript.cc b/components/dom_distiller/content/renderer/distiller_native_javascript.cc
index f4293659..ae6959a 100644
--- a/components/dom_distiller/content/renderer/distiller_native_javascript.cc
+++ b/components/dom_distiller/content/renderer/distiller_native_javascript.cc
@@ -14,11 +14,8 @@
 #include "gin/function_template.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/WebKit/public/web/WebKit.h"
-#include "third_party/WebKit/public/web/WebLocalFrame.h"
 #include "v8/include/v8.h"
 
-using blink::WebLocalFrame;
-
 namespace dom_distiller {
 
 DistillerNativeJavaScript::DistillerNativeJavaScript(
diff --git a/components/feature_engagement/public/event_constants.cc b/components/feature_engagement/public/event_constants.cc
index 72ea6bd..b2fb65c 100644
--- a/components/feature_engagement/public/event_constants.cc
+++ b/components/feature_engagement/public/event_constants.cc
@@ -10,11 +10,11 @@
 
 #if defined(OS_WIN) || defined(OS_LINUX)
 const char kOmniboxInteraction[] = "omnibox_used";
+const char kNewTabSessionTimeMet[] = "new_tab_session_time_met";
 
 const char kHistoryDeleted[] = "history_deleted";
 const char kIncognitoWindowOpened[] = "incognito_window_opened";
 
-const char kSessionTime[] = "session_time";
 #endif  // defined(OS_WIN) || defined(OS_LINUX)
 
 #if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_IOS)
diff --git a/components/feature_engagement/public/event_constants.h b/components/feature_engagement/public/event_constants.h
index 0b93423..e6d514b2 100644
--- a/components/feature_engagement/public/event_constants.h
+++ b/components/feature_engagement/public/event_constants.h
@@ -17,6 +17,9 @@
 
 // The user has interacted with the omnibox.
 extern const char kOmniboxInteraction[];
+// The user has satisfied the session time requirement to show the NewTabPromo
+// by accumulating 2 hours of active session time (one-off event).
+extern const char kNewTabSessionTimeMet[];
 
 // All the events declared below are the string names
 // of deferred onboarding events for the Incognito Window
@@ -26,12 +29,6 @@
 // The user has opened an incognito window.
 extern const char kIncognitoWindowOpened[];
 
-// All the events declared below are the string names
-// of common deferred onboarding events
-
-// The user has accumulated 2 hours of active session time (one-off event).
-extern const char kSessionTime[];
-
 #endif  // defined(OS_WIN) || defined(OS_LINUX)
 
 #if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_IOS)
diff --git a/components/feedback/system_logs/system_logs_fetcher.h b/components/feedback/system_logs/system_logs_fetcher.h
index 1799d4f..238bb60 100644
--- a/components/feedback/system_logs/system_logs_fetcher.h
+++ b/components/feedback/system_logs/system_logs_fetcher.h
@@ -51,7 +51,8 @@
   // Adds a source to use when fetching.
   void AddSource(std::unique_ptr<SystemLogsSource> source);
 
-  // Starts the fetch process.
+  // Starts the fetch process. After the fetch completes, this instance calls
+  // |callback|, then schedules itself to be deleted.
   void Fetch(const SysLogsFetcherCallback& callback);
 
  private:
diff --git a/components/guest_view/browser/bad_message.h b/components/guest_view/browser/bad_message.h
index 2e81eed2..a0b2c4c 100644
--- a/components/guest_view/browser/bad_message.h
+++ b/components/guest_view/browser/bad_message.h
@@ -23,6 +23,7 @@
 // values in histograms.
 enum BadMessageReason {
   GVM_EMBEDDER_FORBIDDEN_ACCESS_TO_GUEST = 0,
+  GVM_INVALID_GUESTVIEW_TYPE = 1,
 
   // Please add new elements here. The naming convention is abbreviated class
   // name (e.g. GuestViewManager becomes GVM) plus a unique description of
diff --git a/components/guest_view/browser/guest_view_manager.cc b/components/guest_view/browser/guest_view_manager.cc
index ec30cd29..12b34750 100644
--- a/components/guest_view/browser/guest_view_manager.cc
+++ b/components/guest_view/browser/guest_view_manager.cc
@@ -304,8 +304,11 @@
   if (guest_view_registry_.empty())
     RegisterGuestViewTypes();
   auto view_it = guest_view_registry_.find(view_type);
-  CHECK(view_it != guest_view_registry_.end())
-      << "Invalid GuestView created of type \"" << view_type << "\"";
+  if (view_it == guest_view_registry_.end()) {
+    bad_message::ReceivedBadMessage(embedder_process_id,
+                                    bad_message::GVM_INVALID_GUESTVIEW_TYPE);
+    return;
+  }
 
   // Register the cleanup callback for when this view is destroyed.
   RegisterViewDestructionCallback(embedder_process_id,
diff --git a/components/infobars/core/infobar_delegate.h b/components/infobars/core/infobar_delegate.h
index 1405106..513d447 100644
--- a/components/infobars/core/infobar_delegate.h
+++ b/components/infobars/core/infobar_delegate.h
@@ -240,7 +240,7 @@
  protected:
   InfoBarDelegate();
 
-  InfoBar* infobar() { return infobar_; }
+  InfoBar* infobar() const { return infobar_; }
 
  private:
   // The InfoBar associated with us.
diff --git a/components/ntp_snippets/BUILD.gn b/components/ntp_snippets/BUILD.gn
index 81a03549..84b1769 100644
--- a/components/ntp_snippets/BUILD.gn
+++ b/components/ntp_snippets/BUILD.gn
@@ -42,8 +42,13 @@
     "content_suggestions_provider.h",
     "content_suggestions_service.cc",
     "content_suggestions_service.h",
-    "contextual_suggestions_source.cc",
-    "contextual_suggestions_source.h",
+    "contextual/contextual_json_request.cc",
+    "contextual/contextual_json_request.h",
+    "contextual/contextual_suggestions_fetcher.h",
+    "contextual/contextual_suggestions_fetcher_impl.cc",
+    "contextual/contextual_suggestions_fetcher_impl.h",
+    "contextual/contextual_suggestions_source.cc",
+    "contextual/contextual_suggestions_source.h",
     "features.cc",
     "features.h",
     "ntp_snippets_constants.cc",
@@ -60,11 +65,6 @@
     "reading_list/reading_list_suggestions_provider.h",
     "remote/cached_image_fetcher.cc",
     "remote/cached_image_fetcher.h",
-    "remote/contextual_json_request.cc",
-    "remote/contextual_json_request.h",
-    "remote/contextual_suggestions_fetcher.h",
-    "remote/contextual_suggestions_fetcher_impl.cc",
-    "remote/contextual_suggestions_fetcher_impl.h",
     "remote/json_request.cc",
     "remote/json_request.h",
     "remote/json_to_categories.cc",
@@ -182,13 +182,13 @@
     "category_unittest.cc",
     "content_suggestions_metrics_unittest.cc",
     "content_suggestions_service_unittest.cc",
-    "contextual_suggestions_source_unittest.cc",
+    "contextual/contextual_json_request_unittest.cc",
+    "contextual/contextual_suggestions_fetcher_impl_unittest.cc",
+    "contextual/contextual_suggestions_source_unittest.cc",
     "offline_pages/recent_tab_suggestions_provider_unittest.cc",
     "physical_web_pages/physical_web_page_suggestions_provider_unittest.cc",
     "reading_list/reading_list_suggestions_provider_unittest.cc",
     "remote/cached_image_fetcher_unittest.cc",
-    "remote/contextual_json_request_unittest.cc",
-    "remote/contextual_suggestions_fetcher_impl_unittest.cc",
     "remote/json_request_unittest.cc",
     "remote/prefetched_pages_tracker_impl_unittest.cc",
     "remote/remote_suggestion_unittest.cc",
diff --git a/components/ntp_snippets/content_suggestions_service.h b/components/ntp_snippets/content_suggestions_service.h
index e1624e6f..aa9837d 100644
--- a/components/ntp_snippets/content_suggestions_service.h
+++ b/components/ntp_snippets/content_suggestions_service.h
@@ -26,7 +26,7 @@
 #include "components/ntp_snippets/category_rankers/category_ranker.h"
 #include "components/ntp_snippets/category_status.h"
 #include "components/ntp_snippets/content_suggestions_provider.h"
-#include "components/ntp_snippets/contextual_suggestions_source.h"
+#include "components/ntp_snippets/contextual/contextual_suggestions_source.h"
 #include "components/ntp_snippets/remote/remote_suggestions_scheduler.h"
 #include "components/ntp_snippets/user_classifier.h"
 #include "components/signin/core/browser/signin_manager.h"
diff --git a/components/ntp_snippets/remote/contextual_json_request.cc b/components/ntp_snippets/contextual/contextual_json_request.cc
similarity index 98%
rename from components/ntp_snippets/remote/contextual_json_request.cc
rename to components/ntp_snippets/contextual/contextual_json_request.cc
index 66e7754..2aba9e5f 100644
--- a/components/ntp_snippets/remote/contextual_json_request.cc
+++ b/components/ntp_snippets/contextual/contextual_json_request.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 "components/ntp_snippets/remote/contextual_json_request.h"
+#include "components/ntp_snippets/contextual/contextual_json_request.h"
 
 #include <algorithm>
 #include <utility>
diff --git a/components/ntp_snippets/remote/contextual_json_request.h b/components/ntp_snippets/contextual/contextual_json_request.h
similarity index 94%
rename from components/ntp_snippets/remote/contextual_json_request.h
rename to components/ntp_snippets/contextual/contextual_json_request.h
index cf379da..9898805 100644
--- a/components/ntp_snippets/remote/contextual_json_request.h
+++ b/components/ntp_snippets/contextual/contextual_json_request.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 COMPONENTS_NTP_SNIPPETS_REMOTE_CONTEXTUAL_JSON_REQUEST_H_
-#define COMPONENTS_NTP_SNIPPETS_REMOTE_CONTEXTUAL_JSON_REQUEST_H_
+#ifndef COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_JSON_REQUEST_H_
+#define COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_JSON_REQUEST_H_
 
 #include <memory>
 #include <string>
@@ -112,4 +112,4 @@
 
 }  // namespace ntp_snippets
 
-#endif  // COMPONENTS_NTP_SNIPPETS_REMOTE_CONTEXTUAL_JSON_REQUEST_H_
+#endif  // COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_JSON_REQUEST_H_
diff --git a/components/ntp_snippets/remote/contextual_json_request_unittest.cc b/components/ntp_snippets/contextual/contextual_json_request_unittest.cc
similarity index 97%
rename from components/ntp_snippets/remote/contextual_json_request_unittest.cc
rename to components/ntp_snippets/contextual/contextual_json_request_unittest.cc
index af37225a..d501dd1 100644
--- a/components/ntp_snippets/remote/contextual_json_request_unittest.cc
+++ b/components/ntp_snippets/contextual/contextual_json_request_unittest.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 "components/ntp_snippets/remote/contextual_json_request.h"
+#include "components/ntp_snippets/contextual/contextual_json_request.h"
 
 #include <utility>
 
diff --git a/components/ntp_snippets/remote/contextual_suggestions_fetcher.h b/components/ntp_snippets/contextual/contextual_suggestions_fetcher.h
similarity index 84%
rename from components/ntp_snippets/remote/contextual_suggestions_fetcher.h
rename to components/ntp_snippets/contextual/contextual_suggestions_fetcher.h
index 3a488dbd..fb5794f 100644
--- a/components/ntp_snippets/remote/contextual_suggestions_fetcher.h
+++ b/components/ntp_snippets/contextual/contextual_suggestions_fetcher.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 COMPONENTS_NTP_SNIPPETS_REMOTE_CONTEXTUAL_SUGGESTIONS_FETCHER_H_
-#define COMPONENTS_NTP_SNIPPETS_REMOTE_CONTEXTUAL_SUGGESTIONS_FETCHER_H_
+#ifndef COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_SUGGESTIONS_FETCHER_H_
+#define COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_SUGGESTIONS_FETCHER_H_
 
 #include <memory>
 #include <string>
@@ -41,4 +41,4 @@
 
 }  // namespace ntp_snippets
 
-#endif  // COMPONENTS_NTP_SNIPPETS_REMOTE_CONTEXTUAL_SUGGESTIONS_FETCHER_H_
+#endif  // COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_SUGGESTIONS_FETCHER_H_
diff --git a/components/ntp_snippets/remote/contextual_suggestions_fetcher_impl.cc b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.cc
similarity index 98%
rename from components/ntp_snippets/remote/contextual_suggestions_fetcher_impl.cc
rename to components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.cc
index 5a1977e..dcf9d84 100644
--- a/components/ntp_snippets/remote/contextual_suggestions_fetcher_impl.cc
+++ b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.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 "components/ntp_snippets/remote/contextual_suggestions_fetcher_impl.h"
+#include "components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h"
 
 #include "base/memory/ptr_util.h"
 #include "base/strings/stringprintf.h"
diff --git a/components/ntp_snippets/remote/contextual_suggestions_fetcher_impl.h b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h
similarity index 89%
rename from components/ntp_snippets/remote/contextual_suggestions_fetcher_impl.h
rename to components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h
index 84de3d3..d0c9f1d9 100644
--- a/components/ntp_snippets/remote/contextual_suggestions_fetcher_impl.h
+++ b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.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 COMPONENTS_NTP_SNIPPETS_REMOTE_CONTEXTUAL_SUGGESTIONS_FETCHER_IMPL_H_
-#define COMPONENTS_NTP_SNIPPETS_REMOTE_CONTEXTUAL_SUGGESTIONS_FETCHER_IMPL_H_
+#ifndef COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_SUGGESTIONS_FETCHER_IMPL_H_
+#define COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_SUGGESTIONS_FETCHER_IMPL_H_
 
 #include <memory>
 #include <queue>
@@ -15,8 +15,8 @@
 #include "base/time/clock.h"
 #include "components/ntp_snippets/category.h"
 #include "components/ntp_snippets/category_info.h"
-#include "components/ntp_snippets/remote/contextual_json_request.h"
-#include "components/ntp_snippets/remote/contextual_suggestions_fetcher.h"
+#include "components/ntp_snippets/contextual/contextual_json_request.h"
+#include "components/ntp_snippets/contextual/contextual_suggestions_fetcher.h"
 #include "components/ntp_snippets/remote/remote_suggestion.h"
 #include "components/ntp_snippets/status.h"
 #include "net/url_request/url_request_context_getter.h"
@@ -101,4 +101,4 @@
 
 }  // namespace ntp_snippets
 
-#endif  // COMPONENTS_NTP_SNIPPETS_REMOTE_CONTEXTUAL_SUGGESTIONS_FETCHER_IMPL_H_
+#endif  // COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_SUGGESTIONS_FETCHER_IMPL_H_
diff --git a/components/ntp_snippets/remote/contextual_suggestions_fetcher_impl_unittest.cc b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl_unittest.cc
similarity index 98%
rename from components/ntp_snippets/remote/contextual_suggestions_fetcher_impl_unittest.cc
rename to components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl_unittest.cc
index 37796ba4c..0fed25d 100644
--- a/components/ntp_snippets/remote/contextual_suggestions_fetcher_impl_unittest.cc
+++ b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl_unittest.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 "components/ntp_snippets/remote/contextual_suggestions_fetcher_impl.h"
+#include "components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h"
 
 #include <utility>
 #include <vector>
diff --git a/components/ntp_snippets/contextual_suggestions_source.cc b/components/ntp_snippets/contextual/contextual_suggestions_source.cc
similarity index 97%
rename from components/ntp_snippets/contextual_suggestions_source.cc
rename to components/ntp_snippets/contextual/contextual_suggestions_source.cc
index c59d3e0..58b30d5 100644
--- a/components/ntp_snippets/contextual_suggestions_source.cc
+++ b/components/ntp_snippets/contextual/contextual_suggestions_source.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 "components/ntp_snippets/contextual_suggestions_source.h"
+#include "components/ntp_snippets/contextual/contextual_suggestions_source.h"
 
 #include <iterator>
 #include <memory>
diff --git a/components/ntp_snippets/contextual_suggestions_source.h b/components/ntp_snippets/contextual/contextual_suggestions_source.h
similarity index 88%
rename from components/ntp_snippets/contextual_suggestions_source.h
rename to components/ntp_snippets/contextual/contextual_suggestions_source.h
index 3a99178..859ecf7 100644
--- a/components/ntp_snippets/contextual_suggestions_source.h
+++ b/components/ntp_snippets/contextual/contextual_suggestions_source.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 COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_SUGGESTIONS_SOURCE_H_
-#define COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_SUGGESTIONS_SOURCE_H_
+#ifndef COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_SUGGESTIONS_SOURCE_H_
+#define COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_SUGGESTIONS_SOURCE_H_
 
 #include <map>
 #include <memory>
@@ -14,7 +14,7 @@
 #include "base/optional.h"
 #include "components/image_fetcher/core/image_fetcher.h"
 #include "components/ntp_snippets/callbacks.h"
-#include "components/ntp_snippets/remote/contextual_suggestions_fetcher.h"
+#include "components/ntp_snippets/contextual/contextual_suggestions_fetcher.h"
 
 namespace ntp_snippets {
 
@@ -71,4 +71,4 @@
 
 }  // namespace ntp_snippets
 
-#endif  // COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_SUGGESTIONS_SOURCE_H_
+#endif  // COMPONENTS_NTP_SNIPPETS_CONTEXTUAL_CONTEXTUAL_SUGGESTIONS_SOURCE_H_
diff --git a/components/ntp_snippets/contextual_suggestions_source_unittest.cc b/components/ntp_snippets/contextual/contextual_suggestions_source_unittest.cc
similarity index 98%
rename from components/ntp_snippets/contextual_suggestions_source_unittest.cc
rename to components/ntp_snippets/contextual/contextual_suggestions_source_unittest.cc
index c713fe9..f6c5b869 100644
--- a/components/ntp_snippets/contextual_suggestions_source_unittest.cc
+++ b/components/ntp_snippets/contextual/contextual_suggestions_source_unittest.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 "components/ntp_snippets/contextual_suggestions_source.h"
+#include "components/ntp_snippets/contextual/contextual_suggestions_source.h"
 
 #include <memory>
 #include <utility>
@@ -17,8 +17,8 @@
 #include "components/image_fetcher/core/image_fetcher_impl.h"
 #include "components/ntp_snippets/category_info.h"
 #include "components/ntp_snippets/content_suggestion.h"
+#include "components/ntp_snippets/contextual/contextual_suggestions_fetcher.h"
 #include "components/ntp_snippets/remote/cached_image_fetcher.h"
-#include "components/ntp_snippets/remote/contextual_suggestions_fetcher.h"
 #include "components/ntp_snippets/remote/json_to_categories.h"
 #include "components/ntp_snippets/remote/remote_suggestion.h"
 #include "components/ntp_snippets/remote/remote_suggestion_builder.h"
diff --git a/components/omnibox/browser/history_url_provider_unittest.cc b/components/omnibox/browser/history_url_provider_unittest.cc
index bbc8e0c..5011aec 100644
--- a/components/omnibox/browser/history_url_provider_unittest.cc
+++ b/components/omnibox/browser/history_url_provider_unittest.cc
@@ -1178,9 +1178,7 @@
     }
     autocomplete_->scoring_params_ = test_cases[i].scoring_params;
 
-    // Test the experiment (scoring enabled). When scoring is disabled, it uses
-    // the default experimental scoring.
-    autocomplete_->scoring_params_.experimental_scoring_enabled = true;
+    // Test the experimental scoring params.
     ASSERT_NO_FATAL_FAILURE(RunTest(ASCIIToUTF16(test_cases[i].input),
                                     std::string(), false, output, max_matches));
     for (int j = 0; j < max_matches; ++j) {
diff --git a/components/omnibox/browser/omnibox_field_trial.cc b/components/omnibox/browser/omnibox_field_trial.cc
index 1413e0d..22e7b00 100644
--- a/components/omnibox/browser/omnibox_field_trial.cc
+++ b/components/omnibox/browser/omnibox_field_trial.cc
@@ -428,20 +428,11 @@
 
 void OmniboxFieldTrial::GetExperimentalHUPScoringParams(
     HUPScoringParams* scoring_params) {
-  scoring_params->experimental_scoring_enabled = false;
-
   VariationParams params;
   if (!variations::GetVariationParams(kBundledExperimentFieldTrialName,
                                       &params))
     return;
 
-  VariationParams::const_iterator it = params.find(kHUPNewScoringEnabledParam);
-  if (it != params.end()) {
-    int enabled = 0;
-    if (base::StringToInt(it->second, &enabled))
-      scoring_params->experimental_scoring_enabled = (enabled != 0);
-  }
-
   InitializeScoreBuckets(params, kHUPNewScoringTypedCountRelevanceCapParam,
       kHUPNewScoringTypedCountHalfLifeTimeParam,
       kHUPNewScoringTypedCountScoreBucketsParam,
@@ -757,8 +748,6 @@
 const char OmniboxFieldTrial::kPhysicalWebAfterTypingRule[] =
     "PhysicalWebAfterTyping";
 
-const char OmniboxFieldTrial::kHUPNewScoringEnabledParam[] =
-    "HUPExperimentalScoringEnabled";
 const char OmniboxFieldTrial::kHUPNewScoringTypedCountRelevanceCapParam[] =
     "TypedCountRelevanceCap";
 const char OmniboxFieldTrial::kHUPNewScoringTypedCountHalfLifeTimeParam[] =
diff --git a/components/omnibox/browser/omnibox_field_trial.h b/components/omnibox/browser/omnibox_field_trial.h
index 3dfa3734..bc94a4b 100644
--- a/components/omnibox/browser/omnibox_field_trial.h
+++ b/components/omnibox/browser/omnibox_field_trial.h
@@ -109,9 +109,7 @@
     bool use_decay_factor_;
   };
 
-  HUPScoringParams() : experimental_scoring_enabled(false) {}
-
-  bool experimental_scoring_enabled;
+  HUPScoringParams() {}
 
   ScoreBuckets typed_count_buckets;
 
@@ -262,8 +260,7 @@
   // bundled omnibox field trial.
 
   // Initializes the HUP |scoring_params| based on the active HUP scoring
-  // experiment.  If there is no such experiment, this function simply sets
-  // |scoring_params|->experimental_scoring_enabled to false.
+  // experiment.
   static void GetDefaultHUPScoringParams(HUPScoringParams* scoring_params);
   static void GetExperimentalHUPScoringParams(HUPScoringParams* scoring_params);
 
@@ -469,7 +466,6 @@
   static const char kPhysicalWebAfterTypingRule[];
 
   // Parameter names used by the HUP new scoring experiments.
-  static const char kHUPNewScoringEnabledParam[];
   static const char kHUPNewScoringTypedCountRelevanceCapParam[];
   static const char kHUPNewScoringTypedCountHalfLifeTimeParam[];
   static const char kHUPNewScoringTypedCountScoreBucketsParam[];
diff --git a/components/omnibox/browser/omnibox_field_trial_unittest.cc b/components/omnibox/browser/omnibox_field_trial_unittest.cc
index f4d9183..3890a55 100644
--- a/components/omnibox/browser/omnibox_field_trial_unittest.cc
+++ b/components/omnibox/browser/omnibox_field_trial_unittest.cc
@@ -396,7 +396,6 @@
 TEST_F(OmniboxFieldTrialTest, HUPNewScoringFieldTrial) {
   {
     std::map<std::string, std::string> params;
-    params[std::string(OmniboxFieldTrial::kHUPNewScoringEnabledParam)] = "1";
     params[std::string(
         OmniboxFieldTrial::kHUPNewScoringTypedCountRelevanceCapParam)] = "56";
     params[std::string(
@@ -419,7 +418,6 @@
 
   HUPScoringParams scoring_params;
   OmniboxFieldTrial::GetExperimentalHUPScoringParams(&scoring_params);
-  EXPECT_TRUE(scoring_params.experimental_scoring_enabled);
   EXPECT_EQ(56, scoring_params.typed_count_buckets.relevance_cap());
   EXPECT_EQ(77, scoring_params.typed_count_buckets.half_life_days());
   ASSERT_EQ(3u, scoring_params.typed_count_buckets.buckets().size());
@@ -441,7 +439,6 @@
 TEST_F(OmniboxFieldTrialTest, HUPNewScoringFieldTrialWithDecayFactor) {
   {
     std::map<std::string, std::string> params;
-    params[OmniboxFieldTrial::kHUPNewScoringEnabledParam] = "1";
     params[OmniboxFieldTrial::kHUPNewScoringTypedCountHalfLifeTimeParam] = "10";
     params[OmniboxFieldTrial::kHUPNewScoringTypedCountUseDecayFactorParam] =
         "1";
@@ -455,7 +452,6 @@
 
   HUPScoringParams scoring_params;
   OmniboxFieldTrial::GetExperimentalHUPScoringParams(&scoring_params);
-  EXPECT_TRUE(scoring_params.experimental_scoring_enabled);
   EXPECT_EQ(10, scoring_params.typed_count_buckets.half_life_days());
   ASSERT_EQ(3u, scoring_params.typed_count_buckets.buckets().size());
   ASSERT_TRUE(scoring_params.typed_count_buckets.use_decay_factor());
diff --git a/components/password_manager/core/browser/login_database_ios.cc b/components/password_manager/core/browser/login_database_ios.cc
index 0019abb..41bd8de 100644
--- a/components/password_manager/core/browser/login_database_ios.cc
+++ b/components/password_manager/core/browser/login_database_ios.cc
@@ -48,7 +48,7 @@
   // item as long as it uniquely identifies it. We are arbitrarily choosing the
   // |kSecAttrAccount| attribute for this purpose.
   CFDictionarySetValue(attributes, kSecAttrAccount, item_ref);
-  std::string plain_text_utf8 = UTF16ToUTF8(plain_text);
+  std::string plain_text_utf8 = base::UTF16ToUTF8(plain_text);
   ScopedCFTypeRef<CFDataRef> data(
       CFDataCreate(NULL, reinterpret_cast<const UInt8*>(plain_text_utf8.data()),
                    plain_text_utf8.size()));
diff --git a/components/password_manager/core/browser/login_database_ios_unittest.cc b/components/password_manager/core/browser/login_database_ios_unittest.cc
index 4ada9cf..761a0e6 100644
--- a/components/password_manager/core/browser/login_database_ios_unittest.cc
+++ b/components/password_manager/core/browser/login_database_ios_unittest.cc
@@ -17,6 +17,7 @@
 #include "testing/platform_test.h"
 
 using base::ScopedCFTypeRef;
+using base::UTF16ToUTF8;
 using autofill::PasswordForm;
 
 namespace password_manager {
diff --git a/components/payments/content/payment_request.cc b/components/payments/content/payment_request.cc
index 6359865..a55f986 100644
--- a/components/payments/content/payment_request.cc
+++ b/components/payments/content/payment_request.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/memory/ptr_util.h"
+#include "base/stl_util.h"
 #include "components/payments/content/can_make_payment_query_factory.h"
 #include "components/payments/content/origin_security_checker.h"
 #include "components/payments/content/payment_details_validation.h"
@@ -110,6 +111,30 @@
   state_ = base::MakeUnique<PaymentRequestState>(
       spec_.get(), this, delegate_->GetApplicationLocale(),
       delegate_->GetPersonalDataManager(), delegate_.get(), &journey_logger_);
+
+  journey_logger_.SetRequestedInformation(
+      spec_->request_shipping(), spec_->request_payer_email(),
+      spec_->request_payer_phone(), spec_->request_payer_name());
+
+  // Log metrics around which payment methods are requested by the merchant.
+  GURL google_pay_url(kGooglePayMethodName);
+  GURL android_pay_url(kAndroidPayMethodName);
+  // Looking for payment methods that are NOT google-related payment methods.
+  auto non_google_it =
+      std::find_if(spec_->url_payment_method_identifiers().begin(),
+                   spec_->url_payment_method_identifiers().end(),
+                   [google_pay_url, android_pay_url](const GURL& url) {
+                     return url != google_pay_url && url != android_pay_url;
+                   });
+  journey_logger_.SetRequestedPaymentMethodTypes(
+      /*requested_basic_card=*/!spec_->supported_card_networks().empty(),
+      /*requested_method_google=*/
+      base::ContainsValue(spec_->url_payment_method_identifiers(),
+                          google_pay_url) ||
+          base::ContainsValue(spec_->url_payment_method_identifiers(),
+                              android_pay_url),
+      /*requested_method_other=*/non_google_it !=
+          spec_->url_payment_method_identifiers().end());
 }
 
 void PaymentRequest::Show() {
@@ -124,7 +149,6 @@
     LOG(ERROR) << "A PaymentRequest UI is already showing";
     journey_logger_.SetNotShown(
         JourneyLogger::NOT_SHOWN_REASON_CONCURRENT_REQUESTS);
-    has_recorded_completion_ = true;
     client_->OnError(mojom::PaymentErrorReason::USER_CANCEL);
     OnConnectionTerminated();
     return;
@@ -133,7 +157,6 @@
   if (!state_->AreRequestedMethodsSupported()) {
     journey_logger_.SetNotShown(
         JourneyLogger::NOT_SHOWN_REASON_NO_SUPPORTED_PAYMENT_METHOD);
-    has_recorded_completion_ = true;
     client_->OnError(mojom::PaymentErrorReason::NOT_SUPPORTED);
     if (observer_for_testing_)
       observer_for_testing_->OnNotSupportedError();
@@ -142,9 +165,6 @@
   }
 
   journey_logger_.SetEventOccurred(JourneyLogger::EVENT_SHOWN);
-  journey_logger_.SetRequestedInformation(
-      spec_->request_shipping(), spec_->request_payer_email(),
-      spec_->request_payer_phone(), spec_->request_payer_name());
 
   delegate_->ShowDialog(this);
 }
diff --git a/components/payments/content/payment_request_spec.cc b/components/payments/content/payment_request_spec.cc
index c831329..e328318 100644
--- a/components/payments/content/payment_request_spec.cc
+++ b/components/payments/content/payment_request_spec.cc
@@ -129,6 +129,8 @@
 }  // namespace
 
 const char kBasicCardMethodName[] = "basic-card";
+const char kGooglePayMethodName[] = "https://google.com/pay";
+const char kAndroidPayMethodName[] = "https://android.com/pay";
 
 PaymentRequestSpec::PaymentRequestSpec(
     mojom::PaymentOptionsPtr options,
diff --git a/components/payments/content/payment_request_spec.h b/components/payments/content/payment_request_spec.h
index 4745acf..01a9e8cc 100644
--- a/components/payments/content/payment_request_spec.h
+++ b/components/payments/content/payment_request_spec.h
@@ -23,8 +23,11 @@
 
 class PaymentInstrument;
 
-// Identifier for the basic card payment method in the PaymentMethodData.
+// Identifier for the basic card payment method and google-related payment
+// methods in the PaymentMethodData.
 extern const char kBasicCardMethodName[];
+extern const char kGooglePayMethodName[];
+extern const char kAndroidPayMethodName[];
 
 // 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
diff --git a/components/payments/core/journey_logger.cc b/components/payments/core/journey_logger.cc
index 14c89929..1cf94f3 100644
--- a/components/payments/core/journey_logger.cc
+++ b/components/payments/core/journey_logger.cc
@@ -136,6 +136,20 @@
     SetEventOccurred(EVENT_REQUEST_PAYER_NAME);
 }
 
+void JourneyLogger::SetRequestedPaymentMethodTypes(
+    bool requested_basic_card,
+    bool requested_method_google,
+    bool requested_method_other) {
+  if (requested_basic_card)
+    SetEventOccurred(EVENT_REQUEST_METHOD_BASIC_CARD);
+
+  if (requested_method_google)
+    SetEventOccurred(EVENT_REQUEST_METHOD_GOOGLE);
+
+  if (requested_method_other)
+    SetEventOccurred(EVENT_REQUEST_METHOD_OTHER);
+}
+
 void JourneyLogger::SetCompleted() {
   RecordJourneyStatsHistograms(COMPLETION_STATUS_COMPLETED);
 }
diff --git a/components/payments/core/journey_logger.h b/components/payments/core/journey_logger.h
index 6b8104a..779b276c 100644
--- a/components/payments/core/journey_logger.h
+++ b/components/payments/core/journey_logger.h
@@ -69,23 +69,44 @@
   // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.payments
   // GENERATED_JAVA_CLASS_NAME_OVERRIDE: Event
   enum Event {
+    // Initiated means the PaymentRequest object was constructed.
     EVENT_INITIATED = 0,
+    // PaymentRequest was triggered via .show() and a native UI was shown.
     EVENT_SHOWN = 1 << 0,
     EVENT_PAY_CLICKED = 1 << 1,
     EVENT_RECEIVED_INSTRUMENT_DETAILS = 1 << 2,
+    // PaymentRequest was triggered via .show() and no UI was shown because we
+    // skipped directly to the payment app.
     EVENT_SKIPPED_SHOW = 1 << 3,
+    // .complete() was called by the merchant, completing the flow.
     EVENT_COMPLETED = 1 << 4,
+    // The user aborted the flow by either dismissing it explicitely, or
+    // navigating away (if possible).
     EVENT_USER_ABORTED = 1 << 5,
+    // Other reasons for aborting include the merchant calling .abort(), the
+    // merchant triggering a navigation, the tab closing, the browser closing,
+    // etc. See implementation for details.
     EVENT_OTHER_ABORTED = 1 << 6,
     EVENT_HAD_INITIAL_FORM_OF_PAYMENT = 1 << 7,
     EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS = 1 << 8,
+    // canMakePayment was called with a result of "true" or "false",
+    // respectively. An absence of both events means canMakePayment was not
+    // called, or the user was in incognito mode.
     EVENT_CAN_MAKE_PAYMENT_TRUE = 1 << 9,
     EVENT_CAN_MAKE_PAYMENT_FALSE = 1 << 10,
+    // Correspond to the merchant specifying requestShipping, requestPayerName,
+    // requestPayerEmail, requestPayerPhone.
     EVENT_REQUEST_SHIPPING = 1 << 11,
     EVENT_REQUEST_PAYER_NAME = 1 << 12,
     EVENT_REQUEST_PAYER_EMAIL = 1 << 13,
     EVENT_REQUEST_PAYER_PHONE = 1 << 14,
-    EVENT_ENUM_MAX = 32768,
+    // The merchant requested at least one basic-card method.
+    EVENT_REQUEST_METHOD_BASIC_CARD = 1 << 15,
+    // The merchant requested a Google payment method.
+    EVENT_REQUEST_METHOD_GOOGLE = 1 << 16,
+    // The merchant requested a non-Google, non-basic-card payment method.
+    EVENT_REQUEST_METHOD_OTHER = 1 << 17,
+    EVENT_ENUM_MAX = 262144,
   };
 
   // The reason why the Payment Request was aborted.
@@ -152,6 +173,14 @@
                                bool requested_phone,
                                bool requested_name);
 
+  // Records the requested payment method types. A value should be true if at
+  // least one payment method in the category (basic-card, google payment method
+  // or other url-based payment method, respectively) is requested.
+  // TODO(crbug.com/754811): Add support for non-basic-card, non-URL methods.
+  void SetRequestedPaymentMethodTypes(bool requested_basic_card,
+                                      bool requested_method_google,
+                                      bool requested_method_other);
+
   // Records that the Payment Request was completed successfully, and starts the
   // logging of all the journey metrics.
   void SetCompleted();
diff --git a/components/payments/core/journey_logger_unittest.cc b/components/payments/core/journey_logger_unittest.cc
index acb1e4ab..389a2bf7 100644
--- a/components/payments/core/journey_logger_unittest.cc
+++ b/components/payments/core/journey_logger_unittest.cc
@@ -338,6 +338,9 @@
   logger.SetRequestedInformation(
       /*requested_shipping=*/false, /*requested_email=*/false,
       /*requested_phone=*/false, /*requested_name=*/false);
+  logger.SetRequestedPaymentMethodTypes(
+      /*requested_basic_card=*/true, /*requested_method_google=*/true,
+      /*requested_method_other=*/false);
 
   // Simulate that the user had suggestions for all the requested sections.
   logger.SetNumberOfSuggestionsShown(JourneyLogger::SECTION_PAYMENT_METHOD, 1,
@@ -364,6 +367,9 @@
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 // Tests that the completion status metrics based on whether the user had
@@ -378,6 +384,9 @@
   logger.SetRequestedInformation(
       /*requested_shipping=*/false, /*requested_email=*/false,
       /*requested_phone=*/false, /*requested_name=*/false);
+  logger.SetRequestedPaymentMethodTypes(
+      /*requested_basic_card=*/true, /*requested_method_google=*/true,
+      /*requested_method_other=*/false);
 
   // Simulate that the user had suggestions for all the requested sections.
   logger.SetNumberOfSuggestionsShown(JourneyLogger::SECTION_PAYMENT_METHOD, 1,
@@ -404,6 +413,9 @@
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 // Tests that the completion status metrics based on whether the user had
@@ -418,6 +430,9 @@
   logger.SetRequestedInformation(
       /*requested_shipping=*/false, /*requested_email=*/false,
       /*requested_phone=*/false, /*requested_name=*/false);
+  logger.SetRequestedPaymentMethodTypes(
+      /*requested_basic_card=*/true, /*requested_method_google=*/true,
+      /*requested_method_other=*/false);
 
   // Simulate that the user had suggestions for all the requested sections.
   logger.SetNumberOfSuggestionsShown(JourneyLogger::SECTION_PAYMENT_METHOD, 1,
@@ -444,6 +459,9 @@
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 // Tests that the completion status metrics based on whether the user had
@@ -459,6 +477,9 @@
   logger.SetRequestedInformation(
       /*requested_shipping=*/false, /*requested_email=*/false,
       /*requested_phone=*/false, /*requested_name=*/false);
+  logger.SetRequestedPaymentMethodTypes(
+      /*requested_basic_card=*/true, /*requested_method_google=*/true,
+      /*requested_method_other=*/false);
 
   // Simulate that the user had suggestions for all the requested sections.
   logger.SetNumberOfSuggestionsShown(JourneyLogger::SECTION_PAYMENT_METHOD, 1,
@@ -485,6 +506,9 @@
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 // Tests that the completion status metrics based on whether the user had
@@ -499,6 +523,9 @@
   logger.SetRequestedInformation(
       /*requested_shipping=*/false, /*requested_email=*/false,
       /*requested_phone=*/false, /*requested_name=*/false);
+  logger.SetRequestedPaymentMethodTypes(
+      /*requested_basic_card=*/true, /*requested_method_google=*/true,
+      /*requested_method_other=*/false);
 
   // Simulate that the user had suggestions for none of the requested sections.
   logger.SetNumberOfSuggestionsShown(JourneyLogger::SECTION_PAYMENT_METHOD, 0,
@@ -525,6 +552,9 @@
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 // Tests that the completion status metrics based on whether the user had
@@ -539,6 +569,9 @@
   logger.SetRequestedInformation(
       /*requested_shipping=*/false, /*requested_email=*/false,
       /*requested_phone=*/false, /*requested_name=*/false);
+  logger.SetRequestedPaymentMethodTypes(
+      /*requested_basic_card=*/true, /*requested_method_google=*/true,
+      /*requested_method_other=*/false);
 
   // Simulate that the user had suggestions for none of the requested sections.
   logger.SetNumberOfSuggestionsShown(JourneyLogger::SECTION_PAYMENT_METHOD, 0,
@@ -565,6 +598,9 @@
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 // Tests that the completion status metrics based on whether the user had
@@ -579,6 +615,9 @@
   logger.SetRequestedInformation(
       /*requested_shipping=*/false, /*requested_email=*/false,
       /*requested_phone=*/false, /*requested_name=*/false);
+  logger.SetRequestedPaymentMethodTypes(
+      /*requested_basic_card=*/true, /*requested_method_google=*/true,
+      /*requested_method_other=*/false);
 
   // Simulate that the user had suggestions for none of the requested sections.
   logger.SetNumberOfSuggestionsShown(JourneyLogger::SECTION_PAYMENT_METHOD, 0,
@@ -605,6 +644,9 @@
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 // Tests that the completion status metrics based on whether the user had
@@ -620,6 +662,9 @@
   logger.SetRequestedInformation(
       /*requested_shipping=*/false, /*requested_email=*/false,
       /*requested_phone=*/false, /*requested_name=*/false);
+  logger.SetRequestedPaymentMethodTypes(
+      /*requested_basic_card=*/true, /*requested_method_google=*/true,
+      /*requested_method_other=*/false);
 
   // Simulate that the user had suggestions for none of the requested sections.
   logger.SetNumberOfSuggestionsShown(JourneyLogger::SECTION_PAYMENT_METHOD, 0,
@@ -646,6 +691,9 @@
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 // Tests that the completion status metrics based on whether the user had
@@ -661,6 +709,9 @@
   logger.SetRequestedInformation(
       /*requested_shipping=*/false, /*requested_email=*/false,
       /*requested_phone=*/false, /*requested_name=*/false);
+  logger.SetRequestedPaymentMethodTypes(
+      /*requested_basic_card=*/true, /*requested_method_google=*/true,
+      /*requested_method_other=*/false);
 
   // Simulate that the user had incomplete suggestions for the requested
   // sections.
@@ -688,6 +739,9 @@
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 // Tests that the completion status metrics based on whether the user had
@@ -703,6 +757,9 @@
   logger.SetRequestedInformation(
       /*requested_shipping=*/true, /*requested_email=*/false,
       /*requested_phone=*/false, /*requested_name=*/false);
+  logger.SetRequestedPaymentMethodTypes(
+      /*requested_basic_card=*/true, /*requested_method_google=*/true,
+      /*requested_method_other=*/false);
 
   // Simulate that the user had incomplete suggestions for one of the requested
   // sections.
@@ -732,6 +789,9 @@
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 // Tests that the completion status metrics based on whether the user had
@@ -747,6 +807,9 @@
   logger.SetRequestedInformation(
       /*requested_shipping=*/true, /*requested_email=*/false,
       /*requested_phone=*/false, /*requested_name=*/false);
+  logger.SetRequestedPaymentMethodTypes(
+      /*requested_basic_card=*/true, /*requested_method_google=*/true,
+      /*requested_method_other=*/false);
 
   // Simulate that the user had incomplete suggestions for one of the requested
   // sections.
@@ -776,6 +839,9 @@
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 // Tests that the metrics are logged correctly for two simultaneous Payment
@@ -792,10 +858,16 @@
   logger1.SetRequestedInformation(
       /*requested_shipping=*/true, /*requested_email=*/true,
       /*requested_phone=*/false, /*requested_name=*/false);
+  logger1.SetRequestedPaymentMethodTypes(
+      /*requested_basic_card=*/true, /*requested_method_google=*/true,
+      /*requested_method_other=*/true);
   logger2.SetEventOccurred(JourneyLogger::EVENT_SHOWN);
   logger2.SetRequestedInformation(
       /*requested_shipping=*/true, /*requested_email=*/false,
       /*requested_phone=*/false, /*requested_name=*/false);
+  logger2.SetRequestedPaymentMethodTypes(
+      /*requested_basic_card=*/false, /*requested_method_google=*/false,
+      /*requested_method_other=*/true);
 
   logger1.SetCanMakePaymentValue(true);
 
@@ -827,6 +899,9 @@
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE);
   EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
   // logger1
   EXPECT_TRUE(buckets[1].min & JourneyLogger::EVENT_SHOWN);
   EXPECT_FALSE(buckets[1].min &
@@ -842,6 +917,9 @@
   EXPECT_TRUE(buckets[1].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL);
   EXPECT_TRUE(buckets[1].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE);
   EXPECT_FALSE(buckets[1].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE);
+  EXPECT_TRUE(buckets[1].min & JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD);
+  EXPECT_TRUE(buckets[1].min & JourneyLogger::EVENT_REQUEST_METHOD_GOOGLE);
+  EXPECT_TRUE(buckets[1].min & JourneyLogger::EVENT_REQUEST_METHOD_OTHER);
 }
 
 // Tests that the Payment Request UKMs are logged correctly when the user aborts
@@ -857,6 +935,9 @@
   logger.SetRequestedInformation(
       /*requested_shipping=*/true, /*requested_email=*/true,
       /*requested_phone=*/false, /*requested_name=*/false);
+  logger.SetRequestedPaymentMethodTypes(
+      /*requested_basic_card=*/true, /*requested_method_google=*/false,
+      /*requested_method_other=*/false);
 
   // Simulate that the user aborts after being shown the Payment Request and
   // clicking pay.
@@ -886,7 +967,8 @@
   ASSERT_NE(nullptr, step_metric);
   EXPECT_EQ(JourneyLogger::EVENT_SHOWN | JourneyLogger::EVENT_PAY_CLICKED |
                 JourneyLogger::EVENT_REQUEST_SHIPPING |
-                JourneyLogger::EVENT_REQUEST_PAYER_EMAIL,
+                JourneyLogger::EVENT_REQUEST_PAYER_EMAIL |
+                JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD,
             step_metric->value);
 }
 
@@ -903,6 +985,9 @@
   logger.SetRequestedInformation(
       /*requested_shipping=*/true, /*requested_email=*/true,
       /*requested_phone=*/false, /*requested_name=*/false);
+  logger.SetRequestedPaymentMethodTypes(
+      /*requested_basic_card=*/true, /*requested_method_google=*/false,
+      /*requested_method_other=*/false);
 
   // Simulate that the user aborts after being shown the Payment Request.
   logger.SetEventOccurred(JourneyLogger::EVENT_SHOWN);
@@ -928,7 +1013,8 @@
       ukm::TestUkmRecorder::FindMetric(entry, internal::kUKMEventsMetricName);
   ASSERT_NE(nullptr, step_metric);
   EXPECT_EQ(JourneyLogger::EVENT_SHOWN | JourneyLogger::EVENT_REQUEST_SHIPPING |
-                JourneyLogger::EVENT_REQUEST_PAYER_EMAIL,
+                JourneyLogger::EVENT_REQUEST_PAYER_EMAIL |
+                JourneyLogger::EVENT_REQUEST_METHOD_BASIC_CARD,
             step_metric->value);
 }
 
diff --git a/components/safe_browsing/BUILD.gn b/components/safe_browsing/BUILD.gn
index f09e7c6..41b9f45 100644
--- a/components/safe_browsing/BUILD.gn
+++ b/components/safe_browsing/BUILD.gn
@@ -6,7 +6,13 @@
 
 proto_library("csd_proto") {
   sources = [
-    "csd.proto",
+    "proto/csd.proto",
+  ]
+}
+
+proto_library("webui_proto") {
+  sources = [
+    "proto/webui.proto",
   ]
 }
 
diff --git a/components/safe_browsing/browser/DEPS b/components/safe_browsing/browser/DEPS
index d98a2a4d..b219d834 100644
--- a/components/safe_browsing/browser/DEPS
+++ b/components/safe_browsing/browser/DEPS
@@ -1,6 +1,6 @@
 include_rules = [
   "+components/history/core/browser",
-  "+components/safe_browsing/csd.pb.h",
+  "+components/safe_browsing/proto/csd.pb.h",
   "+content/public/browser",
   "+ipc/ipc_message.h",
   "+net/cookies",
diff --git a/components/safe_browsing/browser/threat_details.h b/components/safe_browsing/browser/threat_details.h
index 9e6918a..849105c0 100644
--- a/components/safe_browsing/browser/threat_details.h
+++ b/components/safe_browsing/browser/threat_details.h
@@ -21,7 +21,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "components/safe_browsing/common/safebrowsing_types.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/security_interstitials/content/unsafe_resource.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/web_contents_observer.h"
diff --git a/components/safe_browsing/password_protection/password_protection_service.h b/components/safe_browsing/password_protection/password_protection_service.h
index 802fbff5..f6ef8d41 100644
--- a/components/safe_browsing/password_protection/password_protection_service.h
+++ b/components/safe_browsing/password_protection/password_protection_service.h
@@ -18,7 +18,7 @@
 #include "base/task/cancelable_task_tracker.h"
 #include "base/values.h"
 #include "components/history/core/browser/history_service_observer.h"
-#include "components/safe_browsing/csd.pb.h"
+#include "components/safe_browsing/proto/csd.pb.h"
 #include "components/safe_browsing_db/v4_protocol_manager_util.h"
 #include "net/url_request/url_request_context_getter.h"
 #include "third_party/protobuf/src/google/protobuf/repeated_field.h"
diff --git a/components/safe_browsing/csd.proto b/components/safe_browsing/proto/csd.proto
similarity index 100%
rename from components/safe_browsing/csd.proto
rename to components/safe_browsing/proto/csd.proto
diff --git a/components/safe_browsing/web_ui/webui.proto b/components/safe_browsing/proto/webui.proto
similarity index 100%
rename from components/safe_browsing/web_ui/webui.proto
rename to components/safe_browsing/proto/webui.proto
diff --git a/components/safe_browsing/web_ui/BUILD.gn b/components/safe_browsing/web_ui/BUILD.gn
index 707f14b6..7bd2a139 100644
--- a/components/safe_browsing/web_ui/BUILD.gn
+++ b/components/safe_browsing/web_ui/BUILD.gn
@@ -12,11 +12,11 @@
 
   deps = [
     ":constants",
-    ":webui_proto",
     "//base",
     "//components/resources:components_resources_grit",
     "//components/resources:components_scaled_resources_grit",
     "//components/safe_browsing:features",
+    "//components/safe_browsing:webui_proto",
     "//components/safe_browsing/common:safe_browsing_prefs",
     "//components/safe_browsing_db:v4_local_database_manager",
     "//components/strings:components_strings_grit",
@@ -33,9 +33,3 @@
     "constants.h",
   ]
 }
-
-proto_library("webui_proto") {
-  sources = [
-    "webui.proto",
-  ]
-}
diff --git a/components/safe_browsing/web_ui/safe_browsing_ui.h b/components/safe_browsing/web_ui/safe_browsing_ui.h
index 89abc3a..54fef1e 100644
--- a/components/safe_browsing/web_ui/safe_browsing_ui.h
+++ b/components/safe_browsing/web_ui/safe_browsing_ui.h
@@ -6,7 +6,7 @@
 #define COMPONENTS_SAFE_BROWSING_WEBUI_SAFE_BROWSING_UI_H_
 
 #include "base/macros.h"
-#include "components/safe_browsing/web_ui/webui.pb.h"
+#include "components/safe_browsing/proto/webui.pb.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui_controller.h"
 #include "content/public/browser/web_ui_data_source.h"
diff --git a/components/safe_browsing_db/BUILD.gn b/components/safe_browsing_db/BUILD.gn
index bedfc8e..f4ac984 100644
--- a/components/safe_browsing_db/BUILD.gn
+++ b/components/safe_browsing_db/BUILD.gn
@@ -204,7 +204,7 @@
     ":v4_protocol_manager_util",
     ":v4_store",
     "//base",
-    "//components/safe_browsing/web_ui:webui_proto",
+    "//components/safe_browsing:webui_proto",
     "//content/public/browser",
   ]
 }
@@ -233,7 +233,7 @@
     ":v4_protocol_manager_util",
     "//base",
     "//components/data_use_measurement/core",
-    "//components/safe_browsing/web_ui:webui_proto",
+    "//components/safe_browsing:webui_proto",
     "//content/public/browser",
     "//net",
     "//url",
@@ -255,7 +255,7 @@
     ":v4_protocol_manager_util",
     ":v4_update_protocol_manager",
     "//base",
-    "//components/safe_browsing/web_ui:webui_proto",
+    "//components/safe_browsing:webui_proto",
     "//content/public/browser",
     "//net",
     "//url",
@@ -310,7 +310,7 @@
     ":v4_protocol_manager_util",
     ":v4_rice",
     "//base",
-    "//components/safe_browsing/web_ui:webui_proto",
+    "//components/safe_browsing:webui_proto",
     "//crypto",
   ]
 }
@@ -338,8 +338,8 @@
     ":v4_protocol_manager_util",
     "//base",
     "//components/data_use_measurement/core",
+    "//components/safe_browsing:webui_proto",
     "//components/safe_browsing/common:safe_browsing_prefs",
-    "//components/safe_browsing/web_ui:webui_proto",
     "//net",
     "//url",
   ]
diff --git a/components/safe_browsing_db/DEPS b/components/safe_browsing_db/DEPS
index 1c63417..c5e7e01 100644
--- a/components/safe_browsing_db/DEPS
+++ b/components/safe_browsing_db/DEPS
@@ -2,7 +2,7 @@
   "+components/data_use_measurement/core",
   "+components/safe_browsing/common/safe_browsing_prefs.h",
   "+components/safe_browsing/features.h",
-  "+components/safe_browsing/web_ui/webui.pb.h",
+  "+components/safe_browsing/proto/webui.pb.h",
   "+components/variations",
   "+components/version_info",
   "+content/public/browser",
diff --git a/components/safe_browsing_db/v4_database.cc b/components/safe_browsing_db/v4_database.cc
index 9e8a74f0..f380624 100644
--- a/components/safe_browsing_db/v4_database.cc
+++ b/components/safe_browsing_db/v4_database.cc
@@ -11,7 +11,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "components/safe_browsing/web_ui/webui.pb.h"
+#include "components/safe_browsing/proto/webui.pb.h"
 #include "components/safe_browsing_db/v4_database.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/components/safe_browsing_db/v4_database.h b/components/safe_browsing_db/v4_database.h
index 576e894..aea51b0 100644
--- a/components/safe_browsing_db/v4_database.h
+++ b/components/safe_browsing_db/v4_database.h
@@ -16,7 +16,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
-#include "components/safe_browsing/web_ui/webui.pb.h"
+#include "components/safe_browsing/proto/webui.pb.h"
 #include "components/safe_browsing_db/v4_protocol_manager_util.h"
 #include "components/safe_browsing_db/v4_store.h"
 
diff --git a/components/safe_browsing_db/v4_get_hash_protocol_manager.h b/components/safe_browsing_db/v4_get_hash_protocol_manager.h
index 6ae5c302..22510c9c 100644
--- a/components/safe_browsing_db/v4_get_hash_protocol_manager.h
+++ b/components/safe_browsing_db/v4_get_hash_protocol_manager.h
@@ -24,7 +24,7 @@
 #include "base/time/default_clock.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
-#include "components/safe_browsing/web_ui/webui.pb.h"
+#include "components/safe_browsing/proto/webui.pb.h"
 #include "components/safe_browsing_db/safebrowsing.pb.h"
 #include "components/safe_browsing_db/util.h"
 #include "components/safe_browsing_db/v4_protocol_manager_util.h"
diff --git a/components/safe_browsing_db/v4_local_database_manager.h b/components/safe_browsing_db/v4_local_database_manager.h
index 29d7544..c2cd94f4 100644
--- a/components/safe_browsing_db/v4_local_database_manager.h
+++ b/components/safe_browsing_db/v4_local_database_manager.h
@@ -12,7 +12,7 @@
 #include <unordered_set>
 
 #include "base/memory/weak_ptr.h"
-#include "components/safe_browsing/web_ui/webui.pb.h"
+#include "components/safe_browsing/proto/webui.pb.h"
 #include "components/safe_browsing_db/database_manager.h"
 #include "components/safe_browsing_db/hit_report.h"
 #include "components/safe_browsing_db/v4_database.h"
diff --git a/components/safe_browsing_db/v4_store.cc b/components/safe_browsing_db/v4_store.cc
index e7bce82..2d51d61c 100644
--- a/components/safe_browsing_db/v4_store.cc
+++ b/components/safe_browsing_db/v4_store.cc
@@ -12,7 +12,7 @@
 #include "base/metrics/sparse_histogram.h"
 #include "base/stl_util.h"
 #include "base/strings/stringprintf.h"
-#include "components/safe_browsing/web_ui/webui.pb.h"
+#include "components/safe_browsing/proto/webui.pb.h"
 #include "components/safe_browsing_db/v4_rice.h"
 #include "components/safe_browsing_db/v4_store.pb.h"
 #include "crypto/secure_hash.h"
diff --git a/components/safe_browsing_db/v4_store.h b/components/safe_browsing_db/v4_store.h
index 3ebd47a..392d841c 100644
--- a/components/safe_browsing_db/v4_store.h
+++ b/components/safe_browsing_db/v4_store.h
@@ -13,7 +13,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
-#include "components/safe_browsing/web_ui/webui.pb.h"
+#include "components/safe_browsing/proto/webui.pb.h"
 #include "components/safe_browsing_db/v4_protocol_manager_util.h"
 
 namespace safe_browsing {
diff --git a/components/safe_browsing_db/v4_update_protocol_manager.h b/components/safe_browsing_db/v4_update_protocol_manager.h
index db01b070..73f076f6 100644
--- a/components/safe_browsing_db/v4_update_protocol_manager.h
+++ b/components/safe_browsing_db/v4_update_protocol_manager.h
@@ -22,7 +22,7 @@
 #include "base/time/time.h"
 #include "base/timer/timer.h"
 #include "components/safe_browsing/common/safe_browsing_prefs.h"
-#include "components/safe_browsing/web_ui/webui.pb.h"
+#include "components/safe_browsing/proto/webui.pb.h"
 #include "components/safe_browsing_db/safebrowsing.pb.h"
 #include "components/safe_browsing_db/util.h"
 #include "components/safe_browsing_db/v4_protocol_manager_util.h"
diff --git a/components/security_state/content/content_utils.cc b/components/security_state/content/content_utils.cc
index 37dee4f..c532fc1 100644
--- a/components/security_state/content/content_utils.cc
+++ b/components/security_state/content/content_utils.cc
@@ -99,7 +99,7 @@
         content::SecurityStyleExplanation(
             l10n_util::GetStringUTF8(IDS_SHA1),
             l10n_util::GetStringUTF8(IDS_SHA1_DESCRIPTION),
-            !!security_info.certificate,
+            security_info.certificate,
             blink::WebMixedContentContextType::kNotMixedContent));
   }
 
@@ -108,7 +108,7 @@
         content::SecurityStyleExplanation(
             l10n_util::GetStringUTF8(IDS_SUBJECT_ALT_NAME_MISSING),
             l10n_util::GetStringUTF8(IDS_SUBJECT_ALT_NAME_MISSING_DESCRIPTION),
-            !!security_info.certificate,
+            security_info.certificate,
             blink::WebMixedContentContextType::kNotMixedContent));
   }
 
@@ -124,7 +124,7 @@
         l10n_util::GetStringUTF8(IDS_CERTIFICATE_CHAIN_ERROR),
         l10n_util::GetStringFUTF8(
             IDS_CERTIFICATE_CHAIN_ERROR_DESCRIPTION_FORMAT, error_string),
-        !!security_info.certificate,
+        security_info.certificate,
         blink::WebMixedContentContextType::kNotMixedContent);
 
     if (is_cert_status_minor_error) {
@@ -155,7 +155,7 @@
               l10n_util::GetStringUTF8(IDS_VALID_SERVER_CERTIFICATE),
               l10n_util::GetStringFUTF8(
                   IDS_VALID_SERVER_CERTIFICATE_DESCRIPTION, issuer_name),
-              !!security_info.certificate,
+              security_info.certificate,
               blink::WebMixedContentContextType::kNotMixedContent));
     }
   }
@@ -275,7 +275,7 @@
         content::SecurityStyleExplanation(
             l10n_util::GetStringUTF8(IDS_MIXED_ACTIVE_CONTENT_SUMMARY),
             l10n_util::GetStringUTF8(IDS_MIXED_ACTIVE_CONTENT_DESCRIPTION),
-            false, blink::WebMixedContentContextType::kBlockable));
+            nullptr, blink::WebMixedContentContextType::kBlockable));
   }
 
   security_style_explanations->displayed_mixed_content =
@@ -289,7 +289,7 @@
         content::SecurityStyleExplanation(
             l10n_util::GetStringUTF8(IDS_MIXED_PASSIVE_CONTENT_SUMMARY),
             l10n_util::GetStringUTF8(IDS_MIXED_PASSIVE_CONTENT_DESCRIPTION),
-            false, blink::WebMixedContentContextType::kOptionallyBlockable));
+            nullptr, blink::WebMixedContentContextType::kOptionallyBlockable));
   }
 
   security_style_explanations->contained_mixed_form =
diff --git a/components/security_state/content/content_utils_unittest.cc b/components/security_state/content/content_utils_unittest.cc
index e2615b32..d4e30e83 100644
--- a/components/security_state/content/content_utils_unittest.cc
+++ b/components/security_state/content/content_utils_unittest.cc
@@ -580,7 +580,7 @@
 TEST(SecurityStateContentUtilsTest, DefaultSecurityStyleExplanation) {
   content::SecurityStyleExplanation explanation("summary", "description");
 
-  EXPECT_EQ(false, explanation.has_certificate);
+  EXPECT_EQ(false, !!explanation.certificate);
   EXPECT_EQ(blink::WebMixedContentContextType::kNotMixedContent,
             explanation.mixed_content_type);
 }
diff --git a/components/security_state/core/security_state.h b/components/security_state/core/security_state.h
index 2a77332..9f4e4fb 100644
--- a/components/security_state/core/security_state.h
+++ b/components/security_state/core/security_state.h
@@ -32,8 +32,8 @@
 
 // Describes the overall security state of the page.
 //
-// If you reorder, add, or delete values from this enum, you must also
-// update the UI icons in ToolbarModelImpl::GetIconForSecurityLevel.
+// If you change this enum, you may need to update the UI icons in
+// ToolbarModelImpl::GetVectorIcon and GetIconForSecurityState.
 //
 // A Java counterpart will be generated for this enum.
 // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.security_state
@@ -56,7 +56,7 @@
   // HTTPS (non-EV) with valid cert.
   SECURE,
 
-  // HTTPS, but with an outdated protocol version.
+  // Obsolete, do not use. TODO(lgarron): Remove via https://crbug.com/645698.
   SECURITY_WARNING,
 
   // HTTPS, but the certificate verification chain is anchored on a
diff --git a/components/viz/client/client_shared_bitmap_manager.cc b/components/viz/client/client_shared_bitmap_manager.cc
index 8c1d51a..63b30e7 100644
--- a/components/viz/client/client_shared_bitmap_manager.cc
+++ b/components/viz/client/client_shared_bitmap_manager.cc
@@ -24,7 +24,7 @@
 class ClientSharedBitmap : public SharedBitmap {
  public:
   ClientSharedBitmap(
-      scoped_refptr<cc::mojom::ThreadSafeSharedBitmapAllocationNotifierPtr>
+      scoped_refptr<mojom::ThreadSafeSharedBitmapAllocationNotifierPtr>
           shared_bitmap_allocation_notifier,
       base::SharedMemory* shared_memory,
       const SharedBitmapId& id,
@@ -36,7 +36,7 @@
             std::move(shared_bitmap_allocation_notifier)) {}
 
   ClientSharedBitmap(
-      scoped_refptr<cc::mojom::ThreadSafeSharedBitmapAllocationNotifierPtr>
+      scoped_refptr<mojom::ThreadSafeSharedBitmapAllocationNotifierPtr>
           shared_bitmap_allocation_notifier,
       std::unique_ptr<base::SharedMemory> shared_memory_holder,
       const SharedBitmapId& id,
@@ -60,7 +60,7 @@
   }
 
  private:
-  scoped_refptr<cc::mojom::ThreadSafeSharedBitmapAllocationNotifierPtr>
+  scoped_refptr<mojom::ThreadSafeSharedBitmapAllocationNotifierPtr>
       shared_bitmap_allocation_notifier_;
   std::unique_ptr<base::SharedMemory> shared_memory_holder_;
 };
@@ -112,7 +112,7 @@
 }  // namespace
 
 ClientSharedBitmapManager::ClientSharedBitmapManager(
-    scoped_refptr<cc::mojom::ThreadSafeSharedBitmapAllocationNotifierPtr>
+    scoped_refptr<mojom::ThreadSafeSharedBitmapAllocationNotifierPtr>
         shared_bitmap_allocation_notifier)
     : shared_bitmap_allocation_notifier_(
           std::move(shared_bitmap_allocation_notifier)) {}
diff --git a/components/viz/client/client_shared_bitmap_manager.h b/components/viz/client/client_shared_bitmap_manager.h
index 8bb479c..553bb57 100644
--- a/components/viz/client/client_shared_bitmap_manager.h
+++ b/components/viz/client/client_shared_bitmap_manager.h
@@ -13,9 +13,9 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/shared_memory.h"
 #include "base/synchronization/lock.h"
-#include "cc/ipc/shared_bitmap_allocation_notifier.mojom.h"
 #include "components/viz/common/resources/shared_bitmap_manager.h"
 #include "mojo/public/cpp/bindings/thread_safe_interface_ptr.h"
+#include "services/viz/public/interfaces/compositing/shared_bitmap_allocation_notifier.mojom.h"
 
 namespace viz {
 
@@ -25,7 +25,7 @@
 class ClientSharedBitmapManager : public SharedBitmapManager {
  public:
   explicit ClientSharedBitmapManager(
-      scoped_refptr<cc::mojom::ThreadSafeSharedBitmapAllocationNotifierPtr>
+      scoped_refptr<mojom::ThreadSafeSharedBitmapAllocationNotifierPtr>
           shared_bitmap_allocation_notifier);
   ~ClientSharedBitmapManager() override;
 
@@ -43,7 +43,7 @@
   uint32_t NotifyAllocatedSharedBitmap(base::SharedMemory* memory,
                                        const SharedBitmapId& id);
 
-  scoped_refptr<cc::mojom::ThreadSafeSharedBitmapAllocationNotifierPtr>
+  scoped_refptr<mojom::ThreadSafeSharedBitmapAllocationNotifierPtr>
       shared_bitmap_allocation_notifier_;
 
   base::Lock lock_;
diff --git a/components/viz/host/BUILD.gn b/components/viz/host/BUILD.gn
index 092768f..be3dc76 100644
--- a/components/viz/host/BUILD.gn
+++ b/components/viz/host/BUILD.gn
@@ -8,6 +8,8 @@
   defines = [ "VIZ_HOST_IMPLEMENTATION" ]
 
   sources = [
+    "hit_test/hit_test_query.cc",
+    "hit_test/hit_test_query.h",
     "host_frame_sink_client.h",
     "host_frame_sink_manager.cc",
     "host_frame_sink_manager.h",
@@ -21,6 +23,7 @@
   deps = [
     "//base",
     "//cc/ipc:interfaces",
+    "//components/viz/common",
     "//gpu/ipc/client",
     "//gpu/ipc/common",
     "//services/ui/gpu/interfaces",
@@ -36,6 +39,8 @@
     "//gpu/command_buffer/client",
     "//gpu/ipc/host",
     "//services/viz/compositing/privileged/interfaces",
+    "//services/viz/public/interfaces/hit_test",
+    "//ui/gfx/geometry",
   ]
 }
 
@@ -43,6 +48,7 @@
   testonly = true
 
   sources = [
+    "hit_test/hit_test_query_unittest.cc",
     "host_frame_sink_manager_unittests.cc",
     "server_gpu_memory_buffer_manager_unittest.cc",
   ]
@@ -52,7 +58,6 @@
     "//base",
     "//base/test:test_support",
     "//cc/ipc:interfaces",
-    "//components/viz/host/hit_test:unit_tests",
     "//gpu/ipc/host",
     "//mojo/public/cpp/bindings",
     "//services/ui/gpu/interfaces",
diff --git a/components/viz/host/hit_test/BUILD.gn b/components/viz/host/hit_test/BUILD.gn
deleted file mode 100644
index aa16214..0000000
--- a/components/viz/host/hit_test/BUILD.gn
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//components/viz/viz.gni")
-import("//testing/test.gni")
-
-viz_source_set("hit_test") {
-  sources = [
-    "hit_test_query.cc",
-    "hit_test_query.h",
-  ]
-
-  public_deps = [
-    "//components/viz/common",
-    "//services/viz/public/interfaces/hit_test",
-    "//ui/gfx",
-    "//ui/gfx/geometry",
-  ]
-}
-
-viz_source_set("unit_tests") {
-  testonly = true
-
-  sources = [
-    "hit_test_query_unittest.cc",
-  ]
-
-  deps = [
-    ":hit_test",
-    "//base",
-    "//base/test:test_support",
-    "//cc:test_support",
-    "//testing/gtest",
-  ]
-}
diff --git a/components/viz/host/hit_test/hit_test_query.h b/components/viz/host/hit_test/hit_test_query.h
index 31221bf..a99f745 100644
--- a/components/viz/host/hit_test/hit_test_query.h
+++ b/components/viz/host/hit_test/hit_test_query.h
@@ -9,6 +9,7 @@
 
 #include "base/macros.h"
 #include "components/viz/common/hit_test/aggregated_hit_test_region.h"
+#include "components/viz/host/viz_host_export.h"
 #include "mojo/public/cpp/system/buffer.h"
 #include "ui/gfx/geometry/point.h"
 
@@ -26,7 +27,7 @@
 // Finds the target for a given location based on the AggregatedHitTestRegion
 // list aggregated by HitTestAggregator.
 // TODO(riajiang): Handle 3d space cases correctly.
-class HitTestQuery {
+class VIZ_HOST_EXPORT HitTestQuery {
  public:
   HitTestQuery();
   ~HitTestQuery();
diff --git a/components/viz/presubmit_checks.py b/components/viz/presubmit_checks.py
index 9db40f1..da6c89d 100644
--- a/components/viz/presubmit_checks.py
+++ b/components/viz/presubmit_checks.py
@@ -244,6 +244,32 @@
       items=errors)]
   return []
 
+# Verifies that we use the right module name (viz.mojom) in mojom files and we
+# don't specify module name viz.mojom when referring to types in viz.mojom.
+def CheckMojoms(input_api, output_api):
+  source_file_filter = lambda x: input_api.FilterSourceFile(x,
+                                                            ['.*\.mojom$'],
+                                                            [])
+  wrong_module_name=[]
+  omit_module_name=[]
+  for f in input_api.AffectedSourceFiles(source_file_filter):
+    contents = input_api.ReadFile(f, 'rb')
+    if 'module viz.mojom;' not in contents:
+      wrong_module_name.append(f.LocalPath())
+    elif 'viz.mojom.' in contents:
+      omit_module_name.append(f.LocalPath())
+
+  errors=[]
+  if wrong_module_name:
+    errors.append(output_api.PresubmitError(
+        'Use viz.mojom as the module name in mojom files.',
+        items=wrong_module_name))
+  if omit_module_name:
+    errors.append(output_api.PresubmitError(
+      'Do not specify module name viz.mojom when referring to types '
+      + 'in the same module.', items=omit_module_name))
+  return errors
+
 def CheckForUseOfWrongClock(input_api,
                             output_api,
                             white_list,
@@ -307,6 +333,7 @@
   results += CheckDoubleAngles(input_api, output_api, white_list)
   results += CheckUniquePtr(input_api, output_api, white_list)
   results += CheckNamespace(input_api, output_api)
+  results += CheckMojoms(input_api, output_api)
   results += CheckForUseOfWrongClock(input_api, output_api, white_list)
   results += FindUselessIfdefs(input_api, output_api)
   return results
diff --git a/components/viz/service/DEPS b/components/viz/service/DEPS
index a29ec613..d840a11 100644
--- a/components/viz/service/DEPS
+++ b/components/viz/service/DEPS
@@ -2,6 +2,7 @@
   "+cc",
   "-components/viz/common/switches.h",
   "+components/viz/service",
+  "+services/viz/public/interfaces",
   "+third_party/skia",
   "+ui/gfx",
   "+ui/gfx/geometry",
@@ -12,6 +13,5 @@
   ".*_unittest\.cc": [
     "+components/viz/test",
     "+services/compositing/privileged/interfaces",
-    "+services/viz/public/interfaces/compositing",
   ]
 }
diff --git a/components/viz/service/display_embedder/shared_bitmap_allocation_notifier_impl.cc b/components/viz/service/display_embedder/shared_bitmap_allocation_notifier_impl.cc
index d320a3d..bc81f59 100644
--- a/components/viz/service/display_embedder/shared_bitmap_allocation_notifier_impl.cc
+++ b/components/viz/service/display_embedder/shared_bitmap_allocation_notifier_impl.cc
@@ -21,7 +21,7 @@
 }
 
 void SharedBitmapAllocationNotifierImpl::Bind(
-    cc::mojom::SharedBitmapAllocationNotifierRequest request) {
+    mojom::SharedBitmapAllocationNotifierRequest request) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   if (binding_.is_bound()) {
     DLOG(ERROR) << "Only one SharedBitmapAllocationNotifierRequest is "
diff --git a/components/viz/service/display_embedder/shared_bitmap_allocation_notifier_impl.h b/components/viz/service/display_embedder/shared_bitmap_allocation_notifier_impl.h
index 4e9330a..080fece 100644
--- a/components/viz/service/display_embedder/shared_bitmap_allocation_notifier_impl.h
+++ b/components/viz/service/display_embedder/shared_bitmap_allocation_notifier_impl.h
@@ -9,10 +9,10 @@
 
 #include "base/observer_list.h"
 #include "base/threading/thread_checker.h"
-#include "cc/ipc/shared_bitmap_allocation_notifier.mojom.h"
 #include "components/viz/common/quads/shared_bitmap.h"
 #include "components/viz/service/viz_service_export.h"
 #include "mojo/public/cpp/bindings/binding.h"
+#include "services/viz/public/interfaces/compositing/shared_bitmap_allocation_notifier.mojom.h"
 
 namespace viz {
 class ServerSharedBitmapManager;
@@ -23,7 +23,7 @@
 };
 
 class VIZ_SERVICE_EXPORT SharedBitmapAllocationNotifierImpl
-    : NON_EXPORTED_BASE(public cc::mojom::SharedBitmapAllocationNotifier) {
+    : NON_EXPORTED_BASE(public mojom::SharedBitmapAllocationNotifier) {
  public:
   explicit SharedBitmapAllocationNotifierImpl(
       ServerSharedBitmapManager* manager);
@@ -33,9 +33,9 @@
   void AddObserver(SharedBitmapAllocationObserver* observer);
   void RemoveObserver(SharedBitmapAllocationObserver* observer);
 
-  void Bind(cc::mojom::SharedBitmapAllocationNotifierRequest request);
+  void Bind(mojom::SharedBitmapAllocationNotifierRequest request);
 
-  // cc::mojom::SharedBitmapAllocationNotifier overrides:
+  // mojom::SharedBitmapAllocationNotifier overrides:
   void DidAllocateSharedBitmap(mojo::ScopedSharedBufferHandle buffer,
                                const SharedBitmapId& id) override;
   void DidDeleteSharedBitmap(const SharedBitmapId& id) override;
@@ -51,7 +51,7 @@
  private:
   THREAD_CHECKER(thread_checker_);
   ServerSharedBitmapManager* const manager_;
-  mojo::Binding<cc::mojom::SharedBitmapAllocationNotifier> binding_;
+  mojo::Binding<mojom::SharedBitmapAllocationNotifier> binding_;
   std::unordered_set<SharedBitmapId, SharedBitmapIdHash> owned_bitmaps_;
   base::ObserverList<SharedBitmapAllocationObserver> observers_;
   uint32_t last_sequence_number_ = 0;
diff --git a/components/viz/service/frame_sinks/DEPS b/components/viz/service/frame_sinks/DEPS
index 0216da50..d878155 100644
--- a/components/viz/service/frame_sinks/DEPS
+++ b/components/viz/service/frame_sinks/DEPS
@@ -6,5 +6,4 @@
   "+gpu/ipc/common",
   "+mojo/public/cpp/bindings",
   "+services/viz/compositing/privileged/interfaces",
-  "+services/viz/public/interfaces/compositing",
 ]
diff --git a/components/viz/service/hit_test/DEPS b/components/viz/service/hit_test/DEPS
index 37540ce..38ff3f7 100644
--- a/components/viz/service/hit_test/DEPS
+++ b/components/viz/service/hit_test/DEPS
@@ -1,6 +1,5 @@
 include_rules = [
   "+components/viz/service/surfaces",
-  "+services/viz/public/interfaces/hit_test",
 ]
 
 specific_include_rules = {
diff --git a/components/viz/service/hit_test/hit_test_aggregator.cc b/components/viz/service/hit_test/hit_test_aggregator.cc
index 301a38e..4b07ea15 100644
--- a/components/viz/service/hit_test/hit_test_aggregator.cc
+++ b/components/viz/service/hit_test/hit_test_aggregator.cc
@@ -47,15 +47,16 @@
 HitTestAggregator::~HitTestAggregator() = default;
 
 void HitTestAggregator::SubmitHitTestRegionList(
+    const SurfaceId& frame_sink_id,
     mojom::HitTestRegionListPtr hit_test_region_list) {
   DCHECK(ValidateHitTestRegionList(hit_test_region_list));
   // TODO(gklassen): Runtime validation that hit_test_region_list is valid.
   // TODO(gklassen): Inform FrameSink that the hit_test_region_list is invalid.
   // TODO(gklassen): FrameSink needs to inform the host of a difficult renderer.
-  pending_[hit_test_region_list->surface_id] = std::move(hit_test_region_list);
+  pending_[frame_sink_id] = std::move(hit_test_region_list);
 }
 
-void HitTestAggregator::PostTaskAggregate(SurfaceId display_surface_id) {
+void HitTestAggregator::PostTaskAggregate(const SurfaceId& display_surface_id) {
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
       base::BindOnce(&HitTestAggregator::Aggregate,
@@ -170,7 +171,7 @@
   AggregatedHitTestRegion* regions =
       static_cast<AggregatedHitTestRegion*>(write_buffer_.get());
 
-  regions[0].frame_sink_id = hit_test_region_list->surface_id.frame_sink_id();
+  regions[0].frame_sink_id = surface_id.frame_sink_id();
   regions[0].flags = hit_test_region_list->flags;
   regions[0].rect = hit_test_region_list->bounds;
   regions[0].transform = hit_test_region_list->transform;
diff --git a/components/viz/service/hit_test/hit_test_aggregator.h b/components/viz/service/hit_test/hit_test_aggregator.h
index 787d4a7..9d08d05 100644
--- a/components/viz/service/hit_test/hit_test_aggregator.h
+++ b/components/viz/service/hit_test/hit_test_aggregator.h
@@ -30,11 +30,12 @@
   // to SubmitCompositorFrame.  This is collected in pending_ until
   // surfaces are aggregated and put on the display.
   void SubmitHitTestRegionList(
+      const SurfaceId& surface_id,
       mojom::HitTestRegionListPtr hit_test_region_list);
 
   // Performs the work of Aggregate by creating a PostTask so that
   // the work is not directly on the call.
-  void PostTaskAggregate(SurfaceId display_surface_id);
+  void PostTaskAggregate(const SurfaceId& display_surface_id);
 
   // Called after surfaces have been aggregated into the DisplayFrame.
   // In this call HitTestRegionList structures received from active surfaces
diff --git a/components/viz/service/hit_test/hit_test_aggregator_unittest.cc b/components/viz/service/hit_test/hit_test_aggregator_unittest.cc
index 002d50c7..c52abcb 100644
--- a/components/viz/service/hit_test/hit_test_aggregator_unittest.cc
+++ b/components/viz/service/hit_test/hit_test_aggregator_unittest.cc
@@ -232,7 +232,6 @@
     id++;
 
     auto hit_test_region_list = mojom::HitTestRegionList::New();
-    hit_test_region_list->surface_id = surface_id;
     hit_test_region_list->flags = mojom::kHitTestMine;
     hit_test_region_list->bounds.SetRect(0, 0, 1024, 768);
 
@@ -251,7 +250,7 @@
     }
 
     GetAggregator(kDisplayFrameSink)
-        ->SubmitHitTestRegionList(std::move(hit_test_region_list));
+        ->SubmitHitTestRegionList(surface_id, std::move(hit_test_region_list));
     return id;
   }
 
@@ -296,11 +295,11 @@
   SurfaceId display_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
 
   auto hit_test_region_list = mojom::HitTestRegionList::New();
-  hit_test_region_list->surface_id = display_surface_id;
   hit_test_region_list->flags = mojom::kHitTestMine;
   hit_test_region_list->bounds.SetRect(0, 0, 1024, 768);
 
-  aggregator->SubmitHitTestRegionList(std::move(hit_test_region_list));
+  aggregator->SubmitHitTestRegionList(display_surface_id,
+                                      std::move(hit_test_region_list));
   EXPECT_EQ(aggregator->Count(), 0);
 
   EXPECT_EQ(aggregator->GetPendingCount(), 1);
@@ -345,10 +344,9 @@
 
   SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
 
-  auto e_hit_test_data = mojom::HitTestRegionList::New();
-  e_hit_test_data->surface_id = e_surface_id;
-  e_hit_test_data->flags = mojom::kHitTestMine;
-  e_hit_test_data->bounds.SetRect(0, 0, 1024, 768);
+  auto e_hit_test_region_list = mojom::HitTestRegionList::New();
+  e_hit_test_region_list->flags = mojom::kHitTestMine;
+  e_hit_test_region_list->bounds.SetRect(0, 0, 1024, 768);
 
   auto e_hit_test_region_r1 = mojom::HitTestRegion::New();
   e_hit_test_region_r1->surface_id = e_surface_id;
@@ -360,14 +358,15 @@
   e_hit_test_region_r2->flags = mojom::kHitTestMine;
   e_hit_test_region_r2->rect.SetRect(400, 100, 300, 400);
 
-  e_hit_test_data->regions.push_back(std::move(e_hit_test_region_r1));
-  e_hit_test_data->regions.push_back(std::move(e_hit_test_region_r2));
+  e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_r1));
+  e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_r2));
 
   // Submit mojom::HitTestRegionList.
 
   EXPECT_EQ(aggregator->GetPendingCount(), 0);
 
-  aggregator->SubmitHitTestRegionList(std::move(e_hit_test_data));
+  aggregator->SubmitHitTestRegionList(e_surface_id,
+                                      std::move(e_hit_test_region_list));
   EXPECT_EQ(aggregator->GetPendingCount(), 1);
 
   // Add Surfaces to DisplayFrame in unexpected order.
@@ -427,10 +426,9 @@
   SurfaceId c1_surface_id = MakeSurfaceId(kDisplayFrameSink, 2);
   SurfaceId c2_surface_id = MakeSurfaceId(kDisplayFrameSink, 3);
 
-  auto e_hit_test_data = mojom::HitTestRegionList::New();
-  e_hit_test_data->surface_id = e_surface_id;
-  e_hit_test_data->flags = mojom::kHitTestMine;
-  e_hit_test_data->bounds.SetRect(0, 0, 1024, 768);
+  auto e_hit_test_region_list = mojom::HitTestRegionList::New();
+  e_hit_test_region_list->flags = mojom::kHitTestMine;
+  e_hit_test_region_list->bounds.SetRect(0, 0, 1024, 768);
 
   auto e_hit_test_region_c1 = mojom::HitTestRegion::New();
   e_hit_test_region_c1->flags = mojom::kHitTestChildSurface;
@@ -442,26 +440,27 @@
   e_hit_test_region_c2->surface_id = c2_surface_id;
   e_hit_test_region_c2->rect.SetRect(400, 100, 400, 300);
 
-  e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c1));
-  e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c2));
+  e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_c1));
+  e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_c2));
 
-  auto c1_hit_test_data = mojom::HitTestRegionList::New();
-  c1_hit_test_data->surface_id = c1_surface_id;
+  auto c1_hit_test_region_list = mojom::HitTestRegionList::New();
 
-  auto c2_hit_test_data = mojom::HitTestRegionList::New();
-  c2_hit_test_data->surface_id = c2_surface_id;
+  auto c2_hit_test_region_list = mojom::HitTestRegionList::New();
 
   // Submit in unexpected order.
 
   EXPECT_EQ(aggregator->GetPendingCount(), 0);
 
-  aggregator->SubmitHitTestRegionList(std::move(c1_hit_test_data));
+  aggregator->SubmitHitTestRegionList(c1_surface_id,
+                                      std::move(c1_hit_test_region_list));
   EXPECT_EQ(aggregator->GetPendingCount(), 1);
 
-  aggregator->SubmitHitTestRegionList(std::move(e_hit_test_data));
+  aggregator->SubmitHitTestRegionList(e_surface_id,
+                                      std::move(e_hit_test_region_list));
   EXPECT_EQ(aggregator->GetPendingCount(), 2);
 
-  aggregator->SubmitHitTestRegionList(std::move(c2_hit_test_data));
+  aggregator->SubmitHitTestRegionList(c2_surface_id,
+                                      std::move(c2_hit_test_region_list));
   EXPECT_EQ(aggregator->GetPendingCount(), 3);
 
   // Surfaces added to DisplayFrame in unexpected order.
@@ -531,10 +530,9 @@
   SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
   SurfaceId c_surface_id = MakeSurfaceId(kDisplayFrameSink, 2);
 
-  auto e_hit_test_data = mojom::HitTestRegionList::New();
-  e_hit_test_data->surface_id = e_surface_id;
-  e_hit_test_data->flags = mojom::kHitTestMine;
-  e_hit_test_data->bounds.SetRect(0, 0, 1024, 768);
+  auto e_hit_test_region_list = mojom::HitTestRegionList::New();
+  e_hit_test_region_list->flags = mojom::kHitTestMine;
+  e_hit_test_region_list->bounds.SetRect(0, 0, 1024, 768);
 
   auto e_hit_test_region_div = mojom::HitTestRegion::New();
   e_hit_test_region_div->flags = mojom::kHitTestMine;
@@ -546,22 +544,23 @@
   e_hit_test_region_c->surface_id = c_surface_id;
   e_hit_test_region_c->rect.SetRect(100, 100, 200, 500);
 
-  e_hit_test_data->regions.push_back(std::move(e_hit_test_region_div));
-  e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c));
+  e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_div));
+  e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_c));
 
-  auto c_hit_test_data = mojom::HitTestRegionList::New();
-  c_hit_test_data->surface_id = c_surface_id;
-  c_hit_test_data->flags = mojom::kHitTestMine;
-  c_hit_test_data->bounds.SetRect(0, 0, 200, 500);
+  auto c_hit_test_region_list = mojom::HitTestRegionList::New();
+  c_hit_test_region_list->flags = mojom::kHitTestMine;
+  c_hit_test_region_list->bounds.SetRect(0, 0, 200, 500);
 
   // Submit in unexpected order.
 
   EXPECT_EQ(aggregator->GetPendingCount(), 0);
 
-  aggregator->SubmitHitTestRegionList(std::move(c_hit_test_data));
+  aggregator->SubmitHitTestRegionList(c_surface_id,
+                                      std::move(c_hit_test_region_list));
   EXPECT_EQ(aggregator->GetPendingCount(), 1);
 
-  aggregator->SubmitHitTestRegionList(std::move(e_hit_test_data));
+  aggregator->SubmitHitTestRegionList(e_surface_id,
+                                      std::move(e_hit_test_region_list));
   EXPECT_EQ(aggregator->GetPendingCount(), 2);
 
   // Surfaces added to DisplayFrame in unexpected order.
@@ -629,10 +628,9 @@
   SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
   SurfaceId c_surface_id = MakeSurfaceId(kDisplayFrameSink, 2);
 
-  auto e_hit_test_data = mojom::HitTestRegionList::New();
-  e_hit_test_data->surface_id = e_surface_id;
-  e_hit_test_data->flags = mojom::kHitTestMine;
-  e_hit_test_data->bounds.SetRect(0, 0, 1024, 768);
+  auto e_hit_test_region_list = mojom::HitTestRegionList::New();
+  e_hit_test_region_list->flags = mojom::kHitTestMine;
+  e_hit_test_region_list->bounds.SetRect(0, 0, 1024, 768);
 
   auto e_hit_test_region_div = mojom::HitTestRegion::New();
   e_hit_test_region_div->flags = mojom::kHitTestMine;
@@ -644,22 +642,23 @@
   e_hit_test_region_c->surface_id = c_surface_id;
   e_hit_test_region_c->rect.SetRect(100, 100, 200, 500);
 
-  e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c));
-  e_hit_test_data->regions.push_back(std::move(e_hit_test_region_div));
+  e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_c));
+  e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_div));
 
-  auto c_hit_test_data = mojom::HitTestRegionList::New();
-  c_hit_test_data->surface_id = c_surface_id;
-  c_hit_test_data->flags = mojom::kHitTestMine;
-  c_hit_test_data->bounds.SetRect(0, 0, 200, 500);
+  auto c_hit_test_region_list = mojom::HitTestRegionList::New();
+  c_hit_test_region_list->flags = mojom::kHitTestMine;
+  c_hit_test_region_list->bounds.SetRect(0, 0, 200, 500);
 
   // Submit in unexpected order.
 
   EXPECT_EQ(aggregator->GetPendingCount(), 0);
 
-  aggregator->SubmitHitTestRegionList(std::move(c_hit_test_data));
+  aggregator->SubmitHitTestRegionList(c_surface_id,
+                                      std::move(c_hit_test_region_list));
   EXPECT_EQ(aggregator->GetPendingCount(), 1);
 
-  aggregator->SubmitHitTestRegionList(std::move(e_hit_test_data));
+  aggregator->SubmitHitTestRegionList(e_surface_id,
+                                      std::move(e_hit_test_region_list));
   EXPECT_EQ(aggregator->GetPendingCount(), 2);
 
   // Surfaces added to DisplayFrame in unexpected order.
@@ -729,10 +728,9 @@
   SurfaceId a_surface_id = MakeSurfaceId(kDisplayFrameSink, 3);
   SurfaceId b_surface_id = MakeSurfaceId(kDisplayFrameSink, 4);
 
-  auto e_hit_test_data = mojom::HitTestRegionList::New();
-  e_hit_test_data->surface_id = e_surface_id;
-  e_hit_test_data->flags = mojom::kHitTestMine;
-  e_hit_test_data->bounds.SetRect(0, 0, 1024, 768);
+  auto e_hit_test_region_list = mojom::HitTestRegionList::New();
+  e_hit_test_region_list->flags = mojom::kHitTestMine;
+  e_hit_test_region_list->bounds.SetRect(0, 0, 1024, 768);
 
   auto e_hit_test_region_c = mojom::HitTestRegion::New();
   e_hit_test_region_c->flags = mojom::kHitTestChildSurface;
@@ -740,12 +738,11 @@
   e_hit_test_region_c->rect.SetRect(300, 100, 1600, 800);
   e_hit_test_region_c->transform.Translate(200, 100);
 
-  e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c));
+  e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_c));
 
-  auto c_hit_test_data = mojom::HitTestRegionList::New();
-  c_hit_test_data->surface_id = c_surface_id;
-  c_hit_test_data->flags = mojom::kHitTestIgnore;
-  c_hit_test_data->bounds.SetRect(0, 0, 1600, 800);
+  auto c_hit_test_region_list = mojom::HitTestRegionList::New();
+  c_hit_test_region_list->flags = mojom::kHitTestIgnore;
+  c_hit_test_region_list->bounds.SetRect(0, 0, 1600, 800);
 
   auto c_hit_test_region_a = mojom::HitTestRegion::New();
   c_hit_test_region_a->flags = mojom::kHitTestChildSurface;
@@ -757,33 +754,35 @@
   c_hit_test_region_b->surface_id = b_surface_id;
   c_hit_test_region_b->rect.SetRect(0, 100, 800, 600);
 
-  c_hit_test_data->regions.push_back(std::move(c_hit_test_region_a));
-  c_hit_test_data->regions.push_back(std::move(c_hit_test_region_b));
+  c_hit_test_region_list->regions.push_back(std::move(c_hit_test_region_a));
+  c_hit_test_region_list->regions.push_back(std::move(c_hit_test_region_b));
 
-  auto a_hit_test_data = mojom::HitTestRegionList::New();
-  a_hit_test_data->surface_id = a_surface_id;
-  a_hit_test_data->flags = mojom::kHitTestMine;
-  a_hit_test_data->bounds.SetRect(0, 0, 200, 100);
+  auto a_hit_test_region_list = mojom::HitTestRegionList::New();
+  a_hit_test_region_list->flags = mojom::kHitTestMine;
+  a_hit_test_region_list->bounds.SetRect(0, 0, 200, 100);
 
-  auto b_hit_test_data = mojom::HitTestRegionList::New();
-  b_hit_test_data->surface_id = b_surface_id;
-  b_hit_test_data->flags = mojom::kHitTestMine;
-  b_hit_test_data->bounds.SetRect(0, 100, 800, 600);
+  auto b_hit_test_region_list = mojom::HitTestRegionList::New();
+  b_hit_test_region_list->flags = mojom::kHitTestMine;
+  b_hit_test_region_list->bounds.SetRect(0, 100, 800, 600);
 
   // Submit in unexpected order.
 
   EXPECT_EQ(aggregator->GetPendingCount(), 0);
 
-  aggregator->SubmitHitTestRegionList(std::move(c_hit_test_data));
+  aggregator->SubmitHitTestRegionList(c_surface_id,
+                                      std::move(c_hit_test_region_list));
   EXPECT_EQ(aggregator->GetPendingCount(), 1);
 
-  aggregator->SubmitHitTestRegionList(std::move(a_hit_test_data));
+  aggregator->SubmitHitTestRegionList(a_surface_id,
+                                      std::move(a_hit_test_region_list));
   EXPECT_EQ(aggregator->GetPendingCount(), 2);
 
-  aggregator->SubmitHitTestRegionList(std::move(b_hit_test_data));
+  aggregator->SubmitHitTestRegionList(b_surface_id,
+                                      std::move(b_hit_test_region_list));
   EXPECT_EQ(aggregator->GetPendingCount(), 3);
 
-  aggregator->SubmitHitTestRegionList(std::move(e_hit_test_data));
+  aggregator->SubmitHitTestRegionList(e_surface_id,
+                                      std::move(e_hit_test_region_list));
   EXPECT_EQ(aggregator->GetPendingCount(), 4);
 
   // Surfaces added to DisplayFrame in unexpected order.
@@ -871,61 +870,61 @@
   SurfaceId c2_surface_id = MakeSurfaceId(kDisplayFrameSink, 3);
   SurfaceId c3_surface_id = MakeSurfaceId(kDisplayFrameSink, 4);
 
-  auto e_hit_test_data = mojom::HitTestRegionList::New();
-  e_hit_test_data->surface_id = e_surface_id;
-  e_hit_test_data->flags = mojom::kHitTestMine;
-  e_hit_test_data->bounds.SetRect(0, 0, 1024, 768);
+  auto e_hit_test_region_list = mojom::HitTestRegionList::New();
+  e_hit_test_region_list->flags = mojom::kHitTestMine;
+  e_hit_test_region_list->bounds.SetRect(0, 0, 1024, 768);
 
   auto e_hit_test_region_c1 = mojom::HitTestRegion::New();
   e_hit_test_region_c1->flags = mojom::kHitTestChildSurface;
   e_hit_test_region_c1->surface_id = c1_surface_id;
   e_hit_test_region_c1->rect.SetRect(100, 100, 700, 700);
 
-  e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c1));
+  e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_c1));
 
-  auto c1_hit_test_data = mojom::HitTestRegionList::New();
-  c1_hit_test_data->surface_id = c1_surface_id;
-  c1_hit_test_data->flags = mojom::kHitTestMine;
-  c1_hit_test_data->bounds.SetRect(0, 0, 600, 600);
+  auto c1_hit_test_region_list = mojom::HitTestRegionList::New();
+  c1_hit_test_region_list->flags = mojom::kHitTestMine;
+  c1_hit_test_region_list->bounds.SetRect(0, 0, 600, 600);
 
   auto c1_hit_test_region_c2 = mojom::HitTestRegion::New();
   c1_hit_test_region_c2->flags = mojom::kHitTestChildSurface;
   c1_hit_test_region_c2->surface_id = c2_surface_id;
   c1_hit_test_region_c2->rect.SetRect(100, 100, 500, 500);
 
-  c1_hit_test_data->regions.push_back(std::move(c1_hit_test_region_c2));
+  c1_hit_test_region_list->regions.push_back(std::move(c1_hit_test_region_c2));
 
-  auto c2_hit_test_data = mojom::HitTestRegionList::New();
-  c2_hit_test_data->surface_id = c2_surface_id;
-  c2_hit_test_data->flags = mojom::kHitTestMine;
-  c2_hit_test_data->bounds.SetRect(0, 0, 400, 400);
+  auto c2_hit_test_region_list = mojom::HitTestRegionList::New();
+  c2_hit_test_region_list->flags = mojom::kHitTestMine;
+  c2_hit_test_region_list->bounds.SetRect(0, 0, 400, 400);
 
   auto c2_hit_test_region_c3 = mojom::HitTestRegion::New();
   c2_hit_test_region_c3->flags = mojom::kHitTestChildSurface;
   c2_hit_test_region_c3->surface_id = c3_surface_id;
   c2_hit_test_region_c3->rect.SetRect(100, 100, 300, 300);
 
-  c2_hit_test_data->regions.push_back(std::move(c2_hit_test_region_c3));
+  c2_hit_test_region_list->regions.push_back(std::move(c2_hit_test_region_c3));
 
-  auto c3_hit_test_data = mojom::HitTestRegionList::New();
-  c3_hit_test_data->surface_id = c3_surface_id;
-  c3_hit_test_data->flags = mojom::kHitTestMine;
-  c3_hit_test_data->bounds.SetRect(0, 0, 200, 200);
+  auto c3_hit_test_region_list = mojom::HitTestRegionList::New();
+  c3_hit_test_region_list->flags = mojom::kHitTestMine;
+  c3_hit_test_region_list->bounds.SetRect(0, 0, 200, 200);
 
   // Submit in unexpected order.
 
   EXPECT_EQ(aggregator->GetPendingCount(), 0);
 
-  aggregator->SubmitHitTestRegionList(std::move(c1_hit_test_data));
+  aggregator->SubmitHitTestRegionList(c1_surface_id,
+                                      std::move(c1_hit_test_region_list));
   EXPECT_EQ(aggregator->GetPendingCount(), 1);
 
-  aggregator->SubmitHitTestRegionList(std::move(c3_hit_test_data));
+  aggregator->SubmitHitTestRegionList(c3_surface_id,
+                                      std::move(c3_hit_test_region_list));
   EXPECT_EQ(aggregator->GetPendingCount(), 2);
 
-  aggregator->SubmitHitTestRegionList(std::move(e_hit_test_data));
+  aggregator->SubmitHitTestRegionList(e_surface_id,
+                                      std::move(e_hit_test_region_list));
   EXPECT_EQ(aggregator->GetPendingCount(), 3);
 
-  aggregator->SubmitHitTestRegionList(std::move(c2_hit_test_data));
+  aggregator->SubmitHitTestRegionList(c2_surface_id,
+                                      std::move(c2_hit_test_region_list));
   EXPECT_EQ(aggregator->GetPendingCount(), 4);
 
   // Surfaces added to DisplayFrame in unexpected order.
@@ -1004,10 +1003,9 @@
   SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
   SurfaceId c_surface_id = MakeSurfaceId(kDisplayFrameSink, 2);
 
-  auto e_hit_test_data = mojom::HitTestRegionList::New();
-  e_hit_test_data->surface_id = e_surface_id;
-  e_hit_test_data->flags = mojom::kHitTestMine;
-  e_hit_test_data->bounds.SetRect(0, 0, 1024, 768);
+  auto e_hit_test_region_list = mojom::HitTestRegionList::New();
+  e_hit_test_region_list->flags = mojom::kHitTestMine;
+  e_hit_test_region_list->bounds.SetRect(0, 0, 1024, 768);
 
   auto e_hit_test_region_div = mojom::HitTestRegion::New();
   e_hit_test_region_div->flags = mojom::kHitTestMine;
@@ -1019,19 +1017,19 @@
   e_hit_test_region_c->surface_id = c_surface_id;
   e_hit_test_region_c->rect.SetRect(100, 100, 200, 500);
 
-  e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c));
-  e_hit_test_data->regions.push_back(std::move(e_hit_test_region_div));
+  e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_c));
+  e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_div));
 
-  auto c_hit_test_data = mojom::HitTestRegionList::New();
-  c_hit_test_data->surface_id = c_surface_id;
-  c_hit_test_data->flags = mojom::kHitTestMine;
-  c_hit_test_data->bounds.SetRect(0, 0, 200, 500);
+  auto c_hit_test_region_list = mojom::HitTestRegionList::New();
+  c_hit_test_region_list->flags = mojom::kHitTestMine;
+  c_hit_test_region_list->bounds.SetRect(0, 0, 200, 500);
 
   // Submit in unexpected order, but not the child.
 
   EXPECT_EQ(aggregator->GetPendingCount(), 0);
 
-  aggregator->SubmitHitTestRegionList(std::move(e_hit_test_data));
+  aggregator->SubmitHitTestRegionList(e_surface_id,
+                                      std::move(e_hit_test_region_list));
   EXPECT_EQ(aggregator->GetPendingCount(), 1);
 
   // Surfaces added to DisplayFrame in unexpected order.
@@ -1152,10 +1150,9 @@
   SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
   SurfaceId c_surface_id = MakeSurfaceId(kDisplayFrameSink, 2);
 
-  auto e_hit_test_data = mojom::HitTestRegionList::New();
-  e_hit_test_data->surface_id = e_surface_id;
-  e_hit_test_data->flags = mojom::kHitTestMine;
-  e_hit_test_data->bounds.SetRect(0, 0, 1024, 768);
+  auto e_hit_test_region_list = mojom::HitTestRegionList::New();
+  e_hit_test_region_list->flags = mojom::kHitTestMine;
+  e_hit_test_region_list->bounds.SetRect(0, 0, 1024, 768);
 
   auto e_hit_test_region_div = mojom::HitTestRegion::New();
   e_hit_test_region_div->flags = mojom::kHitTestMine;
@@ -1167,13 +1164,12 @@
   e_hit_test_region_c->surface_id = c_surface_id;
   e_hit_test_region_c->rect.SetRect(100, 100, 200, 500);
 
-  e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c));
-  e_hit_test_data->regions.push_back(std::move(e_hit_test_region_div));
+  e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_c));
+  e_hit_test_region_list->regions.push_back(std::move(e_hit_test_region_div));
 
-  auto c_hit_test_data = mojom::HitTestRegionList::New();
-  c_hit_test_data->surface_id = c_surface_id;
-  c_hit_test_data->flags = mojom::kHitTestMine;
-  c_hit_test_data->bounds.SetRect(0, 0, 200, 500);
+  auto c_hit_test_region_list = mojom::HitTestRegionList::New();
+  c_hit_test_region_list->flags = mojom::kHitTestMine;
+  c_hit_test_region_list->bounds.SetRect(0, 0, 200, 500);
 
   EXPECT_EQ(aggregator->GetActiveRegionCount(), 0);
 
@@ -1181,10 +1177,12 @@
 
   EXPECT_EQ(aggregator->GetPendingCount(), 0);
 
-  aggregator->SubmitHitTestRegionList(std::move(c_hit_test_data));
+  aggregator->SubmitHitTestRegionList(c_surface_id,
+                                      std::move(c_hit_test_region_list));
   EXPECT_EQ(aggregator->GetPendingCount(), 1);
 
-  aggregator->SubmitHitTestRegionList(std::move(e_hit_test_data));
+  aggregator->SubmitHitTestRegionList(e_surface_id,
+                                      std::move(e_hit_test_region_list));
   EXPECT_EQ(aggregator->GetPendingCount(), 2);
 
   EXPECT_EQ(aggregator->GetActiveRegionCount(), 0);
diff --git a/components/viz/test/data/background_filter_rotated_sw.png b/components/viz/test/data/background_filter_rotated_sw.png
index 94bbb8e6..5b9395f 100644
--- a/components/viz/test/data/background_filter_rotated_sw.png
+++ b/components/viz/test/data/background_filter_rotated_sw.png
Binary files differ
diff --git a/components/viz/test/data/rotated_drop_shadow_filter_sw.png b/components/viz/test/data/rotated_drop_shadow_filter_sw.png
index d7c0cb4..0dd39e27 100644
--- a/components/viz/test/data/rotated_drop_shadow_filter_sw.png
+++ b/components/viz/test/data/rotated_drop_shadow_filter_sw.png
Binary files differ
diff --git a/components/viz/test/data/rotated_filter_sw.png b/components/viz/test/data/rotated_filter_sw.png
index 12b12f0..02bf842 100644
--- a/components/viz/test/data/rotated_filter_sw.png
+++ b/components/viz/test/data/rotated_filter_sw.png
Binary files differ
diff --git a/components/wallpaper/wallpaper_manager_base.cc b/components/wallpaper/wallpaper_manager_base.cc
index 225ffe1..4b33021 100644
--- a/components/wallpaper/wallpaper_manager_base.cc
+++ b/components/wallpaper/wallpaper_manager_base.cc
@@ -450,7 +450,11 @@
   GetUserWallpaperInfo(account_id, &info);
   info.type = DEFAULT;
   SetUserWallpaperInfo(account_id, info, true /* is_persistent */);
-  SetDefaultWallpaperNow(account_id);
+
+  // If we're at the login screen, do not change the wallpaper but defer it
+  // until the user logs in to the system.
+  if (user_manager::UserManager::Get()->IsUserLoggedIn())
+    SetDefaultWallpaperNow(account_id);
 }
 
 // static
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 22b9286..de15ce1 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -119,7 +119,8 @@
     "//services/file:lib",
     "//services/file/public/interfaces",
     "//services/metrics/public/cpp:metrics_cpp",
-    "//services/network/public/interfaces:interfaces",
+    "//services/network/public/cpp",
+    "//services/network/public/interfaces",
     "//services/resource_coordinator:lib",
     "//services/resource_coordinator/public/cpp:resource_coordinator_cpp",
     "//services/service_manager",
@@ -187,6 +188,8 @@
   ]
 
   sources = [
+    "$target_gen_dir/devtools/protocol/browser.cc",
+    "$target_gen_dir/devtools/protocol/browser.h",
     "$target_gen_dir/devtools/protocol/dom.cc",
     "$target_gen_dir/devtools/protocol/dom.h",
     "$target_gen_dir/devtools/protocol/emulation.cc",
@@ -546,6 +549,8 @@
     "devtools/devtools_url_request_interceptor.h",
     "devtools/forwarding_agent_host.cc",
     "devtools/forwarding_agent_host.h",
+    "devtools/protocol/browser_handler.cc",
+    "devtools/protocol/browser_handler.h",
     "devtools/protocol/devtools_domain_handler.cc",
     "devtools/protocol/devtools_domain_handler.h",
     "devtools/protocol/dom_handler.cc",
@@ -663,6 +668,8 @@
     "download/download_request_handle.h",
     "download/download_resource_handler.cc",
     "download/download_resource_handler.h",
+    "download/download_response_handler.cc",
+    "download/download_response_handler.h",
     "download/download_stats.cc",
     "download/download_stats.h",
     "download/download_task_runner.cc",
diff --git a/content/browser/DEPS b/content/browser/DEPS
index 378c891..9ffada491 100644
--- a/content/browser/DEPS
+++ b/content/browser/DEPS
@@ -126,13 +126,13 @@
   "+third_party/WebKit/public/platform/reporting.mojom.h",
   "+third_party/WebKit/public/public_features.h",
   "+third_party/WebKit/public/web/WebAXEnums.h",
-  "+third_party/WebKit/public/web/WebCompositionUnderline.h",
   "+third_party/WebKit/public/web/WebConsoleMessage.h",
   "+third_party/WebKit/public/web/WebContextMenuData.h",
   "+third_party/WebKit/public/web/WebDeviceEmulationParams.h",
   "+third_party/WebKit/public/web/WebDragStatus.h",
   "+third_party/WebKit/public/web/WebFindOptions.h",
   "+third_party/WebKit/public/web/WebFrameSerializerCacheControlPolicy.h",
+  "+third_party/WebKit/public/web/WebImeTextSpan.h",
   "+third_party/WebKit/public/web/WebMediaPlayerAction.h",
   "+third_party/WebKit/public/web/WebPluginAction.h",
   "+third_party/WebKit/public/web/WebPopupType.h",
diff --git a/content/browser/android/content_view_core.h b/content/browser/android/content_view_core.h
index 868a81bc..f29b174b6 100644
--- a/content/browser/android/content_view_core.h
+++ b/content/browser/android/content_view_core.h
@@ -281,6 +281,7 @@
   void SelectBetweenCoordinates(const gfx::PointF& base,
                                 const gfx::PointF& extent);
 
+  void UpdateCursor(const content::CursorInfo& info);
   void OnTouchDown(const base::android::ScopedJavaLocalRef<jobject>& event);
 
   ui::ViewAndroid* GetViewAndroid() const;
diff --git a/content/browser/android/ime_adapter_android.cc b/content/browser/android/ime_adapter_android.cc
index d23bbe9..275e2468 100644
--- a/content/browser/android/ime_adapter_android.cc
+++ b/content/browser/android/ime_adapter_android.cc
@@ -27,7 +27,7 @@
 #include "jni/ImeAdapter_jni.h"
 #include "third_party/WebKit/public/platform/WebInputEvent.h"
 #include "third_party/WebKit/public/platform/WebTextInputType.h"
-#include "ui/base/ime/composition_underline.h"
+#include "ui/base/ime/ime_text_span.h"
 
 using base::android::AttachCurrentThread;
 using base::android::ConvertJavaStringToUTF16;
@@ -73,37 +73,37 @@
 }
 
 // Callback from Java to convert BackgroundColorSpan data to a
-// ui::CompositionUnderline instance, and append it to |underlines_ptr|.
+// ui::ImeTextSpan instance, and append it to |ime_text_spans_ptr|.
 void AppendBackgroundColorSpan(JNIEnv*,
                                const JavaParamRef<jclass>&,
-                               jlong underlines_ptr,
+                               jlong ime_text_spans_ptr,
                                jint start,
                                jint end,
                                jint background_color) {
   DCHECK_GE(start, 0);
   DCHECK_GE(end, 0);
   // Do not check |background_color|.
-  std::vector<ui::CompositionUnderline>* underlines =
-      reinterpret_cast<std::vector<ui::CompositionUnderline>*>(underlines_ptr);
-  underlines->push_back(ui::CompositionUnderline(
+  std::vector<ui::ImeTextSpan>* ime_text_spans =
+      reinterpret_cast<std::vector<ui::ImeTextSpan>*>(ime_text_spans_ptr);
+  ime_text_spans->push_back(ui::ImeTextSpan(
       static_cast<unsigned>(start), static_cast<unsigned>(end),
       SK_ColorTRANSPARENT, false, static_cast<unsigned>(background_color)));
 }
 
 // Callback from Java to convert UnderlineSpan data to a
-// ui::CompositionUnderline instance, and append it to |underlines_ptr|.
+// ui::ImeTextSpan instance, and append it to |ime_text_spans_ptr|.
 void AppendUnderlineSpan(JNIEnv*,
                          const JavaParamRef<jclass>&,
-                         jlong underlines_ptr,
+                         jlong ime_text_spans_ptr,
                          jint start,
                          jint end) {
   DCHECK_GE(start, 0);
   DCHECK_GE(end, 0);
-  std::vector<ui::CompositionUnderline>* underlines =
-      reinterpret_cast<std::vector<ui::CompositionUnderline>*>(underlines_ptr);
-  underlines->push_back(ui::CompositionUnderline(
-      static_cast<unsigned>(start), static_cast<unsigned>(end), SK_ColorBLACK,
-      false, SK_ColorTRANSPARENT));
+  std::vector<ui::ImeTextSpan>* ime_text_spans =
+      reinterpret_cast<std::vector<ui::ImeTextSpan>*>(ime_text_spans_ptr);
+  ime_text_spans->push_back(
+      ui::ImeTextSpan(static_cast<unsigned>(start), static_cast<unsigned>(end),
+                      SK_ColorBLACK, false, SK_ColorTRANSPARENT));
 }
 
 ImeAdapterAndroid::ImeAdapterAndroid(JNIEnv* env,
@@ -210,13 +210,13 @@
 
   base::string16 text16 = ConvertJavaStringToUTF16(env, text_str);
 
-  std::vector<ui::CompositionUnderline> underlines =
-      GetUnderlinesFromSpans(env, obj, text, text16);
+  std::vector<ui::ImeTextSpan> ime_text_spans =
+      GetImeTextSpansFromJava(env, obj, text, text16);
 
   // Default to plain underline if we didn't find any span that we care about.
-  if (underlines.empty()) {
-    underlines.push_back(ui::CompositionUnderline(
-        0, text16.length(), SK_ColorBLACK, false, SK_ColorTRANSPARENT));
+  if (ime_text_spans.empty()) {
+    ime_text_spans.push_back(ui::ImeTextSpan(0, text16.length(), SK_ColorBLACK,
+                                             false, SK_ColorTRANSPARENT));
   }
 
   // relative_cursor_pos is as described in the Android API for
@@ -225,7 +225,7 @@
   if (relative_cursor_pos > 0)
     relative_cursor_pos = text16.length() + relative_cursor_pos - 1;
 
-  rwhi->ImeSetComposition(text16, underlines, gfx::Range::InvalidRange(),
+  rwhi->ImeSetComposition(text16, ime_text_spans, gfx::Range::InvalidRange(),
                           relative_cursor_pos, relative_cursor_pos);
 }
 
@@ -240,8 +240,8 @@
 
   base::string16 text16 = ConvertJavaStringToUTF16(env, text_str);
 
-  std::vector<ui::CompositionUnderline> underlines =
-      GetUnderlinesFromSpans(env, obj, text, text16);
+  std::vector<ui::ImeTextSpan> ime_text_spans =
+      GetImeTextSpansFromJava(env, obj, text, text16);
 
   // relative_cursor_pos is as described in the Android API for
   // InputConnection#commitText, whereas the parameters for
@@ -251,7 +251,7 @@
   else
     relative_cursor_pos -= text16.length();
 
-  rwhi->ImeCommitText(text16, underlines, gfx::Range::InvalidRange(),
+  rwhi->ImeCommitText(text16, ime_text_spans, gfx::Range::InvalidRange(),
                       relative_cursor_pos);
 }
 
@@ -336,12 +336,12 @@
   if (!rfh)
     return;
 
-  std::vector<ui::CompositionUnderline> underlines;
-  underlines.push_back(ui::CompositionUnderline(0, end - start, SK_ColorBLACK,
-                                                false, SK_ColorTRANSPARENT));
+  std::vector<ui::ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ui::ImeTextSpan(0, end - start, SK_ColorBLACK, false,
+                                           SK_ColorTRANSPARENT));
 
   rfh->GetFrameInputHandler()->SetCompositionFromExistingText(start, end,
-                                                              underlines);
+                                                              ime_text_spans);
 }
 
 void ImeAdapterAndroid::DeleteSurroundingText(JNIEnv*,
@@ -412,22 +412,22 @@
   return nullptr;
 }
 
-std::vector<ui::CompositionUnderline> ImeAdapterAndroid::GetUnderlinesFromSpans(
+std::vector<ui::ImeTextSpan> ImeAdapterAndroid::GetImeTextSpansFromJava(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& obj,
     const base::android::JavaParamRef<jobject>& text,
     const base::string16& text16) {
-  std::vector<ui::CompositionUnderline> underlines;
+  std::vector<ui::ImeTextSpan> ime_text_spans;
   // Iterate over spans in |text|, dispatch those that we care about (e.g.,
   // BackgroundColorSpan) to a matching callback (e.g.,
-  // AppendBackgroundColorSpan()), and populate |underlines|.
-  Java_ImeAdapter_populateUnderlinesFromSpans(
-      env, obj, text, reinterpret_cast<jlong>(&underlines));
+  // AppendBackgroundColorSpan()), and populate |ime_text_spans|.
+  Java_ImeAdapter_populateImeTextSpansFromJava(
+      env, obj, text, reinterpret_cast<jlong>(&ime_text_spans));
 
   // Sort spans by |.startOffset|.
-  std::sort(underlines.begin(), underlines.end());
+  std::sort(ime_text_spans.begin(), ime_text_spans.end());
 
-  return underlines;
+  return ime_text_spans;
 }
 
 }  // namespace content
diff --git a/content/browser/android/ime_adapter_android.h b/content/browser/android/ime_adapter_android.h
index 06bd658..9e591fe 100644
--- a/content/browser/android/ime_adapter_android.h
+++ b/content/browser/android/ime_adapter_android.h
@@ -16,7 +16,7 @@
 
 namespace ui {
 
-struct CompositionUnderline;
+struct ImeTextSpan;
 
 }  // namespace ui
 
@@ -113,7 +113,7 @@
  private:
   RenderWidgetHostImpl* GetFocusedWidget();
   RenderFrameHost* GetFocusedFrame();
-  std::vector<ui::CompositionUnderline> GetUnderlinesFromSpans(
+  std::vector<ui::ImeTextSpan> GetImeTextSpansFromJava(
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jobject>& text,
diff --git a/content/browser/android/java/gin_java_bridge_dispatcher_host.cc b/content/browser/android/java/gin_java_bridge_dispatcher_host.cc
index ed067a5..55a902efa 100644
--- a/content/browser/android/java/gin_java_bridge_dispatcher_host.cc
+++ b/content/browser/android/java/gin_java_bridge_dispatcher_host.cc
@@ -159,24 +159,19 @@
 }
 
 JavaObjectWeakGlobalRef
-GinJavaBridgeDispatcherHost::RemoveHolderAndAdvanceLocked(
+GinJavaBridgeDispatcherHost::RemoveHolderLocked(
     int32_t holder,
     ObjectMap::iterator* iter_ptr) {
   objects_lock_.AssertAcquired();
   JavaObjectWeakGlobalRef result;
   scoped_refptr<GinJavaBoundObject> object((*iter_ptr)->second);
-  bool object_erased = false;
   if (!object->IsNamed()) {
     object->RemoveHolder(holder);
     if (!object->HasHolders()) {
       result = object->GetWeakRef();
-      objects_.erase((*iter_ptr)++);
-      object_erased = true;
+      objects_.erase(*iter_ptr);
     }
   }
-  if (!object_erased) {
-    ++(*iter_ptr);
-  }
   return result;
 }
 
@@ -372,8 +367,7 @@
   auto iter = objects_.find(object_id);
   if (iter == objects_.end())
     return;
-  JavaObjectWeakGlobalRef ref =
-      RemoveHolderAndAdvanceLocked(routing_id, &iter);
+  JavaObjectWeakGlobalRef ref = RemoveHolderLocked(routing_id, &iter);
   if (!ref.is_uninitialized()) {
     RemoveFromRetainedObjectSetLocked(ref);
   }
diff --git a/content/browser/android/java/gin_java_bridge_dispatcher_host.h b/content/browser/android/java/gin_java_bridge_dispatcher_host.h
index aeffec89..7e0b723 100644
--- a/content/browser/android/java/gin_java_bridge_dispatcher_host.h
+++ b/content/browser/android/java/gin_java_bridge_dispatcher_host.h
@@ -95,7 +95,7 @@
   bool FindObjectId(const base::android::JavaRef<jobject>& object,
                     GinJavaBoundObject::ObjectID* object_id);
   void RemoveFromRetainedObjectSetLocked(const JavaObjectWeakGlobalRef& ref);
-  JavaObjectWeakGlobalRef RemoveHolderAndAdvanceLocked(
+  JavaObjectWeakGlobalRef RemoveHolderLocked(
       int32_t holder,
       ObjectMap::iterator* iter_ptr);
 
diff --git a/content/browser/appcache/appcache_disk_cache.cc b/content/browser/appcache/appcache_disk_cache.cc
index 16dbe75..66dba6fc 100644
--- a/content/browser/appcache/appcache_disk_cache.cc
+++ b/content/browser/appcache/appcache_disk_cache.cc
@@ -220,20 +220,16 @@
     const base::FilePath& disk_cache_directory,
     int disk_cache_size,
     bool force,
-    const scoped_refptr<base::SingleThreadTaskRunner>& cache_thread,
+    base::OnceClosure post_cleanup_callback,
     const net::CompletionCallback& callback) {
-  return Init(net::APP_CACHE,
-              disk_cache_directory,
-              disk_cache_size,
-              force,
-              cache_thread,
-              callback);
+  return Init(net::APP_CACHE, disk_cache_directory, disk_cache_size, force,
+              std::move(post_cleanup_callback), callback);
 }
 
 int AppCacheDiskCache::InitWithMemBackend(
     int mem_cache_size, const net::CompletionCallback& callback) {
-  return Init(net::MEMORY_CACHE, base::FilePath(), mem_cache_size, false, NULL,
-              callback);
+  return Init(net::MEMORY_CACHE, base::FilePath(), mem_cache_size, false,
+              base::OnceClosure(), callback);
 }
 
 void AppCacheDiskCache::Disable() {
@@ -340,13 +336,12 @@
 
 AppCacheDiskCache::PendingCall::~PendingCall() {}
 
-int AppCacheDiskCache::Init(
-    net::CacheType cache_type,
-    const base::FilePath& cache_directory,
-    int cache_size,
-    bool force,
-    const scoped_refptr<base::SingleThreadTaskRunner>& cache_thread,
-    const net::CompletionCallback& callback) {
+int AppCacheDiskCache::Init(net::CacheType cache_type,
+                            const base::FilePath& cache_directory,
+                            int cache_size,
+                            bool force,
+                            base::OnceClosure post_cleanup_callback,
+                            const net::CompletionCallback& callback) {
   DCHECK(!is_initializing_or_waiting_to_initialize() && !disk_cache_.get());
   is_disabled_ = false;
   create_backend_callback_ = new CreateBackendCallbackShim(this);
@@ -355,12 +350,9 @@
       cache_type,
       use_simple_cache_ ? net::CACHE_BACKEND_SIMPLE
                         : net::CACHE_BACKEND_DEFAULT,
-      cache_directory,
-      cache_size,
-      force,
-      cache_thread,
-      NULL,
+      cache_directory, cache_size, force, NULL,
       &(create_backend_callback_->backend_ptr_),
+      std::move(post_cleanup_callback),
       base::Bind(&CreateBackendCallbackShim::Callback,
                  create_backend_callback_));
   if (rv == net::ERR_IO_PENDING)
diff --git a/content/browser/appcache/appcache_disk_cache.h b/content/browser/appcache/appcache_disk_cache.h
index b5d67eb..876e8ec 100644
--- a/content/browser/appcache/appcache_disk_cache.h
+++ b/content/browser/appcache/appcache_disk_cache.h
@@ -11,15 +11,12 @@
 #include <set>
 #include <vector>
 
+#include "base/callback_forward.h"
 #include "base/memory/ref_counted.h"
 #include "content/browser/appcache/appcache_response.h"
 #include "content/common/content_export.h"
 #include "net/disk_cache/disk_cache.h"
 
-namespace base {
-class SingleThreadTaskRunner;
-}  // namespace base
-
 namespace content {
 
 // An implementation of AppCacheDiskCacheInterface that
@@ -31,12 +28,11 @@
   ~AppCacheDiskCache() override;
 
   // Initializes the object to use disk backed storage.
-  int InitWithDiskBackend(
-      const base::FilePath& disk_cache_directory,
-      int disk_cache_size,
-      bool force,
-      const scoped_refptr<base::SingleThreadTaskRunner>& cache_thread,
-      const net::CompletionCallback& callback);
+  int InitWithDiskBackend(const base::FilePath& disk_cache_directory,
+                          int disk_cache_size,
+                          bool force,
+                          base::OnceClosure post_cleanup_callback,
+                          const net::CompletionCallback& callback);
 
   // Initializes the object to use memory only storage.
   // This is used for Chrome's incognito browsing.
@@ -107,7 +103,7 @@
            const base::FilePath& directory,
            int cache_size,
            bool force,
-           const scoped_refptr<base::SingleThreadTaskRunner>& cache_thread,
+           base::OnceClosure post_cleanup_callback,
            const net::CompletionCallback& callback);
   void OnCreateBackendComplete(int rv);
   void AddOpenEntry(EntryImpl* entry) { open_entries_.insert(entry); }
diff --git a/content/browser/appcache/appcache_disk_cache_unittest.cc b/content/browser/appcache/appcache_disk_cache_unittest.cc
index 5241805..f8ef08c 100644
--- a/content/browser/appcache/appcache_disk_cache_unittest.cc
+++ b/content/browser/appcache/appcache_disk_cache_unittest.cc
@@ -9,9 +9,12 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "net/base/io_buffer.h"
 #include "net/base/net_errors.h"
+#include "net/base/test_completion_callback.h"
+#include "net/disk_cache/disk_cache.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace content {
@@ -21,31 +24,25 @@
   AppCacheDiskCacheTest() {}
 
   void SetUp() override {
-    // Use the current thread for the DiskCache's cache_thread.
-    message_loop_.reset(new base::MessageLoopForIO());
-    cache_thread_ = base::ThreadTaskRunnerHandle::Get();
     ASSERT_TRUE(directory_.CreateUniqueTempDir());
     completion_callback_ = base::Bind(
         &AppCacheDiskCacheTest::OnComplete,
         base::Unretained(this));
   }
 
-  void TearDown() override {
-    base::RunLoop().RunUntilIdle();
-    message_loop_.reset(NULL);
-  }
+  void TearDown() override { scoped_task_environment_.RunUntilIdle(); }
 
   void FlushCacheTasks() {
-    base::RunLoop().RunUntilIdle();
+    disk_cache::FlushCacheThreadForTesting();
+    scoped_task_environment_.RunUntilIdle();
   }
 
   void OnComplete(int err) {
     completion_results_.push_back(err);
   }
 
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
   base::ScopedTempDir directory_;
-  std::unique_ptr<base::MessageLoop> message_loop_;
-  scoped_refptr<base::SingleThreadTaskRunner> cache_thread_;
   net::CompletionCallback completion_callback_;
   std::vector<int> completion_results_;
 
@@ -60,7 +57,7 @@
   std::unique_ptr<AppCacheDiskCache> disk_cache(new AppCacheDiskCache);
   EXPECT_FALSE(disk_cache->is_disabled());
   disk_cache->InitWithDiskBackend(directory_.GetPath(), k10MBytes, false,
-                                  cache_thread_, completion_callback_);
+                                  base::OnceClosure(), completion_callback_);
   disk_cache->CreateEntry(1, &entry, completion_callback_);
   disk_cache->OpenEntry(2, &entry, completion_callback_);
   disk_cache->DoomEntry(3, completion_callback_);
@@ -91,7 +88,7 @@
   std::unique_ptr<AppCacheDiskCache> disk_cache(new AppCacheDiskCache);
   EXPECT_FALSE(disk_cache->is_disabled());
   disk_cache->InitWithDiskBackend(directory_.GetPath(), k10MBytes, false,
-                                  cache_thread_, completion_callback_);
+                                  base::OnceClosure(), completion_callback_);
   FlushCacheTasks();
   EXPECT_EQ(1u, completion_results_.size());
   EXPECT_EQ(net::OK, completion_results_[0]);
@@ -126,7 +123,7 @@
   std::unique_ptr<AppCacheDiskCache> disk_cache(new AppCacheDiskCache);
   EXPECT_FALSE(disk_cache->is_disabled());
   disk_cache->InitWithDiskBackend(directory_.GetPath(), k10MBytes, false,
-                                  cache_thread_, completion_callback_);
+                                  base::OnceClosure(), completion_callback_);
   FlushCacheTasks();
   EXPECT_EQ(1u, completion_results_.size());
   EXPECT_EQ(net::OK, completion_results_[0]);
@@ -182,4 +179,26 @@
   FlushCacheTasks();
 }
 
+TEST_F(AppCacheDiskCacheTest, CleanupCallback) {
+  // Test that things delete fine when we disable the cache and wait for
+  // the cleanup callback.
+
+  net::TestClosure cleanup_done;
+  net::TestCompletionCallback init_done;
+  std::unique_ptr<AppCacheDiskCache> disk_cache(new AppCacheDiskCache);
+  EXPECT_FALSE(disk_cache->is_disabled());
+  disk_cache->InitWithDiskBackend(directory_.GetPath(), k10MBytes, false,
+                                  cleanup_done.closure(), init_done.callback());
+  EXPECT_EQ(net::OK, init_done.WaitForResult());
+
+  disk_cache->Disable();
+  cleanup_done.WaitForResult();
+
+  // Ensure the directory can be deleted at this point.
+  EXPECT_TRUE(base::DirectoryExists(directory_.GetPath()));
+  EXPECT_FALSE(base::IsDirectoryEmpty(directory_.GetPath()));
+  EXPECT_TRUE(base::DeleteFile(directory_.GetPath(), true));
+  EXPECT_FALSE(base::DirectoryExists(directory_.GetPath()));
+}
+
 }  // namespace content
diff --git a/content/browser/appcache/appcache_service_impl.cc b/content/browser/appcache/appcache_service_impl.cc
index 9af861b..356dc48 100644
--- a/content/browser/appcache/appcache_service_impl.cc
+++ b/content/browser/appcache/appcache_service_impl.cc
@@ -431,14 +431,11 @@
   storage_.reset();
 }
 
-void AppCacheServiceImpl::Initialize(
-    const base::FilePath& cache_directory,
-    const scoped_refptr<base::SingleThreadTaskRunner>& cache_thread) {
+void AppCacheServiceImpl::Initialize(const base::FilePath& cache_directory) {
   DCHECK(!storage_.get());
   cache_directory_ = cache_directory;
-  cache_thread_ = cache_thread;
   AppCacheStorageImpl* storage = new AppCacheStorageImpl(this);
-  storage->Initialize(cache_directory, db_task_runner_, cache_thread);
+  storage->Initialize(cache_directory, db_task_runner_);
   storage_.reset(storage);
 }
 
@@ -480,7 +477,7 @@
   for (auto& observer : observers_)
     observer.OnServiceReinitialized(old_storage_ref.get());
 
-  Initialize(cache_directory_, cache_thread_);
+  Initialize(cache_directory_);
 }
 
 void AppCacheServiceImpl::GetAllAppCacheInfo(
diff --git a/content/browser/appcache/appcache_service_impl.h b/content/browser/appcache/appcache_service_impl.h
index f42e72a..e0ea217 100644
--- a/content/browser/appcache/appcache_service_impl.h
+++ b/content/browser/appcache/appcache_service_impl.h
@@ -26,7 +26,6 @@
 
 namespace base {
 class FilePath;
-class SingleThreadTaskRunner;
 }  // namespace base
 
 namespace net {
@@ -88,9 +87,7 @@
   explicit AppCacheServiceImpl(storage::QuotaManagerProxy* quota_manager_proxy);
   ~AppCacheServiceImpl() override;
 
-  void Initialize(
-      const base::FilePath& cache_directory,
-      const scoped_refptr<base::SingleThreadTaskRunner>& cache_thread);
+  void Initialize(const base::FilePath& cache_directory);
 
   void AddObserver(Observer* observer) {
     observers_.AddObserver(observer);
@@ -215,7 +212,6 @@
 
   base::FilePath cache_directory_;
   scoped_refptr<base::SequencedTaskRunner> db_task_runner_;
-  scoped_refptr<base::SingleThreadTaskRunner> cache_thread_;
   AppCachePolicy* appcache_policy_;
   AppCacheQuotaClient* quota_client_;
   AppCacheExecutableHandlerFactory* handler_factory_;
diff --git a/content/browser/appcache/appcache_storage_impl.cc b/content/browser/appcache/appcache_storage_impl.cc
index 6e8dac79..0601161 100644
--- a/content/browser/appcache/appcache_storage_impl.cc
+++ b/content/browser/appcache/appcache_storage_impl.cc
@@ -1415,8 +1415,9 @@
       last_deletable_response_rowid_(0),
       database_(NULL),
       is_disabled_(false),
-      weak_factory_(this) {
-}
+      delete_and_start_over_pending_(false),
+      expecting_cleanup_complete_on_disable_(false),
+      weak_factory_(this) {}
 
 AppCacheStorageImpl::~AppCacheStorageImpl() {
   for (auto* task : pending_quota_queries_)
@@ -1437,8 +1438,7 @@
 
 void AppCacheStorageImpl::Initialize(
     const base::FilePath& cache_directory,
-    const scoped_refptr<base::SequencedTaskRunner>& db_task_runner,
-    const scoped_refptr<base::SingleThreadTaskRunner>& cache_thread) {
+    const scoped_refptr<base::SequencedTaskRunner>& db_task_runner) {
   cache_directory_ = cache_directory;
   is_incognito_ = cache_directory_.empty();
 
@@ -1448,7 +1448,6 @@
   database_ = new AppCacheDatabase(db_file_path);
 
   db_task_runner_ = db_task_runner;
-  cache_thread_ = cache_thread;
 
   scoped_refptr<InitTask> task(new InitTask(this));
   task->Schedule();
@@ -1914,11 +1913,12 @@
           base::Bind(&AppCacheStorageImpl::OnDiskCacheInitialized,
                      base::Unretained(this)));
     } else {
+      expecting_cleanup_complete_on_disable_ = true;
       rv = disk_cache_->InitWithDiskBackend(
-          cache_directory_.Append(kDiskCacheDirectoryName),
-          kMaxDiskCacheSize,
+          cache_directory_.Append(kDiskCacheDirectoryName), kMaxDiskCacheSize,
           false,
-          cache_thread_.get(),
+          base::BindOnce(&AppCacheStorageImpl::OnDiskCacheCleanupComplete,
+                         weak_factory_.GetWeakPtr()),
           base::Bind(&AppCacheStorageImpl::OnDiskCacheInitialized,
                      base::Unretained(this)));
     }
@@ -1947,23 +1947,31 @@
   DCHECK(is_disabled_);
   if (!is_incognito_) {
     VLOG(1) << "Deleting existing appcache data and starting over.";
+
     // We can have tasks in flight to close file handles on both the db
     // and cache threads, we need to allow those tasks to cycle thru
-    // prior to deleting the files and calling reinit.
-    cache_thread_->PostTaskAndReply(
-        FROM_HERE,
-        base::Bind(&base::DoNothing),
-        base::Bind(&AppCacheStorageImpl::DeleteAndStartOverPart2,
-                   weak_factory_.GetWeakPtr()));
+    // prior to deleting the files and calling reinit.  We will know that the
+    // cache ones will be finished once we get into OnDiskCacheCleanupComplete,
+    // so let that known to synchronize with the DB thread.
+    delete_and_start_over_pending_ = true;
+
+    // Won't get a callback about cleanup being done, so call it ourselves.
+    if (!expecting_cleanup_complete_on_disable_)
+      OnDiskCacheCleanupComplete();
   }
 }
 
-void AppCacheStorageImpl::DeleteAndStartOverPart2() {
-  db_task_runner_->PostTaskAndReply(
-      FROM_HERE,
-      base::Bind(base::IgnoreResult(&base::DeleteFile), cache_directory_, true),
-      base::Bind(&AppCacheStorageImpl::CallScheduleReinitialize,
-                 weak_factory_.GetWeakPtr()));
+void AppCacheStorageImpl::OnDiskCacheCleanupComplete() {
+  expecting_cleanup_complete_on_disable_ = false;
+  if (delete_and_start_over_pending_) {
+    delete_and_start_over_pending_ = false;
+    db_task_runner_->PostTaskAndReply(
+        FROM_HERE,
+        base::Bind(base::IgnoreResult(&base::DeleteFile), cache_directory_,
+                   true),
+        base::Bind(&AppCacheStorageImpl::CallScheduleReinitialize,
+                   weak_factory_.GetWeakPtr()));
+  }
 }
 
 void AppCacheStorageImpl::CallScheduleReinitialize() {
diff --git a/content/browser/appcache/appcache_storage_impl.h b/content/browser/appcache/appcache_storage_impl.h
index cde701e1..c8d0629 100644
--- a/content/browser/appcache/appcache_storage_impl.h
+++ b/content/browser/appcache/appcache_storage_impl.h
@@ -24,7 +24,7 @@
 #include "content/common/content_export.h"
 
 namespace base {
-class SingleThreadTaskRunner;
+class SequencedTaskRunner;
 }  // namespace base
 
 namespace content {
@@ -38,8 +38,7 @@
 
   void Initialize(
       const base::FilePath& cache_directory,
-      const scoped_refptr<base::SequencedTaskRunner>& db_task_runner,
-      const scoped_refptr<base::SingleThreadTaskRunner>& cache_thread);
+      const scoped_refptr<base::SequencedTaskRunner>& db_task_runner);
   void Disable();
   bool is_disabled() const { return is_disabled_; }
 
@@ -121,8 +120,9 @@
   void DeleteOneResponse();
   void OnDeletedOneResponse(int rv);
   void OnDiskCacheInitialized(int rv);
+  void OnDiskCacheCleanupComplete();
+
   void DeleteAndStartOver();
-  void DeleteAndStartOverPart2();
   void CallScheduleReinitialize();
   void LazilyCommitLastAccessTimes();
   void OnLazyCommitTimer();
@@ -154,10 +154,8 @@
   bool is_incognito_;
 
   // This class operates primarily on the IO thread, but schedules
-  // its DatabaseTasks on the db thread. Separately, the disk_cache uses
-  // the cache thread.
+  // its DatabaseTasks on the db thread.
   scoped_refptr<base::SequencedTaskRunner> db_task_runner_;
-  scoped_refptr<base::SingleThreadTaskRunner> cache_thread_;
 
   // Structures to keep track of DatabaseTasks that are in-flight.
   DatabaseTaskQueue scheduled_database_tasks_;
@@ -180,6 +178,14 @@
   // disk cache and cannot continue.
   bool is_disabled_;
 
+  // This is set when we want to use the post-cleanup callback to initiate
+  // directory deletion.
+  bool delete_and_start_over_pending_;
+
+  // This is set when we know that a call to Disable() will result in
+  // OnDiskCacheCleanupComplete() eventually called.
+  bool expecting_cleanup_complete_on_disable_;
+
   std::unique_ptr<AppCacheDiskCache> disk_cache_;
   base::OneShotTimer lazy_commit_timer_;
 
diff --git a/content/browser/appcache/appcache_storage_impl_unittest.cc b/content/browser/appcache/appcache_storage_impl_unittest.cc
index 8a33138..f9a93934 100644
--- a/content/browser/appcache/appcache_storage_impl_unittest.cc
+++ b/content/browser/appcache/appcache_storage_impl_unittest.cc
@@ -419,7 +419,7 @@
   void SetUpTest() {
     DCHECK(io_thread->task_runner()->BelongsToCurrentThread());
     service_.reset(new AppCacheServiceImpl(nullptr));
-    service_->Initialize(base::FilePath(), background_thread->task_runner());
+    service_->Initialize(base::FilePath());
     mock_quota_manager_proxy_ = new MockQuotaManagerProxy();
     service_->quota_manager_proxy_ = mock_quota_manager_proxy_;
     delegate_.reset(new MockStorageDelegate(this));
@@ -1739,8 +1739,7 @@
     // Recreate the service to point at the db and corruption on disk.
     service_.reset(new AppCacheServiceImpl(NULL));
     service_->set_request_context(io_thread->request_context());
-    service_->Initialize(temp_directory_.GetPath(),
-                         background_thread->task_runner());
+    service_->Initialize(temp_directory_.GetPath());
     mock_quota_manager_proxy_ = new MockQuotaManagerProxy();
     service_->quota_manager_proxy_ = mock_quota_manager_proxy_;
     delegate_.reset(new MockStorageDelegate(this));
diff --git a/content/browser/appcache/appcache_update_url_loader_request.cc b/content/browser/appcache/appcache_update_url_loader_request.cc
index 590bd6f..3d7d8d2 100644
--- a/content/browser/appcache/appcache_update_url_loader_request.cc
+++ b/content/browser/appcache/appcache_update_url_loader_request.cc
@@ -40,7 +40,7 @@
 }
 
 std::string AppCacheUpdateJob::UpdateURLLoaderRequest::GetMimeType() const {
-  return response_->mime_type;
+  return response_.mime_type;
 }
 
 void AppCacheUpdateJob::UpdateURLLoaderRequest::SetSiteForCookies(
@@ -55,12 +55,12 @@
 
 net::HttpResponseHeaders*
 AppCacheUpdateJob::UpdateURLLoaderRequest::GetResponseHeaders() const {
-  return response_->headers.get();
+  return response_.headers.get();
 }
 
 int AppCacheUpdateJob::UpdateURLLoaderRequest::GetResponseCode() const {
-  if (response_->headers)
-    return response_->headers->response_code();
+  if (response_.headers)
+    return response_.headers->response_code();
   return 0;
 }
 
@@ -82,7 +82,7 @@
   url_loader_ = nullptr;
   handle_watcher_.Cancel();
   handle_.reset();
-  response_.reset(nullptr);
+  response_ = ResourceResponseHead();
   http_response_info_.reset(nullptr);
   read_requested_ = false;
   return 0;
@@ -92,8 +92,7 @@
     const ResourceResponseHead& response_head,
     const base::Optional<net::SSLInfo>& ssl_info,
     mojom::DownloadedTempFilePtr downloaded_file) {
-  response_.reset(new ResourceResponseHead());
-  *response_ = response_head;
+  response_ = response_head;
 
   // TODO(ananta/michaeln)
   // Populate other fields in the HttpResponseInfo class. It would be good to
@@ -116,7 +115,7 @@
 void AppCacheUpdateJob::UpdateURLLoaderRequest::OnReceiveRedirect(
     const net::RedirectInfo& redirect_info,
     const ResourceResponseHead& response_head) {
-  *response_ = response_head;
+  response_ = response_head;
   fetcher_->OnReceivedRedirect(redirect_info);
 }
 
@@ -191,8 +190,8 @@
   }
 
   uint32_t available = 0;
-  MojoResult result =
-      MojoToNetPendingBuffer::BeginRead(&handle_, &pending_read_, &available);
+  MojoResult result = network::MojoToNetPendingBuffer::BeginRead(
+      &handle_, &pending_read_, &available);
   DCHECK_NE(result, MOJO_RESULT_BUSY);
 
   if (result == MOJO_RESULT_SHOULD_WAIT) {
@@ -215,8 +214,8 @@
 
   int bytes_to_be_read = std::min<int>(buffer_size_, available);
 
-  scoped_refptr<MojoToNetIOBuffer> buffer =
-      new MojoToNetIOBuffer(pending_read_.get(), bytes_to_be_read);
+  auto buffer = base::MakeRefCounted<network::MojoToNetIOBuffer>(
+      pending_read_.get(), bytes_to_be_read);
 
   fetcher_->OnReadCompleted(buffer.get(), bytes_to_be_read);
 }
diff --git a/content/browser/appcache/appcache_update_url_loader_request.h b/content/browser/appcache/appcache_update_url_loader_request.h
index 185f0ff..ebe478c 100644
--- a/content/browser/appcache/appcache_update_url_loader_request.h
+++ b/content/browser/appcache/appcache_update_url_loader_request.h
@@ -11,12 +11,13 @@
 
 #include "base/macros.h"
 #include "content/browser/appcache/appcache_update_request_base.h"
-#include "content/common/net_adapters.h"
 #include "content/public/common/resource_request.h"
+#include "content/public/common/resource_response.h"
 #include "content/public/common/url_loader.mojom.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/system/simple_watcher.h"
 #include "net/base/io_buffer.h"
+#include "services/network/public/cpp/net_adapters.h"
 
 namespace net {
 class HttpResponseInfo;
@@ -26,7 +27,6 @@
 
 class URLLoaderFactoryGetter;
 struct ResourceRequest;
-struct ResourceResponseHead;
 
 // URLLoaderClient subclass for the UpdateRequestBase class. Provides
 // functionality to update the AppCache using functionality provided by the
@@ -91,7 +91,7 @@
   scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter_;
 
   ResourceRequest request_;
-  std::unique_ptr<ResourceResponseHead> response_;
+  ResourceResponseHead response_;
   ResourceRequestCompletionStatus response_status_;
   // Response details.
   std::unique_ptr<net::HttpResponseInfo> http_response_info_;
@@ -114,7 +114,7 @@
   // Please look at the StartReading() function for details.
   bool read_requested_;
   // Adapter for transferring data from a mojo data pipe to net.
-  scoped_refptr<MojoToNetPendingBuffer> pending_read_;
+  scoped_refptr<network::MojoToNetPendingBuffer> pending_read_;
 
   DISALLOW_COPY_AND_ASSIGN(UpdateURLLoaderRequest);
 };
diff --git a/content/browser/appcache/appcache_url_loader_job.cc b/content/browser/appcache/appcache_url_loader_job.cc
index 5679b7a..0e578654 100644
--- a/content/browser/appcache/appcache_url_loader_job.cc
+++ b/content/browser/appcache/appcache_url_loader_job.cc
@@ -9,9 +9,9 @@
 #include "content/browser/appcache/appcache_subresource_url_factory.h"
 #include "content/browser/appcache/appcache_url_loader_request.h"
 #include "content/browser/url_loader_factory_getter.h"
-#include "content/common/net_adapters.h"
 #include "content/public/common/resource_type.h"
 #include "net/http/http_status_code.h"
+#include "services/network/public/cpp/net_adapters.h"
 
 namespace content {
 
@@ -393,7 +393,7 @@
 
   uint32_t num_bytes;
   // TODO: we should use the abstractions in MojoAsyncResourceHandler.
-  MojoResult result = NetToMojoPendingBuffer::BeginWrite(
+  MojoResult result = network::NetToMojoPendingBuffer::BeginWrite(
       &response_body_stream_, &pending_write_, &num_bytes);
   if (result == MOJO_RESULT_SHOULD_WAIT) {
     // The pipe is full. We need to wait for it to have more space.
@@ -410,8 +410,8 @@
   }
 
   CHECK_GT(static_cast<uint32_t>(std::numeric_limits<int>::max()), num_bytes);
-  scoped_refptr<NetToMojoIOBuffer> buffer =
-      new NetToMojoIOBuffer(pending_write_.get());
+  auto buffer =
+      base::MakeRefCounted<network::NetToMojoIOBuffer>(pending_write_.get());
 
   reader_->ReadData(
       buffer.get(), info_->response_data_size(),
diff --git a/content/browser/appcache/appcache_url_loader_job.h b/content/browser/appcache/appcache_url_loader_job.h
index a1328c9..d696045 100644
--- a/content/browser/appcache/appcache_url_loader_job.h
+++ b/content/browser/appcache/appcache_url_loader_job.h
@@ -22,11 +22,14 @@
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/system/data_pipe.h"
 
+namespace network {
+class NetToMojoPendingBuffer;
+}
+
 namespace content {
 
 class AppCacheRequest;
 class AppCacheURLLoaderRequest;
-class NetToMojoPendingBuffer;
 class URLLoaderFactoryGetter;
 
 // Holds information about the subresource load request like the routing id,
@@ -183,7 +186,7 @@
   // mojo data pipe entities.
   mojo::ScopedDataPipeProducerHandle response_body_stream_;
 
-  scoped_refptr<NetToMojoPendingBuffer> pending_write_;
+  scoped_refptr<network::NetToMojoPendingBuffer> pending_write_;
 
   mojo::SimpleWatcher writable_handle_watcher_;
 
diff --git a/content/browser/appcache/chrome_appcache_service.cc b/content/browser/appcache/chrome_appcache_service.cc
index cdceb0a..7d2fab2 100644
--- a/content/browser/appcache/chrome_appcache_service.cc
+++ b/content/browser/appcache/chrome_appcache_service.cc
@@ -44,8 +44,7 @@
     set_request_context(request_context_getter->GetURLRequestContext());
 
   // Init our base class.
-  Initialize(cache_path_,
-             BrowserThread::GetTaskRunnerForThread(BrowserThread::CACHE).get());
+  Initialize(cache_path_);
   set_appcache_policy(this);
   set_special_storage_policy(special_storage_policy.get());
 }
diff --git a/content/browser/background_sync/background_sync_manager_unittest.cc b/content/browser/background_sync/background_sync_manager_unittest.cc
index 47d6096..b74b824 100644
--- a/content/browser/background_sync/background_sync_manager_unittest.cc
+++ b/content/browser/background_sync/background_sync_manager_unittest.cc
@@ -36,6 +36,7 @@
 #include "content/public/test/background_sync_test_util.h"
 #include "content/public/test/test_browser_context.h"
 #include "content/public/test/test_browser_thread_bundle.h"
+#include "content/public/test/test_utils.h"
 #include "content/test/mock_background_sync_controller.h"
 #include "content/test/mock_permission_manager.h"
 #include "content/test/test_background_sync_manager.h"
@@ -406,7 +407,7 @@
 
   void DeleteServiceWorkerAndStartOver() {
     helper_->context()->ScheduleDeleteAndStartOver();
-    base::RunLoop().RunUntilIdle();
+    content::RunAllBlockingPoolTasksUntilIdle();
   }
 
   int MaxTagLength() const { return BackgroundSyncManager::kMaxTagLength; }
diff --git a/content/browser/blob_storage/blob_url_loader_factory.cc b/content/browser/blob_storage/blob_url_loader_factory.cc
index a9406a33..85afc946 100644
--- a/content/browser/blob_storage/blob_url_loader_factory.cc
+++ b/content/browser/blob_storage/blob_url_loader_factory.cc
@@ -5,14 +5,15 @@
 #include "content/browser/blob_storage/blob_url_loader_factory.h"
 
 #include <stddef.h>
+#include <utility>
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/weak_ptr.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "content/browser/blob_storage/chrome_blob_storage_context.h"
 #include "content/browser/storage_partition_impl.h"
-#include "content/common/net_adapters.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/url_loader.mojom.h"
 #include "mojo/public/cpp/system/simple_watcher.h"
@@ -26,6 +27,7 @@
 #include "storage/browser/blob/blob_reader.h"
 #include "storage/browser/blob/blob_storage_context.h"
 #include "storage/browser/blob/blob_url_request_job.h"
+#include "storage/browser/blob/mojo_blob_reader.h"
 #include "storage/browser/fileapi/file_system_context.h"
 
 namespace content {
@@ -33,10 +35,12 @@
 namespace {
 constexpr size_t kDefaultAllocationSize = 512 * 1024;
 
-// This class handles a request for a blob:// url. It self-destructs (see
-// DeleteIfNeeded) when it has finished responding.
+// This class handles a request for a blob:// url. It self-destructs (directly,
+// or after passing ownership to storage::MojoBlobReader at the end of the Start
+// method) when it has finished responding.
 // Note: some of this code is duplicated from storage::BlobURLRequestJob.
-class BlobURLLoader : public mojom::URLLoader {
+class BlobURLLoader : public storage::MojoBlobReader::Delegate,
+                      public mojom::URLLoader {
  public:
   BlobURLLoader(mojom::URLLoaderRequest url_loader_request,
                 const ResourceRequest& request,
@@ -46,37 +50,29 @@
       : binding_(this, std::move(url_loader_request)),
         client_(std::move(client)),
         blob_handle_(std::move(blob_handle)),
-        writable_handle_watcher_(FROM_HERE,
-                                 mojo::SimpleWatcher::ArmingPolicy::MANUAL),
-        peer_closed_handle_watcher_(FROM_HERE,
-                                    mojo::SimpleWatcher::ArmingPolicy::MANUAL),
         weak_factory_(this) {
     DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
     // PostTask since it might destruct.
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
         base::Bind(&BlobURLLoader::Start, weak_factory_.GetWeakPtr(), request,
                    make_scoped_refptr(file_system_context)));
   }
 
+ private:
   void Start(const ResourceRequest& request,
              scoped_refptr<storage::FileSystemContext> file_system_context) {
     if (!blob_handle_) {
-      NotifyCompleted(net::ERR_FILE_NOT_FOUND);
+      OnComplete(net::ERR_FILE_NOT_FOUND, 0);
+      delete this;
       return;
     }
 
-    blob_reader_ = blob_handle_->CreateReader(file_system_context.get());
-
     // We only support GET request per the spec.
     if (request.method != "GET") {
-      NotifyCompleted(net::ERR_METHOD_NOT_SUPPORTED);
-      return;
-    }
-
-    if (blob_reader_->net_error()) {
-      NotifyCompleted(blob_reader_->net_error());
+      OnComplete(net::ERR_METHOD_NOT_SUPPORTED, 0);
+      delete this;
       return;
     }
 
@@ -95,112 +91,65 @@
           // We don't support multiple range requests in one single URL request,
           // because we need to do multipart encoding here.
           // TODO(jianli): Support multipart byte range requests.
-          NotifyCompleted(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE);
+          OnComplete(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE, 0);
+          delete this;
+          return;
         }
       }
     }
 
-    storage::BlobReader::Status size_status =
-        blob_reader_->CalculateSize(base::Bind(&BlobURLLoader::DidCalculateSize,
-                                               weak_factory_.GetWeakPtr()));
-    switch (size_status) {
-      case storage::BlobReader::Status::NET_ERROR:
-        NotifyCompleted(blob_reader_->net_error());
-        return;
-      case storage::BlobReader::Status::IO_PENDING:
-        return;
-      case storage::BlobReader::Status::DONE:
-        DidCalculateSize(net::OK);
-        return;
-    }
-
-    NOTREACHED();
+    storage::MojoBlobReader::Create(file_system_context.get(),
+                                    blob_handle_.get(), byte_range_,
+                                    base::WrapUnique(this));
   }
 
-  ~BlobURLLoader() override {}
-
- private:
   // mojom::URLLoader implementation:
   void FollowRedirect() override { NOTREACHED(); }
 
   void SetPriority(net::RequestPriority priority,
                    int32_t intra_priority_value) override {}
 
-  // Notifies the client that the request completed. Takes care of deleting this
-  // object now if possible (i.e. no outstanding data pipe), otherwise this
-  // object will be deleted when the data pipe is closed.
-  void NotifyCompleted(int error_code) {
-    if (error_code != net::OK && !sent_headers_) {
-      net::HttpStatusCode status_code =
-          storage::BlobURLRequestJob::NetErrorToHttpStatusCode(error_code);
-      ResourceResponseHead response;
-      response.headers = storage::BlobURLRequestJob::GenerateHeaders(
-          status_code, nullptr, nullptr, nullptr, nullptr);
-      client_->OnReceiveResponse(response, base::nullopt, nullptr);
-    }
-    ResourceRequestCompletionStatus request_complete_data;
-    // TODO(kinuko): We should probably set the error_code here,
-    // while it makes existing tests fail. crbug.com/732750
-    request_complete_data.completion_time = base::TimeTicks::Now();
-    request_complete_data.encoded_body_length = total_written_bytes_;
-    request_complete_data.decoded_body_length = total_written_bytes_;
-    client_->OnComplete(request_complete_data);
-
-    DeleteIfNeeded();
+  // storage::MojoBlobReader::Delegate implementation:
+  mojo::ScopedDataPipeProducerHandle PassDataPipe() override {
+    mojo::DataPipe data_pipe(kDefaultAllocationSize);
+    response_body_consumer_handle_ = std::move(data_pipe.consumer_handle);
+    return std::move(data_pipe.producer_handle);
   }
 
-  void DidCalculateSize(int result) {
-    if (result != net::OK) {
-      NotifyCompleted(result);
-      return;
-    }
-
-    // Apply the range requirement.
-    if (!byte_range_.ComputeBounds(blob_reader_->total_size())) {
-      NotifyCompleted(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE);
-      return;
-    }
-
-    DCHECK_LE(byte_range_.first_byte_position(),
-              byte_range_.last_byte_position() + 1);
-    uint64_t length =
-        base::checked_cast<uint64_t>(byte_range_.last_byte_position() -
-                                     byte_range_.first_byte_position() + 1);
-
-    if (byte_range_set_)
-      blob_reader_->SetReadRange(byte_range_.first_byte_position(), length);
+  RequestSideData DidCalculateSize(uint64_t total_size,
+                                   uint64_t content_size) override {
+    total_size_ = total_size;
+    bool result = byte_range_.ComputeBounds(total_size);
+    DCHECK(result);
 
     net::HttpStatusCode status_code = net::HTTP_OK;
     if (byte_range_set_ && byte_range_.IsValid()) {
       status_code = net::HTTP_PARTIAL_CONTENT;
     } else {
+      DCHECK_EQ(total_size, content_size);
       // TODO(horo): When the requester doesn't need the side data
       // (ex:FileReader) we should skip reading the side data.
-      if (blob_reader_->has_side_data() &&
-          blob_reader_->ReadSideData(base::Bind(&BlobURLLoader::DidReadMetadata,
-                                                weak_factory_.GetWeakPtr())) ==
-              storage::BlobReader::Status::IO_PENDING) {
-        return;
-      }
+      return REQUEST_SIDE_DATA;
     }
 
-    HeadersCompleted(status_code);
+    HeadersCompleted(status_code, content_size, nullptr);
+    return DONT_REQUEST_SIDE_DATA;
   }
 
-  void DidReadMetadata(storage::BlobReader::Status result) {
-    if (result != storage::BlobReader::Status::DONE) {
-      NotifyCompleted(blob_reader_->net_error());
-      return;
-    }
-    HeadersCompleted(net::HTTP_OK);
+  void DidReadSideData(net::IOBufferWithSize* data) override {
+    HeadersCompleted(net::HTTP_OK, total_size_, data);
   }
 
-  void HeadersCompleted(net::HttpStatusCode status_code) {
+  void HeadersCompleted(net::HttpStatusCode status_code,
+                        uint64_t content_size,
+                        net::IOBufferWithSize* metadata) {
     ResourceResponseHead response;
     response.content_length = 0;
+    if (status_code == net::HTTP_OK || status_code == net::HTTP_PARTIAL_CONTENT)
+      response.content_length = content_size;
     response.headers = storage::BlobURLRequestJob::GenerateHeaders(
-        status_code, blob_handle_.get(), blob_reader_.get(), &byte_range_,
-        &response.content_length);
+        status_code, blob_handle_.get(), &byte_range_, total_size_,
+        content_size);
 
     std::string mime_type;
     response.headers->GetMimeType(&mime_type);
@@ -214,112 +163,38 @@
     client_->OnReceiveResponse(response, base::nullopt, nullptr);
     sent_headers_ = true;
 
-    net::IOBufferWithSize* metadata = blob_reader_->side_data();
     if (metadata) {
       const uint8_t* data = reinterpret_cast<const uint8_t*>(metadata->data());
       client_->OnReceiveCachedMetadata(
           std::vector<uint8_t>(data, data + metadata->size()));
     }
-
-    mojo::DataPipe data_pipe(kDefaultAllocationSize);
-    response_body_stream_ = std::move(data_pipe.producer_handle);
-    response_body_consumer_handle_ = std::move(data_pipe.consumer_handle);
-    peer_closed_handle_watcher_.Watch(
-        response_body_stream_.get(), MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-        base::Bind(&BlobURLLoader::OnResponseBodyStreamClosed,
-                   base::Unretained(this)));
-    peer_closed_handle_watcher_.ArmOrNotify();
-
-    writable_handle_watcher_.Watch(
-        response_body_stream_.get(), MOJO_HANDLE_SIGNAL_WRITABLE,
-        base::Bind(&BlobURLLoader::OnResponseBodyStreamReady,
-                   base::Unretained(this)));
-
-    // Start reading...
-    ReadMore();
   }
 
-  void ReadMore() {
-    DCHECK(!pending_write_.get());
-
-    uint32_t num_bytes;
-    // TODO: we should use the abstractions in MojoAsyncResourceHandler.
-    MojoResult result = NetToMojoPendingBuffer::BeginWrite(
-        &response_body_stream_, &pending_write_, &num_bytes);
-    if (result == MOJO_RESULT_SHOULD_WAIT) {
-      // The pipe is full. We need to wait for it to have more space.
-      writable_handle_watcher_.ArmOrNotify();
-      return;
-    } else if (result != MOJO_RESULT_OK) {
-      // The response body stream is in a bad state. Bail.
-      writable_handle_watcher_.Cancel();
-      response_body_stream_.reset();
-      NotifyCompleted(net::ERR_UNEXPECTED);
-      return;
-    }
-
-    CHECK_GT(static_cast<uint32_t>(std::numeric_limits<int>::max()), num_bytes);
-    scoped_refptr<net::IOBuffer> buf(
-        new NetToMojoIOBuffer(pending_write_.get()));
-    int bytes_read;
-    storage::BlobReader::Status read_status = blob_reader_->Read(
-        buf.get(), static_cast<int>(num_bytes), &bytes_read,
-        base::Bind(&BlobURLLoader::DidRead, weak_factory_.GetWeakPtr(), false));
-    switch (read_status) {
-      case storage::BlobReader::Status::NET_ERROR:
-        NotifyCompleted(blob_reader_->net_error());
-        return;
-      case storage::BlobReader::Status::IO_PENDING:
-        // Wait for DidRead.
-        return;
-      case storage::BlobReader::Status::DONE:
-        if (bytes_read > 0) {
-          DidRead(true, bytes_read);
-        } else {
-          writable_handle_watcher_.Cancel();
-          pending_write_->Complete(0);
-          pending_write_ = nullptr;  // This closes the data pipe.
-          NotifyCompleted(net::OK);
-          return;
-        }
-    }
-  }
-
-  void DidRead(bool completed_synchronously, int num_bytes) {
+  void DidRead(int num_bytes) override {
     if (response_body_consumer_handle_.is_valid()) {
       // Send the data pipe on the first OnReadCompleted call.
       client_->OnStartLoadingResponseBody(
           std::move(response_body_consumer_handle_));
     }
-    response_body_stream_ = pending_write_->Complete(num_bytes);
-    total_written_bytes_ += num_bytes;
-    pending_write_ = nullptr;
-    if (completed_synchronously) {
-      base::ThreadTaskRunnerHandle::Get()->PostTask(
-          FROM_HERE,
-          base::Bind(&BlobURLLoader::ReadMore, weak_factory_.GetWeakPtr()));
-    } else {
-      ReadMore();
+  }
+
+  void OnComplete(net::Error error_code,
+                  uint64_t total_written_bytes) override {
+    if (error_code != net::OK && !sent_headers_) {
+      net::HttpStatusCode status_code =
+          storage::BlobURLRequestJob::NetErrorToHttpStatusCode(error_code);
+      ResourceResponseHead response;
+      response.headers = storage::BlobURLRequestJob::GenerateHeaders(
+          status_code, nullptr, nullptr, 0, 0);
+      client_->OnReceiveResponse(response, base::nullopt, nullptr);
     }
-  }
-
-  void OnResponseBodyStreamClosed(MojoResult result) {
-    response_body_stream_.reset();
-    pending_write_ = nullptr;
-    DeleteIfNeeded();
-  }
-
-  void OnResponseBodyStreamReady(MojoResult result) {
-    // TODO: Handle a bad |result| value.
-    DCHECK_EQ(result, MOJO_RESULT_OK);
-    ReadMore();
-  }
-
-  void DeleteIfNeeded() {
-    bool has_data_pipe =
-        pending_write_.get() || response_body_stream_.is_valid();
-    if (!has_data_pipe)
-      delete this;
+    ResourceRequestCompletionStatus request_complete_data;
+    // TODO(kinuko): We should probably set the error_code here,
+    // while it makes existing tests fail. crbug.com/732750
+    request_complete_data.completion_time = base::TimeTicks::Now();
+    request_complete_data.encoded_body_length = total_written_bytes;
+    request_complete_data.decoded_body_length = total_written_bytes;
+    client_->OnComplete(request_complete_data);
   }
 
   mojo::Binding<mojom::URLLoader> binding_;
@@ -328,18 +203,11 @@
   bool byte_range_set_ = false;
   net::HttpByteRange byte_range_;
 
+  uint64_t total_size_ = 0;
   bool sent_headers_ = false;
 
   std::unique_ptr<storage::BlobDataHandle> blob_handle_;
-  std::unique_ptr<storage::BlobReader> blob_reader_;
-
-  // TODO(jam): share with URLLoaderImpl
-  mojo::ScopedDataPipeProducerHandle response_body_stream_;
   mojo::ScopedDataPipeConsumerHandle response_body_consumer_handle_;
-  scoped_refptr<NetToMojoPendingBuffer> pending_write_;
-  mojo::SimpleWatcher writable_handle_watcher_;
-  mojo::SimpleWatcher peer_closed_handle_watcher_;
-  int64_t total_written_bytes_ = 0;
 
   base::WeakPtrFactory<BlobURLLoader> weak_factory_;
 
diff --git a/content/browser/browser_associated_interface_unittest.cc b/content/browser/browser_associated_interface_unittest.cc
index c18a79d..8b315e3 100644
--- a/content/browser/browser_associated_interface_unittest.cc
+++ b/content/browser/browser_associated_interface_unittest.cc
@@ -95,7 +95,7 @@
   void OnFilterRemoved() override {
     // Check that the bindings are cleared by
     // BrowserAssociatedInterface::ClearBindings() callbacks.
-    EXPECT_FALSE(internal_state_->bindings_.get());
+    EXPECT_FALSE(internal_state_->bindings_.has_value());
   }
 
   // mojom::BrowserAssociatedInterfaceTestDriver:
diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc
index 0eed74e..e44dd5ab 100644
--- a/content/browser/browser_plugin/browser_plugin_guest.cc
+++ b/content/browser/browser_plugin/browser_plugin_guest.cc
@@ -62,15 +62,16 @@
 
 namespace {
 
-std::vector<ui::CompositionUnderline> ConvertToUiUnderline(
-    const std::vector<blink::WebCompositionUnderline>& underlines) {
-  std::vector<ui::CompositionUnderline> ui_underlines;
-  for (const auto& underline : underlines) {
-    ui_underlines.emplace_back(ui::CompositionUnderline(
-        underline.start_offset, underline.end_offset, underline.color,
-        underline.thick, underline.background_color));
+std::vector<ui::ImeTextSpan> ConvertToUiImeTextSpan(
+    const std::vector<blink::WebImeTextSpan>& ime_text_spans) {
+  std::vector<ui::ImeTextSpan> ui_ime_text_spans;
+  for (const auto& ime_text_span : ime_text_spans) {
+    ui_ime_text_spans.emplace_back(
+        ui::ImeTextSpan(ime_text_span.start_offset, ime_text_span.end_offset,
+                        ime_text_span.color, ime_text_span.thick,
+                        ime_text_span.background_color));
   }
-  return ui_underlines;
+  return ui_ime_text_spans;
 }
 };  // namespace
 
@@ -929,29 +930,30 @@
 void BrowserPluginGuest::OnImeSetComposition(
     int browser_plugin_instance_id,
     const BrowserPluginHostMsg_SetComposition_Params& params) {
-  std::vector<ui::CompositionUnderline> ui_underlines =
-      ConvertToUiUnderline(params.underlines);
+  std::vector<ui::ImeTextSpan> ui_ime_text_spans =
+      ConvertToUiImeTextSpan(params.ime_text_spans);
   GetWebContents()
       ->GetRenderViewHost()
       ->GetWidget()
       ->GetWidgetInputHandler()
-      ->ImeSetComposition(params.text, ui_underlines, params.replacement_range,
-                          params.selection_start, params.selection_end);
+      ->ImeSetComposition(params.text, ui_ime_text_spans,
+                          params.replacement_range, params.selection_start,
+                          params.selection_end);
 }
 
 void BrowserPluginGuest::OnImeCommitText(
     int browser_plugin_instance_id,
     const base::string16& text,
-    const std::vector<blink::WebCompositionUnderline>& underlines,
+    const std::vector<blink::WebImeTextSpan>& ime_text_spans,
     const gfx::Range& replacement_range,
     int relative_cursor_pos) {
-  std::vector<ui::CompositionUnderline> ui_underlines =
-      ConvertToUiUnderline(underlines);
+  std::vector<ui::ImeTextSpan> ui_ime_text_spans =
+      ConvertToUiImeTextSpan(ime_text_spans);
   GetWebContents()
       ->GetRenderViewHost()
       ->GetWidget()
       ->GetWidgetInputHandler()
-      ->ImeCommitText(text, ui_underlines, replacement_range,
+      ->ImeCommitText(text, ui_ime_text_spans, replacement_range,
                       relative_cursor_pos);
 }
 
diff --git a/content/browser/browser_plugin/browser_plugin_guest.h b/content/browser/browser_plugin/browser_plugin_guest.h
index 725b77d..ac97e22 100644
--- a/content/browser/browser_plugin/browser_plugin_guest.h
+++ b/content/browser/browser_plugin/browser_plugin_guest.h
@@ -38,8 +38,8 @@
 #include "third_party/WebKit/public/platform/WebDragOperation.h"
 #include "third_party/WebKit/public/platform/WebFocusType.h"
 #include "third_party/WebKit/public/platform/WebInputEvent.h"
-#include "third_party/WebKit/public/web/WebCompositionUnderline.h"
 #include "third_party/WebKit/public/web/WebDragStatus.h"
+#include "third_party/WebKit/public/web/WebImeTextSpan.h"
 #include "ui/base/ime/text_input_mode.h"
 #include "ui/base/ime/text_input_type.h"
 #include "ui/gfx/geometry/rect.h"
@@ -336,12 +336,11 @@
   void OnImeSetComposition(
       int instance_id,
       const BrowserPluginHostMsg_SetComposition_Params& params);
-  void OnImeCommitText(
-      int instance_id,
-      const base::string16& text,
-      const std::vector<blink::WebCompositionUnderline>& underlines,
-      const gfx::Range& replacement_range,
-      int relative_cursor_pos);
+  void OnImeCommitText(int instance_id,
+                       const base::string16& text,
+                       const std::vector<blink::WebImeTextSpan>& ime_text_spans,
+                       const gfx::Range& replacement_range,
+                       int relative_cursor_pos);
   void OnImeFinishComposingText(int instance_id, bool keep_selection);
   void OnExtendSelectionAndDelete(int instance_id, int before, int after);
   void OnImeCancelComposition();
diff --git a/content/browser/cache_storage/cache_storage_cache_unittest.cc b/content/browser/cache_storage/cache_storage_cache_unittest.cc
index 5802535..ca22403 100644
--- a/content/browser/cache_storage/cache_storage_cache_unittest.cc
+++ b/content/browser/cache_storage/cache_storage_cache_unittest.cc
@@ -1418,6 +1418,8 @@
   EXPECT_TRUE(TestResponseType(network::mojom::FetchResponseType::kDefault));
   EXPECT_TRUE(TestResponseType(network::mojom::FetchResponseType::kError));
   EXPECT_TRUE(TestResponseType(network::mojom::FetchResponseType::kOpaque));
+  EXPECT_TRUE(
+      TestResponseType(network::mojom::FetchResponseType::kOpaqueRedirect));
 }
 
 TEST_P(CacheStorageCacheTestP, WriteSideData) {
diff --git a/content/browser/devtools/BUILD.gn b/content/browser/devtools/BUILD.gn
index 1f3a739e..611d028 100644
--- a/content/browser/devtools/BUILD.gn
+++ b/content/browser/devtools/BUILD.gn
@@ -74,6 +74,8 @@
 
   # These are relative to $target_gen_dir.
   outputs = [
+    "protocol/browser.cc",
+    "protocol/browser.h",
     "protocol/dom.cc",
     "protocol/dom.h",
     "protocol/emulation.cc",
diff --git a/content/browser/devtools/browser_devtools_agent_host.cc b/content/browser/devtools/browser_devtools_agent_host.cc
index bb7a585..74d57201 100644
--- a/content/browser/devtools/browser_devtools_agent_host.cc
+++ b/content/browser/devtools/browser_devtools_agent_host.cc
@@ -9,6 +9,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/single_thread_task_runner.h"
 #include "content/browser/devtools/devtools_session.h"
+#include "content/browser/devtools/protocol/browser_handler.h"
 #include "content/browser/devtools/protocol/io_handler.h"
 #include "content/browser/devtools/protocol/memory_handler.h"
 #include "content/browser/devtools/protocol/protocol.h"
@@ -51,6 +52,7 @@
   if (only_discovery_)
     return;
 
+  session->AddHandler(base::WrapUnique(new protocol::BrowserHandler()));
   session->AddHandler(base::WrapUnique(new protocol::IOHandler(
       GetIOContext())));
   session->AddHandler(base::WrapUnique(new protocol::MemoryHandler()));
diff --git a/content/browser/devtools/protocol/browser_handler.cc b/content/browser/devtools/protocol/browser_handler.cc
new file mode 100644
index 0000000..b5fd5f4
--- /dev/null
+++ b/content/browser/devtools/protocol/browser_handler.cc
@@ -0,0 +1,38 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/devtools/protocol/browser_handler.h"
+
+#include "content/public/browser/devtools_agent_host.h"
+#include "content/public/common/content_client.h"
+#include "content/public/common/user_agent.h"
+#include "v8/include/v8-version-string.h"
+
+namespace content {
+namespace protocol {
+
+BrowserHandler::BrowserHandler()
+    : DevToolsDomainHandler(Browser::Metainfo::domainName) {}
+
+BrowserHandler::~BrowserHandler() {}
+
+void BrowserHandler::Wire(UberDispatcher* dispatcher) {
+  Browser::Dispatcher::wire(dispatcher, this);
+}
+
+Response BrowserHandler::GetVersion(std::string* protocol_version,
+                                    std::string* product,
+                                    std::string* revision,
+                                    std::string* user_agent,
+                                    std::string* js_version) {
+  *protocol_version = DevToolsAgentHost::GetProtocolVersion();
+  *revision = GetWebKitRevision();
+  *product = GetContentClient()->GetProduct();
+  *user_agent = GetContentClient()->GetUserAgent();
+  *js_version = V8_VERSION_STRING;
+  return Response::OK();
+}
+
+}  // namespace protocol
+}  // namespace content
diff --git a/content/browser/devtools/protocol/browser_handler.h b/content/browser/devtools/protocol/browser_handler.h
new file mode 100644
index 0000000..fe109fe
--- /dev/null
+++ b/content/browser/devtools/protocol/browser_handler.h
@@ -0,0 +1,37 @@
+// 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 CONTENT_BROWSER_DEVTOOLS_PROTOCOL_BROWSER_HANDLER_H_
+#define CONTENT_BROWSER_DEVTOOLS_PROTOCOL_BROWSER_HANDLER_H_
+
+#include "base/macros.h"
+#include "content/browser/devtools/protocol/browser.h"
+#include "content/browser/devtools/protocol/devtools_domain_handler.h"
+
+namespace content {
+
+namespace protocol {
+
+class BrowserHandler : public DevToolsDomainHandler, public Browser::Backend {
+ public:
+  BrowserHandler();
+  ~BrowserHandler() override;
+
+  void Wire(UberDispatcher* dispatcher) override;
+
+  // Protocol methods.
+  Response GetVersion(std::string* protocol_version,
+                      std::string* product,
+                      std::string* revision,
+                      std::string* user_agent,
+                      std::string* js_version) override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(BrowserHandler);
+};
+
+}  // namespace protocol
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_DEVTOOLS_PROTOCOL_BROWSER_HANDLER_H_
diff --git a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
index 9a526397..4d89cb2b 100644
--- a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
+++ b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
@@ -167,12 +167,6 @@
     return true;
   }
 
-  void ShowCertificateViewerInDevTools(
-      WebContents* web_contents,
-      scoped_refptr<net::X509Certificate> certificate) override {
-    last_shown_certificate_ = certificate;
-  }
-
   base::DictionaryValue* SendCommand(
       const std::string& method,
       std::unique_ptr<base::DictionaryValue> params) {
@@ -353,10 +347,6 @@
     return urls;
   }
 
-  const scoped_refptr<net::X509Certificate>& last_shown_certificate() {
-    return last_shown_certificate_;
-  }
-
   const scoped_refptr<net::X509Certificate>& ok_cert() { return ok_cert_; }
 
   const scoped_refptr<net::X509Certificate>& expired_cert() {
@@ -419,7 +409,6 @@
   std::unique_ptr<base::DictionaryValue> waiting_for_notification_params_;
   int waiting_for_command_result_id_;
   bool in_dispatch_;
-  scoped_refptr<net::X509Certificate> last_shown_certificate_;
   scoped_refptr<net::X509Certificate> ok_cert_;
   scoped_refptr<net::X509Certificate> expired_cert_;
   bool agent_host_can_close_;
@@ -586,17 +575,21 @@
 bool MatchesBitmap(const SkBitmap& expected_bmp,
                    const SkBitmap& actual_bmp,
                    const gfx::Rect& matching_mask,
+                   float device_scale_factor,
                    int error_limit) {
   // Number of pixels with an error
   int error_pixels_count = 0;
 
   gfx::Rect error_bounding_rect = gfx::Rect();
 
+  // Scale expectations along with the mask.
+  device_scale_factor = device_scale_factor ? device_scale_factor : 1;
+
   // Check that bitmaps have identical dimensions.
-  EXPECT_EQ(expected_bmp.width(), actual_bmp.width());
-  EXPECT_EQ(expected_bmp.height(), actual_bmp.height());
-  if (expected_bmp.width() != actual_bmp.width() ||
-      expected_bmp.height() != actual_bmp.height()) {
+  EXPECT_EQ(expected_bmp.width() * device_scale_factor, actual_bmp.width());
+  EXPECT_EQ(expected_bmp.height() * device_scale_factor, actual_bmp.height());
+  if (expected_bmp.width() * device_scale_factor != actual_bmp.width() ||
+      expected_bmp.height() * device_scale_factor != actual_bmp.height()) {
     return false;
   }
 
@@ -604,7 +597,8 @@
 
   for (int x = matching_mask.x(); x < matching_mask.right(); ++x) {
     for (int y = matching_mask.y(); y < matching_mask.bottom(); ++y) {
-      SkColor actual_color = actual_bmp.getColor(x, y);
+      SkColor actual_color =
+          actual_bmp.getColor(x * device_scale_factor, y * device_scale_factor);
       SkColor expected_color = expected_bmp.getColor(x, y);
       if (!ColorsMatchWithinLimit(actual_color, expected_color, error_limit)) {
         if (error_pixels_count < 10) {
@@ -632,13 +626,14 @@
   enum ScreenshotEncoding { ENCODING_PNG, ENCODING_JPEG };
   void CaptureScreenshotAndCompareTo(const SkBitmap& expected_bitmap,
                                      ScreenshotEncoding encoding,
-                                     bool fromSurface,
+                                     bool from_surface,
+                                     float device_scale_factor = 0,
                                      const gfx::RectF& clip = gfx::RectF(),
                                      float clip_scale = 0) {
     std::unique_ptr<base::DictionaryValue> params(new base::DictionaryValue());
     params->SetString("format", encoding == ENCODING_PNG ? "png" : "jpeg");
     params->SetInteger("quality", 100);
-    params->SetBoolean("fromSurface", fromSurface);
+    params->SetBoolean("fromSurface", from_surface);
     if (clip_scale) {
       std::unique_ptr<base::DictionaryValue> clip_value(
           new base::DictionaryValue());
@@ -674,13 +669,14 @@
     matching_mask.Inset(4, 4, 4, 4);
 #endif
     EXPECT_TRUE(MatchesBitmap(expected_bitmap, *result_bitmap, matching_mask,
-                              error_limit));
+                              device_scale_factor, error_limit));
   }
 
   // Takes a screenshot of a colored box that is positioned inside the frame.
   void PlaceAndCaptureBox(const gfx::Size& frame_size,
                           const gfx::Size& box_size,
-                          float screenshot_scale) {
+                          float screenshot_scale,
+                          float device_scale_factor) {
     static const int kBoxOffsetHeight = 100;
     const gfx::Size scaled_box_size =
         ScaleToFlooredSize(box_size, screenshot_scale);
@@ -711,7 +707,7 @@
     params.reset(new base::DictionaryValue());
     params->SetInteger("width", frame_size.width());
     params->SetInteger("height", frame_size.height());
-    params->SetDouble("deviceScaleFactor", 1);
+    params->SetDouble("deviceScaleFactor", device_scale_factor);
     params->SetBoolean("mobile", false);
     SendCommand("Emulation.setDeviceMetricsOverride", std::move(params));
 
@@ -727,8 +723,8 @@
     expected_bitmap.allocN32Pixels(scaled_box_size.width(),
                                    scaled_box_size.height());
     expected_bitmap.eraseColor(SkColorSetRGB(0x00, 0x00, 0xff));
-    CaptureScreenshotAndCompareTo(expected_bitmap, ENCODING_PNG, true, clip,
-                                  screenshot_scale);
+    CaptureScreenshotAndCompareTo(expected_bitmap, ENCODING_PNG, true,
+                                  device_scale_factor, clip, screenshot_scale);
 
     // Reset for next screenshot.
     SendCommand("Emulation.clearDeviceMetricsOverride", nullptr);
@@ -801,12 +797,17 @@
   Attach();
 
   // Test capturing a subarea inside the emulated frame at different scales.
-  PlaceAndCaptureBox(kFrameSize, gfx::Size(100, 200), 1.0);
-  PlaceAndCaptureBox(kFrameSize, gfx::Size(100, 200), 2.0);
-  PlaceAndCaptureBox(kFrameSize, gfx::Size(100, 200), 0.5);
+  PlaceAndCaptureBox(kFrameSize, gfx::Size(100, 200), 1.0, 1.);
+  PlaceAndCaptureBox(kFrameSize, gfx::Size(100, 200), 2.0, 1.);
+  PlaceAndCaptureBox(kFrameSize, gfx::Size(100, 200), 0.5, 1.);
 
   // Ensure that content outside the emulated frame is painted, too.
-  PlaceAndCaptureBox(kFrameSize, gfx::Size(10, 8192), 1.0);
+  PlaceAndCaptureBox(kFrameSize, gfx::Size(10, 8192), 1.0, 1.);
+
+  // Check non-1 device scale factor.
+  PlaceAndCaptureBox(kFrameSize, gfx::Size(100, 200), 1.0, 2.);
+  // Ensure not emulating device scale factor works.
+  PlaceAndCaptureBox(kFrameSize, gfx::Size(100, 200), 1.0, 0.);
 }
 
 // Verifies that setDefaultBackgroundColor and captureScreenshot support a
@@ -1548,59 +1549,6 @@
   EXPECT_THAT(console_messages_, ElementsAre("before", "at", "done", "after"));
 }
 
-// Tests that the Security.showCertificateViewer command shows the
-// certificate corresponding to the visible navigation entry, even when
-// an interstitial is showing. Regression test for
-// https://crbug.com/647759.
-IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest, ShowCertificateViewer) {
-  // First test that the correct certificate is shown for a normal
-  // (non-interstitial) page.
-  NavigateToURLBlockUntilNavigationsComplete(shell(), GURL("about:blank"), 1);
-  Attach();
-
-  // Set a dummy certificate on the NavigationEntry.
-  shell()
-      ->web_contents()
-      ->GetController()
-      .GetVisibleEntry()
-      ->GetSSL()
-      .certificate = ok_cert();
-
-  std::unique_ptr<base::DictionaryValue> params1(new base::DictionaryValue());
-  SendCommand("Security.showCertificateViewer", std::move(params1), true);
-
-  scoped_refptr<net::X509Certificate> normal_page_cert = shell()
-                                                             ->web_contents()
-                                                             ->GetController()
-                                                             .GetVisibleEntry()
-                                                             ->GetSSL()
-                                                             .certificate;
-  ASSERT_TRUE(normal_page_cert);
-  EXPECT_EQ(normal_page_cert, last_shown_certificate());
-
-  // Now test that the correct certificate is shown on an interstitial.
-  TestInterstitialDelegate* delegate = new TestInterstitialDelegate;
-  WebContentsImpl* web_contents =
-      static_cast<WebContentsImpl*>(shell()->web_contents());
-  GURL interstitial_url("https://example.test");
-  InterstitialPageImpl* interstitial = new InterstitialPageImpl(
-      web_contents, static_cast<RenderWidgetHostDelegate*>(web_contents), true,
-      interstitial_url, delegate);
-  interstitial->Show();
-  WaitForInterstitialAttach(web_contents);
-
-  // Set the transient navigation entry certificate.
-  NavigationEntry* transient_entry =
-      web_contents->GetController().GetTransientEntry();
-  ASSERT_TRUE(transient_entry);
-  transient_entry->GetSSL().certificate = expired_cert();
-  ASSERT_TRUE(transient_entry->GetSSL().certificate);
-
-  std::unique_ptr<base::DictionaryValue> params2(new base::DictionaryValue());
-  SendCommand("Security.showCertificateViewer", std::move(params2), true);
-  EXPECT_EQ(transient_entry->GetSSL().certificate, last_shown_certificate());
-}
-
 IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest, CertificateError) {
   net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
   https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED);
diff --git a/content/browser/devtools/protocol/io_handler.h b/content/browser/devtools/protocol/io_handler.h
index 3bff07c7..066541c 100644
--- a/content/browser/devtools/protocol/io_handler.h
+++ b/content/browser/devtools/protocol/io_handler.h
@@ -49,4 +49,4 @@
 }  // namespace protocol
 }  // namespace content
 
-#endif  // CONTENT_BROWSER_DEVTOOLS_PROTOCOL_TRACING_HANDLER_H_
+#endif  // CONTENT_BROWSER_DEVTOOLS_PROTOCOL_IO_HANDLER_H_
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc
index 714cccf7..21c9d64 100644
--- a/content/browser/devtools/protocol/page_handler.cc
+++ b/content/browser/devtools/protocol/page_handler.cc
@@ -458,8 +458,10 @@
     if (!modified_params.view_size.height)
       emulated_view_size.set_height(original_view_size.height());
 
-    dpfactor =
-        modified_params.device_scale_factor / screen_info.device_scale_factor;
+    dpfactor = modified_params.device_scale_factor
+                   ? modified_params.device_scale_factor /
+                         screen_info.device_scale_factor
+                   : 1;
     // When clip is specified, we scale viewport via clip, otherwise we use
     // scale.
     modified_params.scale = clip.isJust() ? 1 : dpfactor;
diff --git a/content/browser/devtools/protocol/security_handler.cc b/content/browser/devtools/protocol/security_handler.cc
index 0ba37a9..803f58f 100644
--- a/content/browser/devtools/protocol/security_handler.cc
+++ b/content/browser/devtools/protocol/security_handler.cc
@@ -6,6 +6,7 @@
 
 #include <string>
 
+#include "base/base64.h"
 #include "content/browser/devtools/devtools_session.h"
 #include "content/browser/frame_host/render_frame_host_impl.h"
 #include "content/public/browser/navigation_controller.h"
@@ -14,6 +15,7 @@
 #include "content/public/browser/ssl_status.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_delegate.h"
+#include "net/cert/x509_certificate.h"
 #include "third_party/WebKit/public/platform/WebMixedContentContextType.h"
 
 namespace content {
@@ -66,12 +68,32 @@
     const std::vector<SecurityStyleExplanation>& explanations_to_add,
     Explanations* explanations) {
   for (const auto& it : explanations_to_add) {
+    std::unique_ptr<protocol::Array<String>> certificate =
+        protocol::Array<String>::create();
+    if (it.certificate) {
+      std::string der;
+      std::string encoded;
+      bool rv = net::X509Certificate::GetDEREncoded(
+          it.certificate->os_cert_handle(), &der);
+      DCHECK(rv);
+      base::Base64Encode(der, &encoded);
+
+      certificate->addItem(encoded);
+
+      for (auto* cert : it.certificate->GetIntermediateCertificates()) {
+        rv = net::X509Certificate::GetDEREncoded(cert, &der);
+        DCHECK(rv);
+        base::Base64Encode(der, &encoded);
+        certificate->addItem(encoded);
+      }
+    }
+
     explanations->addItem(
         Security::SecurityStateExplanation::Create()
             .SetSecurityState(security_style)
             .SetSummary(it.summary)
             .SetDescription(it.description)
-            .SetHasCertificate(it.has_certificate)
+            .SetCertificate(std::move(certificate))
             .SetMixedContentType(MixedContentTypeToProtocolMixedContentType(
                 it.mixed_content_type))
             .Build());
@@ -210,19 +232,6 @@
   return Response::OK();
 }
 
-Response SecurityHandler::ShowCertificateViewer() {
-  if (!host_)
-    return Response::InternalError();
-  WebContents* web_contents = WebContents::FromRenderFrameHost(host_);
-  scoped_refptr<net::X509Certificate> certificate =
-      web_contents->GetController().GetVisibleEntry()->GetSSL().certificate;
-  if (!certificate)
-    return Response::Error("Could not find certificate");
-  web_contents->GetDelegate()->ShowCertificateViewerInDevTools(
-      web_contents, certificate);
-  return Response::OK();
-}
-
 Response SecurityHandler::HandleCertificateError(int event_id,
                                                  const String& action) {
   if (cert_error_callbacks_.find(event_id) == cert_error_callbacks_.end()) {
diff --git a/content/browser/devtools/protocol/security_handler.h b/content/browser/devtools/protocol/security_handler.h
index 96c24ff3..c70fdef 100644
--- a/content/browser/devtools/protocol/security_handler.h
+++ b/content/browser/devtools/protocol/security_handler.h
@@ -40,7 +40,6 @@
   // Security::Backend overrides.
   Response Enable() override;
   Response Disable() override;
-  Response ShowCertificateViewer() override;
   Response HandleCertificateError(int event_id, const String& action) override;
   Response SetOverrideCertificateErrors(bool override) override;
 
diff --git a/content/browser/devtools/protocol_config.json b/content/browser/devtools/protocol_config.json
index a43e4ef..057470ce 100644
--- a/content/browser/devtools/protocol_config.json
+++ b/content/browser/devtools/protocol_config.json
@@ -10,6 +10,10 @@
         "export_header": "content/common/content_export.h",
         "options": [
             {
+                "domain": "Browser",
+                "include": ["getVersion"]
+            },
+            {
                 "domain": "DOM",
                 "include": ["setFileInputFiles"],
                 "include_events": [],
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.cc b/content/browser/devtools/render_frame_devtools_agent_host.cc
index b95c89a2..10503c7 100644
--- a/content/browser/devtools/render_frame_devtools_agent_host.cc
+++ b/content/browser/devtools/render_frame_devtools_agent_host.cc
@@ -18,6 +18,7 @@
 #include "content/browser/devtools/devtools_frame_trace_recorder.h"
 #include "content/browser/devtools/devtools_manager.h"
 #include "content/browser/devtools/devtools_session.h"
+#include "content/browser/devtools/protocol/browser_handler.h"
 #include "content/browser/devtools/protocol/dom_handler.h"
 #include "content/browser/devtools/protocol/emulation_handler.h"
 #include "content/browser/devtools/protocol/input_handler.h"
@@ -506,6 +507,7 @@
 
   protocol::EmulationHandler* emulation_handler =
       new protocol::EmulationHandler();
+  session->AddHandler(base::WrapUnique(new protocol::BrowserHandler()));
   session->AddHandler(base::WrapUnique(new protocol::DOMHandler()));
   session->AddHandler(base::WrapUnique(emulation_handler));
   session->AddHandler(base::WrapUnique(new protocol::InputHandler()));
diff --git a/content/browser/dom_storage/dom_storage_host.cc b/content/browser/dom_storage/dom_storage_host.cc
index 162cdc7..38655ef 100644
--- a/content/browser/dom_storage/dom_storage_host.cc
+++ b/content/browser/dom_storage/dom_storage_host.cc
@@ -32,8 +32,16 @@
   references.namespace_ = context_->GetStorageNamespace(namespace_id);
   if (!references.namespace_.get())
     return context_->DiagnoseSessionNamespaceId(namespace_id);
-  references.area_ = references.namespace_->OpenStorageArea(origin);
-  DCHECK(references.area_.get());
+
+  // namespace->OpenStorageArea() is called only once per process
+  // (areas_open_count[area] is 0).
+  references.area_ = references.namespace_->GetOpenStorageArea(origin);
+  if (!references.area_ || !areas_open_count_[references.area_.get()]) {
+    references.area_ = references.namespace_->OpenStorageArea(origin);
+    DCHECK(references.area_.get());
+    DCHECK_EQ(0, areas_open_count_[references.area_.get()]);
+  }
+  ++areas_open_count_[references.area_.get()];
   connections_[connection_id] = references;
   return base::nullopt;
 }
@@ -42,7 +50,15 @@
   const auto found = connections_.find(connection_id);
   if (found == connections_.end())
     return;
-  found->second.namespace_->CloseStorageArea(found->second.area_.get());
+  DOMStorageArea* area = found->second.area_.get();
+  DCHECK(areas_open_count_[area]);
+
+  // namespace->CloseStorageArea() is called only once per process
+  // (areas_open_count[area] becomes 0).
+  if (--areas_open_count_[area] == 0) {
+    found->second.namespace_->CloseStorageArea(area);
+    areas_open_count_.erase(area);
+  }
   connections_.erase(found);
 }
 
@@ -84,29 +100,34 @@
   return area->GetItem(key);
 }
 
-bool DOMStorageHost::SetAreaItem(
-    int connection_id, const base::string16& key,
-    const base::string16& value, const GURL& page_url,
-    base::NullableString16* old_value) {
+bool DOMStorageHost::SetAreaItem(int connection_id,
+                                 const base::string16& key,
+                                 const base::string16& value,
+                                 const base::NullableString16& client_old_value,
+                                 const GURL& page_url) {
   DOMStorageArea* area = GetOpenArea(connection_id);
   if (!area)
     return false;
-  if (!area->SetItem(key, value, old_value))
+  base::NullableString16 old_value;
+  if (!area->SetItem(key, value, &old_value))
     return false;
-  if (old_value->is_null() || old_value->string() != value)
-    context_->NotifyItemSet(area, key, value, *old_value, page_url);
+  if (old_value.is_null() || old_value.string() != value)
+    context_->NotifyItemSet(area, key, value, old_value, page_url);
   return true;
 }
 
 bool DOMStorageHost::RemoveAreaItem(
-    int connection_id, const base::string16& key, const GURL& page_url,
-    base::string16* old_value) {
+    int connection_id,
+    const base::string16& key,
+    const base::NullableString16& client_old_value,
+    const GURL& page_url) {
   DOMStorageArea* area = GetOpenArea(connection_id);
   if (!area)
     return false;
-  if (!area->RemoveItem(key, old_value))
+  base::string16 old_value;
+  if (!area->RemoveItem(key, &old_value))
     return false;
-  context_->NotifyItemRemoved(area, key, *old_value, page_url);
+  context_->NotifyItemRemoved(area, key, old_value, page_url);
   return true;
 }
 
diff --git a/content/browser/dom_storage/dom_storage_host.h b/content/browser/dom_storage/dom_storage_host.h
index 6b931d19..5804806 100644
--- a/content/browser/dom_storage/dom_storage_host.h
+++ b/content/browser/dom_storage/dom_storage_host.h
@@ -45,13 +45,15 @@
   base::NullableString16 GetAreaKey(int connection_id, unsigned index);
   base::NullableString16 GetAreaItem(int connection_id,
                                      const base::string16& key);
-  bool SetAreaItem(int connection_id, const base::string16& key,
-                   const base::string16& value, const GURL& page_url,
-                   base::NullableString16* old_value);
+  bool SetAreaItem(int connection_id,
+                   const base::string16& key,
+                   const base::string16& value,
+                   const base::NullableString16& client_old_value,
+                   const GURL& page_url);
   bool RemoveAreaItem(int connection_id,
                       const base::string16& key,
-                      const GURL& page_url,
-                      base::string16* old_value);
+                      const base::NullableString16& client_old_value,
+                      const GURL& page_url);
   bool ClearArea(int connection_id, const GURL& page_url);
   bool HasAreaOpen(int namespace_id, const GURL& origin) const;
   bool HasConnection(int connection_id) const {
@@ -75,6 +77,7 @@
 
   scoped_refptr<DOMStorageContextImpl> context_;
   AreaMap connections_;
+  std::map<DOMStorageArea*, int> areas_open_count_;
 
   DISALLOW_COPY_AND_ASSIGN(DOMStorageHost);
 };
diff --git a/content/browser/dom_storage/dom_storage_message_filter.cc b/content/browser/dom_storage/dom_storage_message_filter.cc
index ec5622f..bb64fcc 100644
--- a/content/browser/dom_storage/dom_storage_message_filter.cc
+++ b/content/browser/dom_storage/dom_storage_message_filter.cc
@@ -112,27 +112,30 @@
 }
 
 void DOMStorageMessageFilter::OnSetItem(
-    int connection_id, const base::string16& key,
-    const base::string16& value, const GURL& page_url) {
-  DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
-  DCHECK_EQ(0, connection_dispatching_message_for_);
-  base::AutoReset<int> auto_reset(&connection_dispatching_message_for_,
-                            connection_id);
-  base::NullableString16 not_used;
-  bool success = host_->SetAreaItem(connection_id, key, value,
-                                    page_url, &not_used);
-  Send(new DOMStorageMsg_AsyncOperationComplete(success));
-}
-
-void DOMStorageMessageFilter::OnRemoveItem(
-    int connection_id, const base::string16& key,
+    int connection_id,
+    const base::string16& key,
+    const base::string16& value,
+    const base::NullableString16& client_old_value,
     const GURL& page_url) {
   DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
   DCHECK_EQ(0, connection_dispatching_message_for_);
   base::AutoReset<int> auto_reset(&connection_dispatching_message_for_,
                             connection_id);
-  base::string16 not_used;
-  host_->RemoveAreaItem(connection_id, key, page_url, &not_used);
+  bool success =
+      host_->SetAreaItem(connection_id, key, value, client_old_value, page_url);
+  Send(new DOMStorageMsg_AsyncOperationComplete(success));
+}
+
+void DOMStorageMessageFilter::OnRemoveItem(
+    int connection_id,
+    const base::string16& key,
+    const base::NullableString16& client_old_value,
+    const GURL& page_url) {
+  DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
+  DCHECK_EQ(0, connection_dispatching_message_for_);
+  base::AutoReset<int> auto_reset(&connection_dispatching_message_for_,
+                            connection_id);
+  host_->RemoveAreaItem(connection_id, key, client_old_value, page_url);
   Send(new DOMStorageMsg_AsyncOperationComplete(true));
 }
 
diff --git a/content/browser/dom_storage/dom_storage_message_filter.h b/content/browser/dom_storage/dom_storage_message_filter.h
index c3394e7..ff199f8 100644
--- a/content/browser/dom_storage/dom_storage_message_filter.h
+++ b/content/browser/dom_storage/dom_storage_message_filter.h
@@ -55,9 +55,14 @@
                          const GURL& origin);
   void OnCloseStorageArea(int connection_id);
   void OnLoadStorageArea(int connection_id, DOMStorageValuesMap* map);
-  void OnSetItem(int connection_id, const base::string16& key,
-                 const base::string16& value, const GURL& page_url);
-  void OnRemoveItem(int connection_id, const base::string16& key,
+  void OnSetItem(int connection_id,
+                 const base::string16& key,
+                 const base::string16& value,
+                 const base::NullableString16& client_old_value,
+                 const GURL& page_url);
+  void OnRemoveItem(int connection_id,
+                    const base::string16& key,
+                    const base::NullableString16& client_old_value,
                     const GURL& page_url);
   void OnClear(int connection_id, const GURL& page_url);
   void OnFlushMessages();
diff --git a/content/browser/dom_storage/dom_storage_namespace.cc b/content/browser/dom_storage/dom_storage_namespace.cc
index 847b1930..10568d3 100644
--- a/content/browser/dom_storage/dom_storage_namespace.cc
+++ b/content/browser/dom_storage/dom_storage_namespace.cc
@@ -196,6 +196,13 @@
     origins->push_back(entry.first);
 }
 
+int DOMStorageNamespace::GetAreaOpenCount(const GURL& origin) const {
+  const auto& found = areas_.find(origin);
+  if (found == areas_.end())
+    return 0;
+  return found->second.open_count_;
+}
+
 DOMStorageNamespace::AreaHolder*
 DOMStorageNamespace::GetAreaHolder(const GURL& origin) {
   AreaMap::iterator found = areas_.find(origin);
diff --git a/content/browser/dom_storage/dom_storage_namespace.h b/content/browser/dom_storage/dom_storage_namespace.h
index 8f75f2ab..2fdab5a 100644
--- a/content/browser/dom_storage/dom_storage_namespace.h
+++ b/content/browser/dom_storage/dom_storage_namespace.h
@@ -85,6 +85,8 @@
 
   void GetOriginsWithAreas(std::vector<GURL>* origins) const;
 
+  int GetAreaOpenCount(const GURL& origin) const;
+
  private:
   friend class base::RefCountedThreadSafe<DOMStorageNamespace>;
 
diff --git a/content/browser/download/download_request_core.cc b/content/browser/download/download_request_core.cc
index e37a480..2f3619b 100644
--- a/content/browser/download/download_request_core.cc
+++ b/content/browser/download/download_request_core.cc
@@ -461,106 +461,4 @@
       request() ? request()->url().spec().c_str() : "<NULL request>");
 }
 
-// static
-DownloadInterruptReason DownloadRequestCore::HandleSuccessfulServerResponse(
-    const net::HttpResponseHeaders& http_headers,
-    DownloadSaveInfo* save_info) {
-  switch (http_headers.response_code()) {
-    case -1:  // Non-HTTP request.
-    case net::HTTP_OK:
-    case net::HTTP_NON_AUTHORITATIVE_INFORMATION:
-    case net::HTTP_PARTIAL_CONTENT:
-      // Expected successful codes.
-      break;
-
-    case net::HTTP_CREATED:
-    case net::HTTP_ACCEPTED:
-      // Per RFC 7231 the entity being transferred is metadata about the
-      // resource at the target URL and not the resource at that URL (or the
-      // resource that would be at the URL once processing is completed in the
-      // case of HTTP_ACCEPTED). However, we currently don't have special
-      // handling for these response and they are downloaded the same as a
-      // regular response.
-      break;
-
-    case net::HTTP_NO_CONTENT:
-    case net::HTTP_RESET_CONTENT:
-    // These two status codes don't have an entity (or rather RFC 7231
-    // requires that there be no entity). They are treated the same as the
-    // resource not being found since there is no entity to download.
-
-    case net::HTTP_NOT_FOUND:
-      return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT;
-      break;
-
-    case net::HTTP_REQUESTED_RANGE_NOT_SATISFIABLE:
-      // Retry by downloading from the start automatically:
-      // If we haven't received data when we get this error, we won't.
-      return DOWNLOAD_INTERRUPT_REASON_SERVER_NO_RANGE;
-      break;
-    case net::HTTP_UNAUTHORIZED:
-    case net::HTTP_PROXY_AUTHENTICATION_REQUIRED:
-      // Server didn't authorize this request.
-      return DOWNLOAD_INTERRUPT_REASON_SERVER_UNAUTHORIZED;
-      break;
-    case net::HTTP_FORBIDDEN:
-      // Server forbids access to this resource.
-      return DOWNLOAD_INTERRUPT_REASON_SERVER_FORBIDDEN;
-      break;
-    default:  // All other errors.
-      // Redirection and informational codes should have been handled earlier
-      // in the stack.
-      // TODO(xingliu): Handle HTTP_PRECONDITION_FAILED and resurrect
-      // DOWNLOAD_INTERRUPT_REASON_SERVER_PRECONDITION for range requests.
-      // This will change extensions::api::download::InterruptReason.
-      DCHECK_NE(3, http_headers.response_code() / 100);
-      DCHECK_NE(1, http_headers.response_code() / 100);
-      return DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED;
-  }
-
-  // The caller is expecting a partial response.
-  if (save_info && (save_info->offset > 0 || save_info->length > 0)) {
-    if (http_headers.response_code() != net::HTTP_PARTIAL_CONTENT) {
-      // Server should send partial content when "If-Match" or
-      // "If-Unmodified-Since" check passes, and the range request header has
-      // last byte position. e.g. "Range:bytes=50-99".
-      if (save_info->length != DownloadSaveInfo::kLengthFullContent)
-        return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT;
-
-      // Requested a partial range, but received the entire response, when
-      // the range request header is "Range:bytes={offset}-".
-      save_info->offset = 0;
-      save_info->hash_of_partial_file.clear();
-      save_info->hash_state.reset();
-      return DOWNLOAD_INTERRUPT_REASON_NONE;
-    }
-
-    int64_t first_byte = -1;
-    int64_t last_byte = -1;
-    int64_t length = -1;
-    if (!http_headers.GetContentRangeFor206(&first_byte, &last_byte, &length))
-      return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT;
-    DCHECK_GE(first_byte, 0);
-
-    if (first_byte != save_info->offset ||
-        (save_info->length > 0 &&
-         last_byte != save_info->offset + save_info->length - 1)) {
-      // The server returned a different range than the one we requested. Assume
-      // the response is bad.
-      //
-      // In the future we should consider allowing offsets that are less than
-      // the offset we've requested, since in theory we can truncate the partial
-      // file at the offset and continue.
-      return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT;
-    }
-
-    return DOWNLOAD_INTERRUPT_REASON_NONE;
-  }
-
-  if (http_headers.response_code() == net::HTTP_PARTIAL_CONTENT)
-    return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT;
-
-  return DOWNLOAD_INTERRUPT_REASON_NONE;
-}
-
 }  // namespace content
diff --git a/content/browser/download/download_request_core.h b/content/browser/download/download_request_core.h
index 93c4315a..52fd227 100644
--- a/content/browser/download/download_request_core.h
+++ b/content/browser/download/download_request_core.h
@@ -115,10 +115,6 @@
   net::URLRequest* request() const { return request_; }
 
  private:
-  static DownloadInterruptReason HandleSuccessfulServerResponse(
-      const net::HttpResponseHeaders& http_headers,
-      DownloadSaveInfo* save_info);
-
   std::unique_ptr<DownloadCreateInfo> CreateDownloadCreateInfo(
       DownloadInterruptReason result);
 
diff --git a/content/browser/download/download_response_handler.cc b/content/browser/download/download_response_handler.cc
new file mode 100644
index 0000000..715df6d
--- /dev/null
+++ b/content/browser/download/download_response_handler.cc
@@ -0,0 +1,70 @@
+// 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 "content/browser/download/download_response_handler.h"
+
+#include "content/browser/download/download_stats.h"
+#include "content/browser/download/download_utils.h"
+
+namespace content {
+
+DownloadResponseHandler::DownloadResponseHandler(
+    ResourceRequest* resource_request,
+    Delegate* delegate,
+    bool is_parallel_request)
+    : delegate_(delegate) {
+  if (!is_parallel_request)
+    RecordDownloadCount(UNTHROTTLED_COUNT);
+
+  // TODO(qinmin): create the DownloadSaveInfo from |resource_request|
+}
+
+DownloadResponseHandler::~DownloadResponseHandler() = default;
+
+void DownloadResponseHandler::OnReceiveResponse(
+    const content::ResourceResponseHead& head,
+    const base::Optional<net::SSLInfo>& ssl_info,
+    mojom::DownloadedTempFilePtr downloaded_file) {
+  // TODO(qinmin): create the DownloadCreateInfo from |head|.
+
+  // TODO(qinmin): pass DownloadSaveInfo here.
+  DownloadInterruptReason result =
+      head.headers
+          ? HandleSuccessfulServerResponse(*(head.headers.get()), nullptr)
+          : DOWNLOAD_INTERRUPT_REASON_NONE;
+  if (result != DOWNLOAD_INTERRUPT_REASON_NONE) {
+    delegate_->OnResponseStarted(download_create_info_,
+                                 mojo::ScopedDataPipeConsumerHandle());
+  }
+}
+
+void DownloadResponseHandler::OnReceiveRedirect(
+    const net::RedirectInfo& redirect_info,
+    const content::ResourceResponseHead& head) {}
+
+void DownloadResponseHandler::OnDataDownloaded(int64_t data_length,
+                                               int64_t encoded_length) {}
+
+void DownloadResponseHandler::OnUploadProgress(
+    int64_t current_position,
+    int64_t total_size,
+    OnUploadProgressCallback callback) {}
+
+void DownloadResponseHandler::OnReceiveCachedMetadata(
+    const std::vector<uint8_t>& data) {}
+
+void DownloadResponseHandler::OnTransferSizeUpdated(
+    int32_t transfer_size_diff) {};
+
+void DownloadResponseHandler::OnStartLoadingResponseBody(
+    mojo::ScopedDataPipeConsumerHandle body) {
+  delegate_->OnResponseStarted(download_create_info_, std::move(body));
+}
+
+void DownloadResponseHandler::OnComplete(
+    const content::ResourceRequestCompletionStatus& completion_status) {
+  // TODO(qinmin): passing the |completion_status| to DownloadFile.
+}
+
+}  // namespace content
diff --git a/content/browser/download/download_response_handler.h b/content/browser/download/download_response_handler.h
new file mode 100644
index 0000000..f60158e
--- /dev/null
+++ b/content/browser/download/download_response_handler.h
@@ -0,0 +1,59 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_DOWNLOAD_RESPONSE_HANDLER_
+#define CONTENT_BROWSER_DOWNLOAD_RESPONSE_HANDLER_
+
+#include "content/browser/download/download_create_info.h"
+#include "content/public/common/resource_request.h"
+#include "content/public/common/url_loader.mojom.h"
+
+namespace content {
+
+// This class is responsible for handling the server response for a download.
+// It passes the DataPipeConsumerHandle and completion status to the download
+// sink. The class is common to both navigation triggered downloads and
+// context menu downloads
+class DownloadResponseHandler : public mojom::URLLoaderClient {
+ public:
+  class Delegate {
+   public:
+    virtual void OnResponseStarted(
+        const DownloadCreateInfo& download_create_info,
+        mojo::ScopedDataPipeConsumerHandle body) = 0;
+  };
+
+  DownloadResponseHandler(ResourceRequest* resource_request,
+                          Delegate* delegate,
+                          bool is_parallel_request);
+  ~DownloadResponseHandler() override;
+
+  // mojom::URLLoaderClient
+  void OnReceiveResponse(const content::ResourceResponseHead& head,
+                         const base::Optional<net::SSLInfo>& ssl_info,
+                         mojom::DownloadedTempFilePtr downloaded_file) override;
+  void OnReceiveRedirect(const net::RedirectInfo& redirect_info,
+                         const content::ResourceResponseHead& head) override;
+  void OnDataDownloaded(int64_t data_length, int64_t encoded_length) override;
+  void OnUploadProgress(int64_t current_position,
+                        int64_t total_size,
+                        OnUploadProgressCallback callback) override;
+  void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override;
+  void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
+  void OnStartLoadingResponseBody(
+      mojo::ScopedDataPipeConsumerHandle body) override;
+  void OnComplete(const content::ResourceRequestCompletionStatus&
+                  completion_status) override;
+
+ private:
+  Delegate* const delegate_;
+
+  DownloadCreateInfo download_create_info_;
+
+  DISALLOW_COPY_AND_ASSIGN(DownloadResponseHandler);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_DOWNLOAD_RESPONSE_HANDLER
diff --git a/content/browser/download/download_utils.cc b/content/browser/download/download_utils.cc
index 856a531..3e288d8 100644
--- a/content/browser/download/download_utils.cc
+++ b/content/browser/download/download_utils.cc
@@ -10,12 +10,14 @@
 #include "content/browser/download/download_interrupt_reasons_impl.h"
 #include "content/browser/download/download_stats.h"
 #include "content/public/browser/browser_thread.h"
+#include "content/public/browser/download_save_info.h"
 #include "content/public/browser/download_url_parameters.h"
 #include "content/public/common/resource_request.h"
 #include "net/base/elements_upload_data_stream.h"
 #include "net/base/load_flags.h"
 #include "net/base/upload_bytes_element_reader.h"
 #include "net/http/http_request_headers.h"
+#include "net/http/http_status_code.h"
 #include "net/url_request/url_request_context.h"
 
 namespace content {
@@ -250,5 +252,105 @@
   return request;
 }
 
+DownloadInterruptReason HandleSuccessfulServerResponse(
+    const net::HttpResponseHeaders& http_headers,
+    DownloadSaveInfo* save_info) {
+  switch (http_headers.response_code()) {
+    case -1:  // Non-HTTP request.
+    case net::HTTP_OK:
+    case net::HTTP_NON_AUTHORITATIVE_INFORMATION:
+    case net::HTTP_PARTIAL_CONTENT:
+      // Expected successful codes.
+      break;
+
+    case net::HTTP_CREATED:
+    case net::HTTP_ACCEPTED:
+      // Per RFC 7231 the entity being transferred is metadata about the
+      // resource at the target URL and not the resource at that URL (or the
+      // resource that would be at the URL once processing is completed in the
+      // case of HTTP_ACCEPTED). However, we currently don't have special
+      // handling for these response and they are downloaded the same as a
+      // regular response.
+      break;
+
+    case net::HTTP_NO_CONTENT:
+    case net::HTTP_RESET_CONTENT:
+    // These two status codes don't have an entity (or rather RFC 7231
+    // requires that there be no entity). They are treated the same as the
+    // resource not being found since there is no entity to download.
+
+    case net::HTTP_NOT_FOUND:
+      return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT;
+      break;
+
+    case net::HTTP_REQUESTED_RANGE_NOT_SATISFIABLE:
+      // Retry by downloading from the start automatically:
+      // If we haven't received data when we get this error, we won't.
+      return DOWNLOAD_INTERRUPT_REASON_SERVER_NO_RANGE;
+      break;
+    case net::HTTP_UNAUTHORIZED:
+    case net::HTTP_PROXY_AUTHENTICATION_REQUIRED:
+      // Server didn't authorize this request.
+      return DOWNLOAD_INTERRUPT_REASON_SERVER_UNAUTHORIZED;
+      break;
+    case net::HTTP_FORBIDDEN:
+      // Server forbids access to this resource.
+      return DOWNLOAD_INTERRUPT_REASON_SERVER_FORBIDDEN;
+      break;
+    default:  // All other errors.
+      // Redirection and informational codes should have been handled earlier
+      // in the stack.
+      // TODO(xingliu): Handle HTTP_PRECONDITION_FAILED and resurrect
+      // DOWNLOAD_INTERRUPT_REASON_SERVER_PRECONDITION for range requests.
+      // This will change extensions::api::download::InterruptReason.
+      DCHECK_NE(3, http_headers.response_code() / 100);
+      DCHECK_NE(1, http_headers.response_code() / 100);
+      return DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED;
+  }
+
+  // The caller is expecting a partial response.
+  if (save_info && (save_info->offset > 0 || save_info->length > 0)) {
+    if (http_headers.response_code() != net::HTTP_PARTIAL_CONTENT) {
+      // Server should send partial content when "If-Match" or
+      // "If-Unmodified-Since" check passes, and the range request header has
+      // last byte position. e.g. "Range:bytes=50-99".
+      if (save_info->length != DownloadSaveInfo::kLengthFullContent)
+        return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT;
+
+      // Requested a partial range, but received the entire response, when
+      // the range request header is "Range:bytes={offset}-".
+      save_info->offset = 0;
+      save_info->hash_of_partial_file.clear();
+      save_info->hash_state.reset();
+      return DOWNLOAD_INTERRUPT_REASON_NONE;
+    }
+
+    int64_t first_byte = -1;
+    int64_t last_byte = -1;
+    int64_t length = -1;
+    if (!http_headers.GetContentRangeFor206(&first_byte, &last_byte, &length))
+      return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT;
+    DCHECK_GE(first_byte, 0);
+
+    if (first_byte != save_info->offset ||
+        (save_info->length > 0 &&
+         last_byte != save_info->offset + save_info->length - 1)) {
+      // The server returned a different range than the one we requested. Assume
+      // the response is bad.
+      //
+      // In the future we should consider allowing offsets that are less than
+      // the offset we've requested, since in theory we can truncate the partial
+      // file at the offset and continue.
+      return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT;
+    }
+
+    return DOWNLOAD_INTERRUPT_REASON_NONE;
+  }
+
+  if (http_headers.response_code() == net::HTTP_PARTIAL_CONTENT)
+    return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT;
+
+  return DOWNLOAD_INTERRUPT_REASON_NONE;
+}
 
 }  // namespace content
diff --git a/content/browser/download/download_utils.h b/content/browser/download/download_utils.h
index 741218a..4b8c2ef 100644
--- a/content/browser/download/download_utils.h
+++ b/content/browser/download/download_utils.h
@@ -8,6 +8,7 @@
 #include "content/public/browser/download_interrupt_reasons.h"
 #include "net/base/net_errors.h"
 #include "net/cert/cert_status_flags.h"
+#include "net/http/http_response_headers.h"
 
 namespace net {
 class URLRequest;
@@ -17,6 +18,7 @@
 
 class DownloadUrlParameters;
 struct ResourceRequest;
+struct DownloadSaveInfo;
 
 // Handle the url request completion status and return the interrupt reasons.
 // |cert_status| is ignored if error_code is not net::ERR_ABORTED.
@@ -29,9 +31,13 @@
     DownloadUrlParameters* params);
 
 // Create a URLRequest from |params|.
-std::unique_ptr<net::URLRequest> CreateURLRequestOnIOThread(
+std::unique_ptr<net::URLRequest> CONTENT_EXPORT CreateURLRequestOnIOThread(
     DownloadUrlParameters* params);
 
+DownloadInterruptReason CONTENT_EXPORT
+HandleSuccessfulServerResponse(const net::HttpResponseHeaders& http_headers,
+                               DownloadSaveInfo* save_info);
+
 }  // namespace content
 
 #endif  // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_UTILS_H_
diff --git a/content/browser/download/parallel_download_job.cc b/content/browser/download/parallel_download_job.cc
index 519711e..c800f09 100644
--- a/content/browser/download/parallel_download_job.cc
+++ b/content/browser/download/parallel_download_job.cc
@@ -134,8 +134,10 @@
 void ParallelDownloadJob::BuildParallelRequests() {
   DCHECK(!requests_sent_);
   DCHECK(!is_paused());
-  if (is_canceled_)
+  if (is_canceled_ ||
+      download_item_->GetLastReason() != DOWNLOAD_INTERRUPT_REASON_NONE) {
     return;
+  }
 
   // TODO(qinmin): The size of |slices_to_download| should be no larger than
   // |kParallelRequestCount| unless |kParallelRequestCount| is changed after
diff --git a/content/browser/download/parallel_download_job_unittest.cc b/content/browser/download/parallel_download_job_unittest.cc
index ae7d5b04c..223a3a1 100644
--- a/content/browser/download/parallel_download_job_unittest.cc
+++ b/content/browser/download/parallel_download_job_unittest.cc
@@ -9,6 +9,7 @@
 
 #include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
+#include "base/test/mock_callback.h"
 #include "base/test/scoped_task_environment.h"
 #include "content/browser/download/download_destination_observer.h"
 #include "content/browser/download/download_file_impl.h"
@@ -22,6 +23,7 @@
 
 using ::testing::_;
 using ::testing::NiceMock;
+using ::testing::Return;
 using ::testing::StrictMock;
 
 namespace content {
@@ -91,6 +93,11 @@
 
   ParallelDownloadJob::WorkerMap& workers() { return workers_; }
 
+  void MakeFileInitialized(const DownloadFile::InitializeCallback& callback,
+                           DownloadInterruptReason result) {
+    ParallelDownloadJob::OnDownloadFileInitialized(callback, result);
+  }
+
   int GetParallelRequestCount() const override { return request_count_; }
   int64_t GetMinSliceSize() const override { return min_slice_size_; }
   int GetMinRemainingTimeInSeconds() const override {
@@ -198,7 +205,7 @@
   // Task 1:  Range:50-, for 50 bytes.
   CreateParallelJob(0, 100, DownloadItem::ReceivedSlices(), 2, 1, 10);
   BuildParallelRequests();
-  EXPECT_EQ(1, static_cast<int>(job_->workers().size()));
+  EXPECT_EQ(1u, job_->workers().size());
   VerifyWorker(50, 0);
   DestroyParallelJob();
 
@@ -208,7 +215,7 @@
   // Task 2:  Range:66-, for 34 bytes.
   CreateParallelJob(0, 100, DownloadItem::ReceivedSlices(), 3, 1, 10);
   BuildParallelRequests();
-  EXPECT_EQ(2, static_cast<int>(job_->workers().size()));
+  EXPECT_EQ(2u, job_->workers().size());
   VerifyWorker(33, 33);
   VerifyWorker(66, 0);
   DestroyParallelJob();
@@ -242,7 +249,7 @@
   DownloadItem::ReceivedSlices slices = {DownloadItem::ReceivedSlice(0, 17)};
   CreateParallelJob(12, 88, slices, 3, 1, 10);
   BuildParallelRequests();
-  EXPECT_EQ(2, static_cast<int>(job_->workers().size()));
+  EXPECT_EQ(2u, job_->workers().size());
   VerifyWorker(44, 27);
   VerifyWorker(71, 0);
   DestroyParallelJob();
@@ -256,7 +263,7 @@
   slices = {DownloadItem::ReceivedSlice(0, 60)};
   CreateParallelJob(60, 40, slices, 4, 20, 10);
   BuildParallelRequests();
-  EXPECT_EQ(1, static_cast<int>(job_->workers().size()));
+  EXPECT_EQ(1u, job_->workers().size());
   VerifyWorker(80, 0);
   DestroyParallelJob();
 
@@ -277,7 +284,7 @@
       DownloadItem::ReceivedSlice(40, 10), DownloadItem::ReceivedSlice(90, 10)};
   CreateParallelJob(0, 12, slices, 2, 1, 10);
   BuildParallelRequests();
-  EXPECT_EQ(3, static_cast<int>(job_->workers().size()));
+  EXPECT_EQ(3u, job_->workers().size());
   VerifyWorker(30, 10);
   VerifyWorker(50, 40);
   VerifyWorker(100, 0);
@@ -359,7 +366,7 @@
   DownloadItem::ReceivedSlices slices = {DownloadItem::ReceivedSlice(0, 99)};
   CreateParallelJob(99, 1, slices, 3, 1, 10);
   BuildParallelRequests();
-  EXPECT_EQ(0, static_cast<int>(job_->workers().size()));
+  EXPECT_EQ(0u, job_->workers().size());
 
   DestroyParallelJob();
 }
@@ -398,4 +405,26 @@
   task_environment_.RunUntilIdle();
 }
 
+// Interruption from IO thread after the file initialized and before building
+// the parallel requests, should correctly stop the download.
+TEST_F(ParallelDownloadJobTest, InterruptOnStartup) {
+  DownloadItem::ReceivedSlices slices = {DownloadItem::ReceivedSlice(0, 99)};
+  CreateParallelJob(99, 1, slices, 3, 1, 10);
+
+  // Start to build the requests without any error.
+  base::MockCallback<DownloadFile::InitializeCallback> callback;
+  EXPECT_CALL(callback, Run(_)).Times(1);
+  job_->MakeFileInitialized(callback.Get(), DOWNLOAD_INTERRUPT_REASON_NONE);
+
+  // Simulate and inject an error from IO thread after file initializd.
+  EXPECT_CALL(*download_item_.get(), GetLastReason())
+      .WillOnce(Return(DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED));
+
+  // Because of the error, no parallel requests are built.
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(0u, job_->workers().size());
+
+  DestroyParallelJob();
+}
+
 }  // namespace content
diff --git a/content/browser/frame_host/input/legacy_ipc_frame_input_handler.cc b/content/browser/frame_host/input/legacy_ipc_frame_input_handler.cc
index 849d9c1..b44c9e5 100644
--- a/content/browser/frame_host/input/legacy_ipc_frame_input_handler.cc
+++ b/content/browser/frame_host/input/legacy_ipc_frame_input_handler.cc
@@ -20,17 +20,18 @@
 void LegacyIPCFrameInputHandler::SetCompositionFromExistingText(
     int32_t start,
     int32_t end,
-    const std::vector<ui::CompositionUnderline>& ui_underlines) {
-  std::vector<blink::WebCompositionUnderline> underlines;
-  for (const auto& underline : ui_underlines) {
-    blink::WebCompositionUnderline blink_underline(
-        underline.start_offset, underline.end_offset, underline.color,
-        underline.thick, underline.background_color);
-    underlines.push_back(blink_underline);
+    const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) {
+  std::vector<blink::WebImeTextSpan> ime_text_spans;
+  for (const auto& ime_text_span : ui_ime_text_spans) {
+    blink::WebImeTextSpan blink_ime_text_span(
+        ime_text_span.start_offset, ime_text_span.end_offset,
+        ime_text_span.color, ime_text_span.thick,
+        ime_text_span.background_color);
+    ime_text_spans.push_back(blink_ime_text_span);
   }
 
   SendInput(base::MakeUnique<InputMsg_SetCompositionFromExistingText>(
-      routing_id_, start, end, underlines));
+      routing_id_, start, end, ime_text_spans));
 }
 
 void LegacyIPCFrameInputHandler::ExtendSelectionAndDelete(int32_t before,
diff --git a/content/browser/frame_host/input/legacy_ipc_frame_input_handler.h b/content/browser/frame_host/input/legacy_ipc_frame_input_handler.h
index 7a10e51..c46e6940 100644
--- a/content/browser/frame_host/input/legacy_ipc_frame_input_handler.h
+++ b/content/browser/frame_host/input/legacy_ipc_frame_input_handler.h
@@ -24,7 +24,7 @@
   void SetCompositionFromExistingText(
       int32_t start,
       int32_t end,
-      const std::vector<ui::CompositionUnderline>& underlines) override;
+      const std::vector<ui::ImeTextSpan>& ime_text_spans) override;
   void ExtendSelectionAndDelete(int32_t before, int32_t after) override;
   void DeleteSurroundingText(int32_t before, int32_t after) override;
   void DeleteSurroundingTextInCodePoints(int32_t before,
diff --git a/content/browser/gpu/gpu_internals_ui.cc b/content/browser/gpu/gpu_internals_ui.cc
index 622a11b..0cedc801 100644
--- a/content/browser/gpu/gpu_internals_ui.cc
+++ b/content/browser/gpu/gpu_internals_ui.cc
@@ -311,6 +311,8 @@
       return "SCANOUT";
     case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
       return "SCANOUT_CPU_READ_WRITE";
+    case gfx::BufferUsage::SCANOUT_VDA_WRITE:
+      return "SCANOUT_VDA_WRITE";
     case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
       return "GPU_READ_CPU_READ_WRITE";
     case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT:
diff --git a/content/browser/loader/redirect_to_file_resource_handler.cc b/content/browser/loader/redirect_to_file_resource_handler.cc
index 3bddfd7..d6acbbc 100644
--- a/content/browser/loader/redirect_to_file_resource_handler.cc
+++ b/content/browser/loader/redirect_to_file_resource_handler.cc
@@ -134,11 +134,6 @@
     net::URLRequest* request)
     : LayeredResourceHandler(request, std::move(next_handler)),
       buf_(new net::GrowableIOBuffer()),
-      buf_write_pending_(false),
-      write_cursor_(0),
-      writer_(NULL),
-      next_buffer_size_(kInitialReadBufSize),
-      completed_during_write_(false),
       weak_factory_(this) {}
 
 RedirectToFileResourceHandler::~RedirectToFileResourceHandler() {
@@ -158,7 +153,12 @@
 void RedirectToFileResourceHandler::OnResponseStarted(
     ResourceResponse* response,
     std::unique_ptr<ResourceController> controller) {
-  DCHECK(writer_);
+  if (!writer_) {
+    response_pending_file_creation_ = response;
+    HoldController(std::move(controller));
+    request()->LogBlockedBy("RedirectToFileResourceHandler");
+    return;
+  }
   response->head.download_file_path = writer_->path();
   next_handler_->OnResponseStarted(response, std::move(controller));
 }
@@ -168,12 +168,7 @@
     std::unique_ptr<ResourceController> controller) {
   DCHECK(!writer_);
 
-  // Defer starting the request until we have created the temporary file.
-  // TODO(darin): This is sub-optimal.  We should not delay starting the
-  // network request like this.
-  will_start_url_ = url;
-  HoldController(std::move(controller));
-  request()->LogBlockedBy("RedirectToFileResourceHandler");
+  // Create the file ASAP but don't block.
   if (create_temporary_file_stream_.is_null()) {
     CreateTemporaryFileStream(
         base::Bind(&RedirectToFileResourceHandler::DidCreateTemporaryFile,
@@ -183,6 +178,7 @@
         base::Bind(&RedirectToFileResourceHandler::DidCreateTemporaryFile,
                    weak_factory_.GetWeakPtr()));
   }
+  next_handler_->OnWillStart(url, std::move(controller));
 }
 
 void RedirectToFileResourceHandler::OnWillRead(
@@ -252,23 +248,30 @@
     std::unique_ptr<net::FileStream> file_stream,
     ShareableFileReference* deletable_file) {
   DCHECK(!writer_);
-  DCHECK(has_controller());
   if (error_code != base::File::FILE_OK) {
-    CancelWithError(net::FileErrorToNetError(error_code));
+    if (has_controller()) {
+      CancelWithError(net::FileErrorToNetError(error_code));
+    } else {
+      OutOfBandCancel(net::FileErrorToNetError(error_code),
+                      true /* tell_renderer */);
+    }
     return;
   }
 
   writer_ = new Writer(this, std::move(file_stream), deletable_file);
 
-  // Resume the request.
-  request()->LogUnblocked();
-  next_handler_->OnWillStart(std::move(will_start_url_), ReleaseController());
+  if (response_pending_file_creation_) {
+    scoped_refptr<ResourceResponse> response =
+        std::move(response_pending_file_creation_);
+    request()->LogUnblocked();
+    OnResponseStarted(response.get(), ReleaseController());
+  }
 }
 
 void RedirectToFileResourceHandler::DidWriteToFile(int result) {
   bool failed = false;
   if (result > 0) {
-    next_handler_->OnDataDownloaded(result);
+    OnDataDownloaded(result);
     write_cursor_ += result;
     // WriteMore will resume the request if the request hasn't completed and
     // there's more buffer space.
@@ -349,7 +352,7 @@
       break;
     if (rv <= 0)
       return false;
-    next_handler_->OnDataDownloaded(rv);
+    OnDataDownloaded(rv);
     write_cursor_ += rv;
   }
 
diff --git a/content/browser/loader/redirect_to_file_resource_handler.h b/content/browser/loader/redirect_to_file_resource_handler.h
index 9f642e7..079b3ae 100644
--- a/content/browser/loader/redirect_to_file_resource_handler.h
+++ b/content/browser/loader/redirect_to_file_resource_handler.h
@@ -97,6 +97,8 @@
 
   bool BufIsFull() const;
 
+  // If populated, OnResponseStarted completion is pending on file creation.
+  scoped_refptr<ResourceResponse> response_pending_file_creation_;
   CreateTemporaryFileStreamFunction create_temporary_file_stream_;
 
   // We allocate a single, fixed-size IO buffer (buf_) used to read from the
@@ -107,24 +109,23 @@
   // tracks the offset into buf_ that we are writing to disk.
 
   scoped_refptr<net::GrowableIOBuffer> buf_;
-  bool buf_write_pending_;
-  int write_cursor_;
+  bool buf_write_pending_ = false;
+  int write_cursor_ = 0;
 
   // Helper writer object which maintains references to the net::FileStream and
   // storage::ShareableFileReference. This is maintained separately so that,
   // on Windows, the temporary file isn't deleted until after it is closed.
   class Writer;
-  Writer* writer_;
+  Writer* writer_ = nullptr;
 
   // |next_buffer_size_| is the size of the buffer to be allocated on the next
   // OnWillRead() call.  We exponentially grow the size of the buffer allocated
   // when our owner fills our buffers. On the first OnWillRead() call, we
   // allocate a buffer of 32k and double it in OnReadCompleted() if the buffer
   // was filled, up to a maximum size of 512k.
-  int next_buffer_size_;
+  int next_buffer_size_ = kInitialReadBufSize;
 
-  bool completed_during_write_;
-  GURL will_start_url_;
+  bool completed_during_write_ = false;
   net::URLRequestStatus completed_status_;
 
   base::WeakPtrFactory<RedirectToFileResourceHandler> weak_factory_;
diff --git a/content/browser/loader/redirect_to_file_resource_handler_unittest.cc b/content/browser/loader/redirect_to_file_resource_handler_unittest.cc
index aaee16d..e7074444 100644
--- a/content/browser/loader/redirect_to_file_resource_handler_unittest.cc
+++ b/content/browser/loader/redirect_to_file_resource_handler_unittest.cc
@@ -275,19 +275,24 @@
     create_file_stream_callback_ = create_file_stream_callback;
   }
 
-  // Simulates starting the request, the response starting, and stream creation
-  // completing with the specified error code. Has |test_handler_| resume the
-  // request, if needed. Returns final status of |mock_loader_|.
-  MockResourceLoader::Status StartAndCreateStream(base::File::Error file_error)
-      WARN_UNUSED_RESULT {
-    DCHECK(file_stream_);
+  void PerformOnWillStart() {
+    MockResourceLoader::Status expected_status;
+    if (GetParam() == CompletionMode::ASYNC) {
+      expected_status = MockResourceLoader::Status::CALLBACK_PENDING;
+    } else {
+      expected_status = MockResourceLoader::Status::IDLE;
+    }
+    EXPECT_EQ(expected_status, mock_loader_->OnWillStart(url_request_->url()));
+  }
 
-    EXPECT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
-              mock_loader_->OnWillStart(url_request_->url()));
+  // Sets up the file stream or error, and performs the file callback.
+  void PerformCreateFile(base::File::Error file_error) {
+    DCHECK(file_stream_);
 
     file_stream_->set_expect_closed(file_error == base::File::FILE_OK);
     if (file_error != base::File::FILE_OK)
       file_stream_ = nullptr;
+
     base::ResetAndReturn(&create_file_stream_callback_)
         .Run(file_error, std::move(file_stream_),
              // Not really used by the test, but the ResourceHandler expects it
@@ -297,6 +302,18 @@
                  storage::ShareableFileReference::DELETE_ON_FINAL_RELEASE,
                  base::ThreadTaskRunnerHandle::Get().get())
                  .get());
+  }
+
+  // Simulates starting the request, the response starting, and stream creation
+  // completing with the specified error code. Has |test_handler_| resume the
+  // request, if needed. Returns final status of |mock_loader_|.
+  MockResourceLoader::Status StartAndCreateStream(base::File::Error file_error)
+      WARN_UNUSED_RESULT {
+    PerformOnWillStart();
+
+    // Create the file right away.
+    PerformCreateFile(file_error);
+
     // If this is an async test, |test_handler_| will defer the OnWillStart
     // event on success (On error, its OnWillStart method is not called).
     if (file_error == base::File::FILE_OK &&
@@ -389,6 +406,67 @@
   CompleteRequestSuccessfully(test_data.size());
 }
 
+TEST_P(RedirectToFileResourceHandlerTest, SingleBodyReadDelayedFileOnResponse) {
+  std::string test_data = CreateTestData(kMaxInitialSyncReadSize);
+
+  PerformOnWillStart();
+  if (GetParam() == CompletionMode::ASYNC) {
+    EXPECT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
+              mock_loader_->status());
+    test_handler_->Resume();
+    mock_loader_->WaitUntilIdleOrCanceled();
+  }
+  ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status());
+  mock_loader_->OnResponseStarted(make_scoped_refptr(new ResourceResponse()));
+  ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
+            mock_loader_->status());
+
+  PerformCreateFile(base::File::FILE_OK);
+
+  if (GetParam() == CompletionMode::ASYNC) {
+    EXPECT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
+              mock_loader_->status());
+    test_handler_->Resume();
+    mock_loader_->WaitUntilIdleOrCanceled();
+  }
+  EXPECT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status());
+
+  ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
+  ASSERT_EQ(MockResourceLoader::Status::IDLE,
+            mock_loader_->OnReadCompleted(test_data));
+  // Wait for the write to complete, in the async case.
+  base::RunLoop().RunUntilIdle();
+
+  CompleteRequestSuccessfully(test_data.size());
+}
+
+TEST_P(RedirectToFileResourceHandlerTest, SingleBodyReadDelayedFileError) {
+  std::string test_data = CreateTestData(0);
+
+  PerformOnWillStart();
+  if (GetParam() == CompletionMode::ASYNC) {
+    EXPECT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
+              mock_loader_->status());
+    test_handler_->Resume();
+    mock_loader_->WaitUntilIdleOrCanceled();
+  }
+  ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status());
+  mock_loader_->OnResponseStarted(make_scoped_refptr(new ResourceResponse()));
+  ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
+            mock_loader_->status());
+
+  PerformCreateFile(base::File::FILE_ERROR_FAILED);
+
+  EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status());
+  EXPECT_EQ(0, test_handler_->on_response_completed_called());
+  EXPECT_EQ(net::ERR_FAILED, mock_loader_->error_code());
+  ASSERT_EQ(MockResourceLoader::Status::IDLE,
+            mock_loader_->OnResponseCompleted(
+                net::URLRequestStatus::FromError(net::ERR_FAILED)));
+  EXPECT_FALSE(test_handler_->final_status().is_success());
+  EXPECT_EQ(net::ERR_FAILED, test_handler_->final_status().error());
+}
+
 TEST_P(RedirectToFileResourceHandlerTest, ManySequentialBodyReads) {
   const size_t kBytesPerRead = 128;
   std::string test_data =
@@ -757,9 +835,17 @@
 
   EXPECT_EQ(0, test_handler_->on_response_completed_called());
   EXPECT_EQ(net::ERR_FAILED, mock_loader_->error_code());
-  ASSERT_EQ(MockResourceLoader::Status::IDLE,
-            mock_loader_->OnResponseCompleted(
-                net::URLRequestStatus::FromError(net::ERR_FAILED)));
+  if (GetParam() == CompletionMode::ASYNC) {
+    EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status());
+    ASSERT_EQ(MockResourceLoader::Status::IDLE,
+              mock_loader_->OnResponseCompletedFromExternalOutOfBandCancel(
+                  net::URLRequestStatus::FromError(net::ERR_FAILED)));
+  } else {
+    ASSERT_EQ(MockResourceLoader::Status::IDLE,
+              mock_loader_->OnResponseCompleted(
+                  net::URLRequestStatus::FromError(net::ERR_FAILED)));
+  }
+
   EXPECT_EQ(0, test_handler_->total_bytes_downloaded());
   EXPECT_FALSE(test_handler_->final_status().is_success());
   EXPECT_EQ(net::ERR_FAILED, test_handler_->final_status().error());
diff --git a/content/browser/media/media_browsertest.cc b/content/browser/media/media_browsertest.cc
index 1345092..239bfb2 100644
--- a/content/browser/media/media_browsertest.cc
+++ b/content/browser/media/media_browsertest.cc
@@ -241,15 +241,6 @@
 IN_PROC_BROWSER_TEST_F(MediaTest, VideoBearRotated270) {
   RunVideoSizeTest("bear_rotate_270.mp4", 720, 1280);
 }
-
-// Android can't reliably load lots of videos on a page.
-// See http://crbug.com/749265
-#if !defined(OS_ANDROID)
-IN_PROC_BROWSER_TEST_F(MediaTest, LoadManyVideos) {
-  base::StringPairs query_params;
-  RunMediaTestPage("load_many_videos.html", query_params, kEnded, true);
-}
-#endif  // !defined(OS_ANDROID)
 #endif  // BUILDFLAG(USE_PROPRIETARY_CODECS)
 
 #if defined(OS_CHROMEOS)
diff --git a/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.cc b/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.cc
index 12f039c..282843f 100644
--- a/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.cc
+++ b/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.cc
@@ -13,15 +13,16 @@
 namespace content {
 
 namespace {
-std::vector<blink::WebCompositionUnderline> ConvertToBlinkUnderline(
-    const std::vector<ui::CompositionUnderline>& ui_underlines) {
-  std::vector<blink::WebCompositionUnderline> underlines;
-  for (const auto& underline : ui_underlines) {
-    underlines.emplace_back(blink::WebCompositionUnderline(
-        underline.start_offset, underline.end_offset, underline.color,
-        underline.thick, underline.background_color));
+std::vector<blink::WebImeTextSpan> ConvertToBlinkImeTextSpan(
+    const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) {
+  std::vector<blink::WebImeTextSpan> ime_text_spans;
+  for (const auto& ime_text_span : ui_ime_text_spans) {
+    ime_text_spans.emplace_back(blink::WebImeTextSpan(
+        ime_text_span.start_offset, ime_text_span.end_offset,
+        ime_text_span.color, ime_text_span.thick,
+        ime_text_span.background_color));
   }
-  return underlines;
+  return ime_text_spans;
 }
 
 }  // namespace
@@ -29,7 +30,6 @@
 LegacyIPCWidgetInputHandler::LegacyIPCWidgetInputHandler(
     LegacyInputRouterImpl* input_router)
     : input_router_(input_router) {}
-
 LegacyIPCWidgetInputHandler::~LegacyIPCWidgetInputHandler() {}
 
 void LegacyIPCWidgetInputHandler::SetFocus(bool focused) {
@@ -52,25 +52,25 @@
 
 void LegacyIPCWidgetInputHandler::ImeSetComposition(
     const base::string16& text,
-    const std::vector<ui::CompositionUnderline>& ui_underlines,
+    const std::vector<ui::ImeTextSpan>& ui_ime_text_spans,
     const gfx::Range& range,
     int32_t start,
     int32_t end) {
-  std::vector<blink::WebCompositionUnderline> underlines =
-      ConvertToBlinkUnderline(ui_underlines);
+  std::vector<blink::WebImeTextSpan> ime_text_spans =
+      ConvertToBlinkImeTextSpan(ui_ime_text_spans);
   SendInput(base::MakeUnique<InputMsg_ImeSetComposition>(
-      input_router_->routing_id(), text, underlines, range, start, end));
+      input_router_->routing_id(), text, ime_text_spans, range, start, end));
 }
 
 void LegacyIPCWidgetInputHandler::ImeCommitText(
     const base::string16& text,
-    const std::vector<ui::CompositionUnderline>& ui_underlines,
+    const std::vector<ui::ImeTextSpan>& ui_ime_text_spans,
     const gfx::Range& range,
     int32_t relative_cursor_position) {
-  std::vector<blink::WebCompositionUnderline> underlines =
-      ConvertToBlinkUnderline(ui_underlines);
+  std::vector<blink::WebImeTextSpan> ime_text_spans =
+      ConvertToBlinkImeTextSpan(ui_ime_text_spans);
   SendInput(base::MakeUnique<InputMsg_ImeCommitText>(
-      input_router_->routing_id(), text, underlines, range,
+      input_router_->routing_id(), text, ime_text_spans, range,
       relative_cursor_position));
 }
 
diff --git a/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.h b/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.h
index 9bc8f0c6..7bfd9e7 100644
--- a/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.h
+++ b/content/browser/renderer_host/input/legacy_ipc_widget_input_handler.h
@@ -27,14 +27,13 @@
   void SetEditCommandsForNextKeyEvent(
       const std::vector<EditCommand>& commands) override;
   void CursorVisibilityChanged(bool visible) override;
-  void ImeSetComposition(
-      const base::string16& text,
-      const std::vector<ui::CompositionUnderline>& underlines,
-      const gfx::Range& range,
-      int32_t start,
-      int32_t end) override;
+  void ImeSetComposition(const base::string16& text,
+                         const std::vector<ui::ImeTextSpan>& ime_text_spans,
+                         const gfx::Range& range,
+                         int32_t start,
+                         int32_t end) override;
   void ImeCommitText(const base::string16& text,
-                     const std::vector<ui::CompositionUnderline>& underlines,
+                     const std::vector<ui::ImeTextSpan>& ime_text_spans,
                      const gfx::Range& range,
                      int32_t relative_cursor_position) override;
   void ImeFinishComposingText(bool keep_selection) override;
diff --git a/content/browser/renderer_host/input/mock_widget_input_handler.cc b/content/browser/renderer_host/input/mock_widget_input_handler.cc
index df93838..5e9c0f7 100644
--- a/content/browser/renderer_host/input/mock_widget_input_handler.cc
+++ b/content/browser/renderer_host/input/mock_widget_input_handler.cc
@@ -32,14 +32,14 @@
 
 void MockWidgetInputHandler::ImeSetComposition(
     const base::string16& text,
-    const std::vector<ui::CompositionUnderline>& underlines,
+    const std::vector<ui::ImeTextSpan>& ime_text_spans,
     const gfx::Range& range,
     int32_t start,
     int32_t end) {}
 
 void MockWidgetInputHandler::ImeCommitText(
     const base::string16& text,
-    const std::vector<ui::CompositionUnderline>& underlines,
+    const std::vector<ui::ImeTextSpan>& ime_text_spans,
     const gfx::Range& range,
     int32_t relative_cursor_position) {}
 
diff --git a/content/browser/renderer_host/input/mock_widget_input_handler.h b/content/browser/renderer_host/input/mock_widget_input_handler.h
index 8eb481b..adae4d3 100644
--- a/content/browser/renderer_host/input/mock_widget_input_handler.h
+++ b/content/browser/renderer_host/input/mock_widget_input_handler.h
@@ -36,14 +36,13 @@
   void SetEditCommandsForNextKeyEvent(
       const std::vector<content::EditCommand>& commands) override;
   void CursorVisibilityChanged(bool visible) override;
-  void ImeSetComposition(
-      const base::string16& text,
-      const std::vector<ui::CompositionUnderline>& underlines,
-      const gfx::Range& range,
-      int32_t start,
-      int32_t end) override;
+  void ImeSetComposition(const base::string16& text,
+                         const std::vector<ui::ImeTextSpan>& ime_text_spans,
+                         const gfx::Range& range,
+                         int32_t start,
+                         int32_t end) override;
   void ImeCommitText(const base::string16& text,
-                     const std::vector<ui::CompositionUnderline>& underlines,
+                     const std::vector<ui::ImeTextSpan>& ime_text_spans,
                      const gfx::Range& range,
                      int32_t relative_cursor_position) override;
   void ImeFinishComposingText(bool keep_selection) override;
diff --git a/content/browser/renderer_host/media/audio_input_device_manager.cc b/content/browser/renderer_host/media/audio_input_device_manager.cc
index 876e113..581e2b1 100644
--- a/content/browser/renderer_host/media/audio_input_device_manager.cc
+++ b/content/browser/renderer_host/media/audio_input_device_manager.cc
@@ -168,25 +168,13 @@
   UMA_HISTOGRAM_TIMES("Media.AudioInputDeviceManager.OpenOnDeviceThreadTime",
                       base::TimeTicks::Now() - start_time);
 
-  media::AudioParameters valid_input_params =
-      input_params.IsValid()
-          ? input_params
-          : media::AudioParameters::UnavailableDeviceParams();
-
   StreamDeviceInfo info(device.type, device.name, device.id);
   info.session_id = session_id;
-  info.device.input.sample_rate = valid_input_params.sample_rate();
-  info.device.input.channel_layout = valid_input_params.channel_layout();
-  info.device.input.frames_per_buffer = valid_input_params.frames_per_buffer();
-  info.device.input.effects = valid_input_params.effects();
-  info.device.input.mic_positions = valid_input_params.mic_positions();
+  info.device.input = input_params.IsValid()
+                          ? input_params
+                          : media::AudioParameters::UnavailableDeviceParams();
   info.device.matched_output_device_id = matched_output_device_id;
-  info.device.matched_output.sample_rate = matched_output_params.sample_rate();
-  info.device.matched_output.channel_layout =
-      matched_output_params.channel_layout();
-  info.device.matched_output.frames_per_buffer =
-      matched_output_params.frames_per_buffer();
-  info.device.matched_output.effects = matched_output_params.effects();
+  info.device.matched_output = matched_output_params;
 
   devices_.push_back(info);
 
diff --git a/content/browser/renderer_host/media/audio_input_device_manager_unittest.cc b/content/browser/renderer_host/media/audio_input_device_manager_unittest.cc
index cfb976b..e0ce863 100644
--- a/content/browser/renderer_host/media/audio_input_device_manager_unittest.cc
+++ b/content/browser/renderer_host/media/audio_input_device_manager_unittest.cc
@@ -343,10 +343,9 @@
         manager_->GetOpenedDeviceInfoById(session_id);
     EXPECT_TRUE(
         media::AudioParameters(media::AudioParameters::AUDIO_FAKE,
-                               static_cast<media::ChannelLayout>(
-                                   device_info->device.input.channel_layout),
-                               device_info->device.input.sample_rate, 16,
-                               device_info->device.input.frames_per_buffer)
+                               device_info->device.input.channel_layout(),
+                               device_info->device.input.sample_rate(), 16,
+                               device_info->device.input.frames_per_buffer())
             .IsValid());
 
     manager_->Close(session_id);
diff --git a/content/browser/renderer_host/media/audio_output_authorization_handler.cc b/content/browser/renderer_host/media/audio_output_authorization_handler.cc
index 9bdfbc9..b19c9978 100644
--- a/content/browser/renderer_host/media/audio_output_authorization_handler.cc
+++ b/content/browser/renderer_host/media/audio_output_authorization_handler.cc
@@ -131,11 +131,10 @@
     if (info && !info->device.matched_output_device_id.empty()) {
       media::AudioParameters params(
           media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
-          static_cast<media::ChannelLayout>(
-              info->device.matched_output.channel_layout),
-          info->device.matched_output.sample_rate, 16,
-          info->device.matched_output.frames_per_buffer);
-      params.set_effects(info->device.matched_output.effects);
+          info->device.matched_output.channel_layout(),
+          info->device.matched_output.sample_rate(), 16,
+          info->device.matched_output.frames_per_buffer());
+      params.set_effects(info->device.matched_output.effects());
 
       // We don't need the origin for authorization in this case, but it's used
       // for hashing the device id before sending it back to the renderer.
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc
index 661136c6..6f353fa3 100644
--- a/content/browser/renderer_host/media/media_stream_manager.cc
+++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -1175,10 +1175,10 @@
           *existing_device_info = device_info;
           // Make sure that the audio |effects| reflect what the request
           // is set to and not what the capabilities are.
-          FilterAudioEffects(request->controls,
-                             &existing_device_info->device.input.effects);
-          EnableHotwordEffect(request->controls,
-                              &existing_device_info->device.input.effects);
+          int effects = existing_device_info->device.input.effects();
+          FilterAudioEffects(request->controls, &effects);
+          EnableHotwordEffect(request->controls, &effects);
+          existing_device_info->device.input.set_effects(effects);
           *existing_request_state = request->state(device_info.device.type);
           return true;
         }
@@ -1308,6 +1308,7 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DVLOG(1) << "Opened({stream_type = " << stream_type <<  "} "
            << "{capture_session_id = " << capture_session_id << "})";
+
   // Find the request(s) containing this device and mark it as used.
   // It can be used in several requests since the same device can be
   // requested from the same web page.
@@ -1336,10 +1337,10 @@
             // parameters to the default settings (including supported effects),
             // we need to adjust those settings here according to what the
             // request asks for.
-            FilterAudioEffects(request->controls,
-                               &device_info.device.input.effects);
-            EnableHotwordEffect(request->controls,
-                                &device_info.device.input.effects);
+            int effects = device_info.device.input.effects();
+            FilterAudioEffects(request->controls, &effects);
+            EnableHotwordEffect(request->controls, &effects);
+            device_info.device.input.set_effects(effects);
 
             device_info.device.matched_output = info->device.matched_output;
           }
@@ -1504,8 +1505,13 @@
       if (sample_rate <= 0 || sample_rate > 96000)
         sample_rate = 44100;
 
-      device_info.device.input.sample_rate = sample_rate;
-      device_info.device.input.channel_layout = media::CHANNEL_LAYOUT_STEREO;
+      media::AudioParameters params(
+          device_info.device.input.format(), media::CHANNEL_LAYOUT_STEREO,
+          sample_rate, device_info.device.input.bits_per_sample(),
+          device_info.device.input.frames_per_buffer());
+      params.set_effects(device_info.device.input.effects());
+      params.set_mic_positions(device_info.device.input.mic_positions());
+      device_info.device.input = params;
     }
 
     if (device_info.device.type == request->audio_type())
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 503f889..ccf75652 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -803,6 +803,12 @@
 // sites are hosted by a RenderProcessHost. This class is meant to help reusing
 // RenderProcessHosts among SiteInstances, not to perform security checks for a
 // RenderProcessHost.
+//
+// TODO(alexmos): Currently, the tracking in this class and in
+// UnmatchedServiceWorkerProcessTracker is associated with a BrowserContext,
+// but it needs to also consider StoragePartitions, so that process reuse is
+// allowed only within the same StoragePartition.  For now, the tracking is
+// done only for the default StoragePartition.  See https://crbug.com/752667.
 const void* const kCommittedSiteProcessCountTrackerKey =
     "CommittedSiteProcessCountTrackerKey";
 const void* const kPendingSiteProcessCountTrackerKey =
@@ -898,6 +904,37 @@
   CountPerProcessPerSiteMap map_;
 };
 
+bool ShouldUseSiteProcessTracking(BrowserContext* browser_context,
+                                  StoragePartition* dest_partition,
+                                  const GURL& site_url) {
+  if (site_url.is_empty())
+    return false;
+
+  // TODO(alexmos): Sites should be tracked separately for each
+  // StoragePartition.  For now, track them only in the default one.
+  StoragePartition* default_partition =
+      BrowserContext::GetDefaultStoragePartition(browser_context);
+  if (dest_partition != default_partition)
+    return false;
+
+  return true;
+}
+
+bool ShouldTrackProcessForSite(BrowserContext* browser_context,
+                               RenderProcessHost* render_process_host,
+                               const GURL& site_url) {
+  return ShouldUseSiteProcessTracking(
+      browser_context, render_process_host->GetStoragePartition(), site_url);
+}
+
+bool ShouldFindReusableProcessHostForSite(BrowserContext* browser_context,
+                                          const GURL& site_url) {
+  return ShouldUseSiteProcessTracking(
+      browser_context,
+      BrowserContext::GetStoragePartitionForSite(browser_context, site_url),
+      site_url);
+}
+
 const void* const kUnmatchedServiceWorkerProcessTrackerKey =
     "UnmatchedServiceWorkerProcessTrackerKey";
 
@@ -910,6 +947,12 @@
 // processes are reused for a navigation to a matching site. After a single
 // matching navigation is put into the process, all service workers for that
 // site in that process are considered 'matched.'
+//
+// TODO(alexmos): Currently, the tracking in this class and in
+// SiteProcessCountTracker is associated with a BrowserContext, but it needs to
+// also consider StoragePartitions, so that process reuse is allowed only
+// within the same StoragePartition.  For now, the tracking is done only for
+// the default StoragePartition.  See https://crbug.com/752667.
 class UnmatchedServiceWorkerProcessTracker
     : public base::SupportsUserData::Data,
       public RenderProcessHostObserver {
@@ -920,6 +963,10 @@
                        RenderProcessHost* render_process_host,
                        const GURL& site_url) {
     DCHECK(!site_url.is_empty());
+    if (!ShouldTrackProcessForSite(browser_context, render_process_host,
+                                   site_url))
+      return;
+
     UnmatchedServiceWorkerProcessTracker* tracker =
         static_cast<UnmatchedServiceWorkerProcessTracker*>(
             browser_context->GetUserData(
@@ -936,8 +983,9 @@
   // the process from the tracker if it exists.
   static RenderProcessHost* MatchWithSite(BrowserContext* browser_context,
                                           const GURL& site_url) {
-    if (site_url.is_empty())
+    if (!ShouldFindReusableProcessHostForSite(browser_context, site_url))
       return nullptr;
+
     UnmatchedServiceWorkerProcessTracker* tracker =
         static_cast<UnmatchedServiceWorkerProcessTracker*>(
             browser_context->GetUserData(
@@ -1986,7 +2034,7 @@
 }
 
 void RenderProcessHostImpl::BindSharedBitmapAllocationNotifier(
-    cc::mojom::SharedBitmapAllocationNotifierRequest request) {
+    viz::mojom::SharedBitmapAllocationNotifierRequest request) {
   shared_bitmap_allocation_notifier_impl_.Bind(std::move(request));
 }
 
@@ -2261,7 +2309,8 @@
     BrowserContext* browser_context,
     RenderProcessHost* render_process_host,
     const GURL& site_url) {
-  if (site_url.is_empty())
+  if (!ShouldTrackProcessForSite(browser_context, render_process_host,
+                                 site_url))
     return;
 
   SiteProcessCountTracker* tracker = static_cast<SiteProcessCountTracker*>(
@@ -2279,7 +2328,8 @@
     BrowserContext* browser_context,
     RenderProcessHost* render_process_host,
     const GURL& site_url) {
-  if (site_url.is_empty())
+  if (!ShouldTrackProcessForSite(browser_context, render_process_host,
+                                 site_url))
     return;
 
   SiteProcessCountTracker* tracker = static_cast<SiteProcessCountTracker*>(
@@ -2297,7 +2347,8 @@
     BrowserContext* browser_context,
     RenderProcessHost* render_process_host,
     const GURL& site_url) {
-  if (site_url.is_empty())
+  if (!ShouldTrackProcessForSite(browser_context, render_process_host,
+                                 site_url))
     return;
 
   SiteProcessCountTracker* tracker = static_cast<SiteProcessCountTracker*>(
@@ -2315,7 +2366,8 @@
     BrowserContext* browser_context,
     RenderProcessHost* render_process_host,
     const GURL& site_url) {
-  if (site_url.is_empty())
+  if (!ShouldTrackProcessForSite(browser_context, render_process_host,
+                                 site_url))
     return;
 
   SiteProcessCountTracker* tracker = static_cast<SiteProcessCountTracker*>(
@@ -3889,7 +3941,7 @@
 RenderProcessHost* RenderProcessHostImpl::FindReusableProcessHostForSite(
     BrowserContext* browser_context,
     const GURL& site_url) {
-  if (site_url.is_empty())
+  if (!ShouldFindReusableProcessHostForSite(browser_context, site_url))
     return nullptr;
 
   std::set<RenderProcessHost*> eligible_foreground_hosts;
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h
index ede5f06..546795b 100644
--- a/content/browser/renderer_host/render_process_host_impl.h
+++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -439,7 +439,7 @@
       blink::mojom::OffscreenCanvasProviderRequest request);
   void BindFrameSinkProvider(mojom::FrameSinkProviderRequest request);
   void BindSharedBitmapAllocationNotifier(
-      cc::mojom::SharedBitmapAllocationNotifierRequest request);
+      viz::mojom::SharedBitmapAllocationNotifierRequest request);
   void CreateStoragePartitionService(
       mojom::StoragePartitionServiceRequest request);
   void CreateRendererHost(mojom::RendererHostRequest request);
diff --git a/content/browser/renderer_host/render_process_host_unittest.cc b/content/browser/renderer_host/render_process_host_unittest.cc
index c5db4da3..7952100 100644
--- a/content/browser/renderer_host/render_process_host_unittest.cc
+++ b/content/browser/renderer_host/render_process_host_unittest.cc
@@ -754,6 +754,97 @@
   EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess());
 }
 
+// Helper test class to modify the StoragePartition returned for a particular
+// site URL.
+class StoragePartitionContentBrowserClient : public ContentBrowserClient {
+ public:
+  StoragePartitionContentBrowserClient(const GURL& site,
+                                       const std::string& partition_domain,
+                                       const std::string& partition_name)
+      : site_(site),
+        partition_domain_(partition_domain),
+        partition_name_(partition_name) {}
+  ~StoragePartitionContentBrowserClient() override {}
+
+ private:
+  void GetStoragePartitionConfigForSite(BrowserContext* browser_context,
+                                        const GURL& site,
+                                        bool can_be_default,
+                                        std::string* partition_domain,
+                                        std::string* partition_name,
+                                        bool* in_memory) override {
+    partition_domain->clear();
+    partition_name->clear();
+    *in_memory = false;
+
+    if (site == site_) {
+      *partition_domain = partition_domain_;
+      *partition_name = partition_name_;
+    }
+  }
+
+  GURL site_;
+  std::string partition_domain_;
+  std::string partition_name_;
+};
+
+// Check that a SiteInstance cannot reuse a RenderProcessHost in a different
+// StoragePartition.
+TEST_F(RenderProcessHostUnitTest,
+       DoNotReuseProcessInDifferentStoragePartition) {
+  const GURL kUrl("https://foo.com");
+  NavigateAndCommit(kUrl);
+
+  // Change foo.com SiteInstances to use a different StoragePartition.
+  StoragePartitionContentBrowserClient modified_client(kUrl, "foo_domain",
+                                                       "foo_name");
+  ContentBrowserClient* regular_client =
+      SetBrowserClientForTesting(&modified_client);
+
+  // Create a foo.com SiteInstance and check that its process does not
+  // reuse the foo process from the first navigation, since it's now in a
+  // different StoragePartiiton.
+  scoped_refptr<SiteInstanceImpl> site_instance =
+      SiteInstanceImpl::CreateForURL(browser_context(), kUrl);
+  site_instance->set_process_reuse_policy(
+      SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE);
+  RenderProcessHost* process = site_instance->GetProcess();
+  EXPECT_NE(main_test_rfh()->GetProcess(), process);
+
+  SetBrowserClientForTesting(regular_client);
+}
+
+// Check that a SiteInstance cannot reuse a ServiceWorker process in a
+// different StoragePartition.
+TEST_F(RenderProcessHostUnitTest,
+       DoNotReuseServiceWorkerProcessInDifferentStoragePartition) {
+  const GURL kUrl("https://foo.com");
+
+  // Create a RenderProcessHost for a service worker.
+  scoped_refptr<SiteInstanceImpl> sw_site_instance =
+      SiteInstanceImpl::CreateForURL(browser_context(), kUrl);
+  sw_site_instance->set_is_for_service_worker();
+  RenderProcessHost* sw_process = sw_site_instance->GetProcess();
+
+  // Change foo.com SiteInstances to use a different StoragePartition.
+  StoragePartitionContentBrowserClient modified_client(kUrl, "foo_domain",
+                                                       "foo_name");
+  ContentBrowserClient* regular_client =
+      SetBrowserClientForTesting(&modified_client);
+
+  // Create a foo.com SiteInstance and check that its process does not reuse
+  // the ServiceWorker foo.com process, since it's now in a different
+  // StoragePartition.
+  scoped_refptr<SiteInstanceImpl> site_instance =
+      SiteInstanceImpl::CreateForURL(browser_context(), kUrl);
+  site_instance->set_process_reuse_policy(
+      SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE);
+  RenderProcessHost* process = site_instance->GetProcess();
+  EXPECT_NE(sw_process, process);
+
+  SetBrowserClientForTesting(regular_client);
+}
+
 class SpareRenderProcessHostUnitTest : public RenderViewHostImplTestHarness {
  protected:
   void SetUp() override {
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index 66146f0..4d07580 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -83,7 +83,7 @@
 #include "skia/ext/image_operations.h"
 #include "skia/ext/platform_canvas.h"
 #include "storage/browser/fileapi/isolated_context.h"
-#include "third_party/WebKit/public/web/WebCompositionUnderline.h"
+#include "third_party/WebKit/public/web/WebImeTextSpan.h"
 #include "ui/base/clipboard/clipboard.h"
 #include "ui/base/ui_base_switches.h"
 #include "ui/display/display_switches.h"
@@ -1719,21 +1719,21 @@
 
 void RenderWidgetHostImpl::ImeSetComposition(
     const base::string16& text,
-    const std::vector<ui::CompositionUnderline>& underlines,
+    const std::vector<ui::ImeTextSpan>& ime_text_spans,
     const gfx::Range& replacement_range,
     int selection_start,
     int selection_end) {
   GetWidgetInputHandler()->ImeSetComposition(
-      text, underlines, replacement_range, selection_start, selection_end);
+      text, ime_text_spans, replacement_range, selection_start, selection_end);
 }
 
 void RenderWidgetHostImpl::ImeCommitText(
     const base::string16& text,
-    const std::vector<ui::CompositionUnderline>& underlines,
+    const std::vector<ui::ImeTextSpan>& ime_text_spans,
     const gfx::Range& replacement_range,
     int relative_cursor_pos) {
-  GetWidgetInputHandler()->ImeCommitText(text, underlines, replacement_range,
-                                         relative_cursor_pos);
+  GetWidgetInputHandler()->ImeCommitText(
+      text, ime_text_spans, replacement_range, relative_cursor_pos);
 }
 
 void RenderWidgetHostImpl::ImeFinishComposingText(bool keep_selection) {
@@ -1741,9 +1741,9 @@
 }
 
 void RenderWidgetHostImpl::ImeCancelComposition() {
-  GetWidgetInputHandler()->ImeSetComposition(
-      base::string16(), std::vector<ui::CompositionUnderline>(),
-      gfx::Range::InvalidRange(), 0, 0);
+  GetWidgetInputHandler()->ImeSetComposition(base::string16(),
+                                             std::vector<ui::ImeTextSpan>(),
+                                             gfx::Range::InvalidRange(), 0, 0);
 }
 
 void RenderWidgetHostImpl::RejectMouseLockOrUnlockIfNecessary() {
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h
index 8cc27498..52b5fa9 100644
--- a/content/browser/renderer_host/render_widget_host_impl.h
+++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -415,12 +415,11 @@
   //   (on Windows);
   // * when it receives a "preedit_changed" signal of GtkIMContext (on Linux);
   // * when markedText of NSTextInput is called (on Mac).
-  void ImeSetComposition(
-      const base::string16& text,
-      const std::vector<ui::CompositionUnderline>& underlines,
-      const gfx::Range& replacement_range,
-      int selection_start,
-      int selection_end);
+  void ImeSetComposition(const base::string16& text,
+                         const std::vector<ui::ImeTextSpan>& ime_text_spans,
+                         const gfx::Range& replacement_range,
+                         int selection_start,
+                         int selection_end);
 
   // Deletes the ongoing composition if any, inserts the specified text, and
   // moves the cursor.
@@ -430,7 +429,7 @@
   // * when it receives a "commit" signal of GtkIMContext (on Linux);
   // * when insertText of NSTextInput is called (on Mac).
   void ImeCommitText(const base::string16& text,
-                     const std::vector<ui::CompositionUnderline>& underlines,
+                     const std::vector<ui::ImeTextSpan>& ime_text_spans,
                      const gfx::Range& replacement_range,
                      int relative_cursor_pos);
 
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index 0793aa9..f18390c 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -743,7 +743,10 @@
 }
 
 void RenderWidgetHostViewAndroid::UpdateCursor(const WebCursor& cursor) {
-  // There are no cursors on Android.
+  CursorInfo cursor_info;
+  cursor.GetCursorInfo(&cursor_info);
+  view_.OnCursorChanged(cursor_info.type, cursor_info.custom_image,
+                        cursor_info.hotspot);
 }
 
 void RenderWidgetHostViewAndroid::SetIsLoading(bool is_loading) {
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
index ffd1e2ee..f693b0e3 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -61,7 +61,7 @@
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "services/ui/public/interfaces/window_manager_constants.mojom.h"
 #include "third_party/WebKit/public/platform/WebInputEvent.h"
-#include "third_party/WebKit/public/web/WebCompositionUnderline.h"
+#include "third_party/WebKit/public/web/WebImeTextSpan.h"
 #include "ui/accessibility/platform/aura_window_properties.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/client/cursor_client.h"
@@ -1191,7 +1191,7 @@
   // TODO(suzhe): due to a bug of webkit, we can't use selection range with
   // composition string. See: https://bugs.webkit.org/show_bug.cgi?id=37788
   text_input_manager_->GetActiveWidget()->ImeSetComposition(
-      composition.text, composition.underlines, gfx::Range::InvalidRange(),
+      composition.text, composition.ime_text_spans, gfx::Range::InvalidRange(),
       composition.selection.end(), composition.selection.end());
 
   has_composition_text_ = !composition.text.empty();
@@ -1218,8 +1218,7 @@
   if (text_input_manager_ && text_input_manager_->GetActiveWidget()) {
     if (text.length())
       text_input_manager_->GetActiveWidget()->ImeCommitText(
-          text, std::vector<ui::CompositionUnderline>(),
-          gfx::Range::InvalidRange(), 0);
+          text, std::vector<ui::ImeTextSpan>(), gfx::Range::InvalidRange(), 0);
     else if (has_composition_text_)
       text_input_manager_->GetActiveWidget()->ImeFinishComposingText(false);
   }
diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
index fa9609c..c111633 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
@@ -1648,14 +1648,14 @@
   composition_text.text = base::ASCIIToUTF16("|a|b");
 
   // Focused segment
-  composition_text.underlines.push_back(
-      ui::CompositionUnderline(0, 3, 0xff000000, true, 0x78563412));
+  composition_text.ime_text_spans.push_back(
+      ui::ImeTextSpan(0, 3, 0xff000000, true, 0x78563412));
 
   // Non-focused segment, with different background color.
-  composition_text.underlines.push_back(
-      ui::CompositionUnderline(3, 4, 0xff000000, false, 0xefcdab90));
+  composition_text.ime_text_spans.push_back(
+      ui::ImeTextSpan(3, 4, 0xff000000, false, 0xefcdab90));
 
-  const ui::CompositionUnderlines& underlines = composition_text.underlines;
+  const ui::ImeTextSpans& ime_text_spans = composition_text.ime_text_spans;
 
   // Caret is at the end. (This emulates Japanese MSIME 2007 and later)
   composition_text.selection = gfx::Range(4);
@@ -1672,15 +1672,16 @@
     InputMsg_ImeSetComposition::Read(msg, &params);
     // composition text
     EXPECT_EQ(composition_text.text, std::get<0>(params));
-    // underlines
-    ASSERT_EQ(underlines.size(), std::get<1>(params).size());
-    for (size_t i = 0; i < underlines.size(); ++i) {
-      EXPECT_EQ(underlines[i].start_offset,
+    // ime spans
+    ASSERT_EQ(ime_text_spans.size(), std::get<1>(params).size());
+    for (size_t i = 0; i < ime_text_spans.size(); ++i) {
+      EXPECT_EQ(ime_text_spans[i].start_offset,
                 std::get<1>(params)[i].start_offset);
-      EXPECT_EQ(underlines[i].end_offset, std::get<1>(params)[i].end_offset);
-      EXPECT_EQ(underlines[i].color, std::get<1>(params)[i].color);
-      EXPECT_EQ(underlines[i].thick, std::get<1>(params)[i].thick);
-      EXPECT_EQ(underlines[i].background_color,
+      EXPECT_EQ(ime_text_spans[i].end_offset,
+                std::get<1>(params)[i].end_offset);
+      EXPECT_EQ(ime_text_spans[i].color, std::get<1>(params)[i].color);
+      EXPECT_EQ(ime_text_spans[i].thick, std::get<1>(params)[i].thick);
+      EXPECT_EQ(ime_text_spans[i].background_color,
                 std::get<1>(params)[i].background_color);
     }
     EXPECT_EQ(gfx::Range::InvalidRange(), std::get<2>(params));
@@ -1704,12 +1705,12 @@
   composition_text.text = base::ASCIIToUTF16("|a|b");
 
   // Focused segment
-  composition_text.underlines.push_back(
-      ui::CompositionUnderline(0, 3, 0xff000000, true, 0x78563412));
+  composition_text.ime_text_spans.push_back(
+      ui::ImeTextSpan(0, 3, 0xff000000, true, 0x78563412));
 
   // Non-focused segment, with different background color.
-  composition_text.underlines.push_back(
-      ui::CompositionUnderline(3, 4, 0xff000000, false, 0xefcdab90));
+  composition_text.ime_text_spans.push_back(
+      ui::ImeTextSpan(3, 4, 0xff000000, false, 0xefcdab90));
 
   // Caret is at the end. (This emulates Japanese MSIME 2007 and later)
   composition_text.selection = gfx::Range(4);
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.h b/content/browser/renderer_host/render_widget_host_view_mac.h
index 9374bf3..72664cd 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.h
+++ b/content/browser/renderer_host/render_widget_host_view_mac.h
@@ -37,7 +37,7 @@
 #import "ui/base/cocoa/command_dispatcher.h"
 #include "ui/base/cocoa/remote_layer_api.h"
 #import "ui/base/cocoa/tool_tip_base_view.h"
-#include "ui/base/ime/composition_underline.h"
+#include "ui/base/ime/ime_text_span.h"
 #include "ui/display/display_observer.h"
 
 namespace content {
@@ -127,7 +127,7 @@
   NSRange markedTextSelectedRange_;
 
   // Underline information of the |markedText_|.
-  std::vector<ui::CompositionUnderline> underlines_;
+  std::vector<ui::ImeTextSpan> ime_text_spans_;
 
   // Replacement range information received from |setMarkedText:|.
   gfx::Range setMarkedTextReplacementRange_;
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm
index db0fb3681..d61f81f 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -280,7 +280,7 @@
 // Extract underline information from an attributed string. Mostly copied from
 // third_party/WebKit/Source/WebKit/mac/WebView/WebHTMLView.mm
 void ExtractUnderlines(NSAttributedString* string,
-                       std::vector<ui::CompositionUnderline>* underlines) {
+                       std::vector<ui::ImeTextSpan>* ime_text_spans) {
   int length = [[string string] length];
   int i = 0;
   while (i < length) {
@@ -295,9 +295,9 @@
         color = WebColorFromNSColor(
             [colorAttr colorUsingColorSpaceName:NSDeviceRGBColorSpace]);
       }
-      underlines->push_back(
-          ui::CompositionUnderline(range.location, NSMaxRange(range), color,
-                                   [style intValue] > 1, SK_ColorTRANSPARENT));
+      ime_text_spans->push_back(
+          ui::ImeTextSpan(range.location, NSMaxRange(range), color,
+                          [style intValue] > 1, SK_ColorTRANSPARENT));
     }
     i = range.location + range.length;
   }
@@ -2197,7 +2197,7 @@
   textToBeInserted_.clear();
   markedText_.clear();
   markedTextSelectedRange_ = NSMakeRange(NSNotFound, 0);
-  underlines_.clear();
+  ime_text_spans_.clear();
   setMarkedTextReplacementRange_ = gfx::Range::InvalidRange();
   unmarkTextCalled_ = NO;
   hasEditCommands_ = NO;
@@ -2259,8 +2259,7 @@
   BOOL textInserted = NO;
   if (textToBeInserted_.length() >
       ((hasMarkedText_ || oldHasMarkedText) ? 0u : 1u)) {
-    widgetHost->ImeCommitText(textToBeInserted_,
-                              std::vector<ui::CompositionUnderline>(),
+    widgetHost->ImeCommitText(textToBeInserted_, std::vector<ui::ImeTextSpan>(),
                               gfx::Range::InvalidRange(), 0);
     textInserted = YES;
   }
@@ -2272,7 +2271,7 @@
     // composition node in WebKit.
     // When marked text is available, |markedTextSelectedRange_| will be the
     // range being selected inside the marked text.
-    widgetHost->ImeSetComposition(markedText_, underlines_,
+    widgetHost->ImeSetComposition(markedText_, ime_text_spans_,
                                   setMarkedTextReplacementRange_,
                                   markedTextSelectedRange_.location,
                                   NSMaxRange(markedTextSelectedRange_));
@@ -3306,7 +3305,7 @@
   hasMarkedText_ = NO;
   markedText_.clear();
   markedTextSelectedRange_ = NSMakeRange(NSNotFound, 0);
-  underlines_.clear();
+  ime_text_spans_.clear();
 
   // If we are handling a key down event, then FinishComposingText() will be
   // called in keyEvent: method.
@@ -3335,13 +3334,13 @@
   markedText_ = base::SysNSStringToUTF16(im_text);
   hasMarkedText_ = (length > 0);
 
-  underlines_.clear();
+  ime_text_spans_.clear();
   if (isAttributedString) {
-    ExtractUnderlines(string, &underlines_);
+    ExtractUnderlines(string, &ime_text_spans_);
   } else {
     // Use a thin black underline by default.
-    underlines_.push_back(ui::CompositionUnderline(0, length, SK_ColorBLACK,
-                                                   false, SK_ColorTRANSPARENT));
+    ime_text_spans_.push_back(
+        ui::ImeTextSpan(0, length, SK_ColorBLACK, false, SK_ColorTRANSPARENT));
   }
 
   // If we are handling a key down event, then SetComposition() will be
@@ -3356,7 +3355,7 @@
   } else {
     if (renderWidgetHostView_->GetActiveWidget()) {
       renderWidgetHostView_->GetActiveWidget()->ImeSetComposition(
-          markedText_, underlines_, gfx::Range(replacementRange),
+          markedText_, ime_text_spans_, gfx::Range(replacementRange),
           newSelRange.location, NSMaxRange(newSelRange));
     }
   }
@@ -3415,8 +3414,8 @@
     gfx::Range replacement_range(replacementRange);
     if (renderWidgetHostView_->GetActiveWidget()) {
       renderWidgetHostView_->GetActiveWidget()->ImeCommitText(
-          base::SysNSStringToUTF16(im_text),
-          std::vector<ui::CompositionUnderline>(), replacement_range, 0);
+          base::SysNSStringToUTF16(im_text), std::vector<ui::ImeTextSpan>(),
+          replacement_range, 0);
     }
   }
 
diff --git a/content/browser/service_worker/embedded_worker_test_helper.cc b/content/browser/service_worker/embedded_worker_test_helper.cc
index 29101c3..ae990c7 100644
--- a/content/browser/service_worker/embedded_worker_test_helper.cc
+++ b/content/browser/service_worker/embedded_worker_test_helper.cc
@@ -324,8 +324,7 @@
   scoped_refptr<base::SequencedTaskRunner> database_task_runner =
       base::ThreadTaskRunnerHandle::Get();
   wrapper_->InitInternal(user_data_directory, std::move(database_task_runner),
-                         base::ThreadTaskRunnerHandle::Get(), nullptr, nullptr,
-                         nullptr, nullptr);
+                         nullptr, nullptr, nullptr, nullptr);
   wrapper_->process_manager()->SetProcessIdForTest(mock_render_process_id());
   wrapper_->process_manager()->SetNewProcessIdForTest(new_render_process_id());
 
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc
index 0da7ae5..192fb408 100644
--- a/content/browser/service_worker/service_worker_context_core.cc
+++ b/content/browser/service_worker/service_worker_context_core.cc
@@ -237,7 +237,6 @@
 ServiceWorkerContextCore::ServiceWorkerContextCore(
     const base::FilePath& path,
     scoped_refptr<base::SequencedTaskRunner> database_task_runner,
-    scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread,
     storage::QuotaManagerProxy* quota_manager_proxy,
     storage::SpecialStoragePolicy* special_storage_policy,
     base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
@@ -259,8 +258,7 @@
   // These get a WeakPtr from weak_factory_, so must be set after weak_factory_
   // is initialized.
   storage_ = ServiceWorkerStorage::Create(
-      path, AsWeakPtr(), std::move(database_task_runner),
-      std::move(disk_cache_thread), quota_manager_proxy,
+      path, AsWeakPtr(), std::move(database_task_runner), quota_manager_proxy,
       special_storage_policy);
   embedded_worker_registry_ = EmbeddedWorkerRegistry::Create(AsWeakPtr());
   job_coordinator_.reset(new ServiceWorkerJobCoordinator(AsWeakPtr()));
diff --git a/content/browser/service_worker/service_worker_context_core.h b/content/browser/service_worker/service_worker_context_core.h
index 62f5142..29dcfc4 100644
--- a/content/browser/service_worker/service_worker_context_core.h
+++ b/content/browser/service_worker/service_worker_context_core.h
@@ -31,7 +31,6 @@
 
 namespace base {
 class FilePath;
-class SingleThreadTaskRunner;
 }
 
 namespace storage {
@@ -117,7 +116,6 @@
   ServiceWorkerContextCore(
       const base::FilePath& user_data_directory,
       scoped_refptr<base::SequencedTaskRunner> database_task_runner,
-      scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread,
       storage::QuotaManagerProxy* quota_manager_proxy,
       storage::SpecialStoragePolicy* special_storage_policy,
       base::WeakPtr<storage::BlobStorageContext> blob_context,
diff --git a/content/browser/service_worker/service_worker_context_unittest.cc b/content/browser/service_worker/service_worker_context_unittest.cc
index 28f6242..fee4a77b 100644
--- a/content/browser/service_worker/service_worker_context_unittest.cc
+++ b/content/browser/service_worker/service_worker_context_unittest.cc
@@ -699,7 +699,7 @@
       MakeRegisteredCallback(&called, &registration_id));
 
   ASSERT_FALSE(called);
-  base::RunLoop().RunUntilIdle();
+  content::RunAllBlockingPoolTasksUntilIdle();
   EXPECT_TRUE(called);
 
   context()->storage()->FindRegistrationForId(
@@ -709,7 +709,7 @@
                  SERVICE_WORKER_OK,
                  false /* expect_waiting */,
                  true /* expect_active */));
-  base::RunLoop().RunUntilIdle();
+  content::RunAllBlockingPoolTasksUntilIdle();
 
   // Next handle ids should be 1 (the next call should return 2) because
   // registered worker should have taken ID 0.
@@ -724,7 +724,7 @@
       registration_id, pattern.GetOrigin(),
       base::Bind(&ExpectRegisteredWorkers, SERVICE_WORKER_ERROR_ABORT,
                  false /* expect_waiting */, true /* expect_active */));
-  base::RunLoop().RunUntilIdle();
+  content::RunAllBlockingPoolTasksUntilIdle();
 
   // The context started over and the storage was re-initialized, so the
   // registration should not be found.
@@ -735,7 +735,7 @@
                  SERVICE_WORKER_ERROR_NOT_FOUND,
                  false /* expect_waiting */,
                  true /* expect_active */));
-  base::RunLoop().RunUntilIdle();
+  content::RunAllBlockingPoolTasksUntilIdle();
 
   called = false;
   context()->RegisterServiceWorker(
@@ -743,7 +743,7 @@
       MakeRegisteredCallback(&called, &registration_id));
 
   ASSERT_FALSE(called);
-  base::RunLoop().RunUntilIdle();
+  content::RunAllBlockingPoolTasksUntilIdle();
   EXPECT_TRUE(called);
 
   context()->storage()->FindRegistrationForId(
@@ -753,7 +753,7 @@
                  SERVICE_WORKER_OK,
                  false /* expect_waiting */,
                  true /* expect_active */));
-  base::RunLoop().RunUntilIdle();
+  content::RunAllBlockingPoolTasksUntilIdle();
 
   // The new context should take over next handle ids. ID 2 should have been
   // taken by the running registration, so the following method calls return 3.
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc
index a95eca5..5ca5bcb 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.cc
+++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -199,11 +199,9 @@
   scoped_refptr<base::SequencedTaskRunner> database_task_runner =
       base::CreateSequencedTaskRunnerWithTraits(
           {base::MayBlock(), base::TaskShutdownBehavior::BLOCK_SHUTDOWN});
-  scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread =
-      BrowserThread::GetTaskRunnerForThread(BrowserThread::CACHE);
   InitInternal(user_data_directory, std::move(database_task_runner),
-               std::move(disk_cache_thread), quota_manager_proxy,
-               special_storage_policy, blob_context, loader_factory_getter);
+               quota_manager_proxy, special_storage_policy, blob_context,
+               loader_factory_getter);
 }
 
 void ServiceWorkerContextWrapper::Shutdown() {
@@ -851,7 +849,6 @@
 void ServiceWorkerContextWrapper::InitInternal(
     const base::FilePath& user_data_directory,
     scoped_refptr<base::SequencedTaskRunner> database_task_runner,
-    scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread,
     storage::QuotaManagerProxy* quota_manager_proxy,
     storage::SpecialStoragePolicy* special_storage_policy,
     ChromeBlobStorageContext* blob_context,
@@ -861,7 +858,6 @@
         BrowserThread::IO, FROM_HERE,
         base::Bind(&ServiceWorkerContextWrapper::InitInternal, this,
                    user_data_directory, std::move(database_task_runner),
-                   std::move(disk_cache_thread),
                    base::RetainedRef(quota_manager_proxy),
                    base::RetainedRef(special_storage_policy),
                    base::RetainedRef(blob_context),
@@ -882,10 +878,9 @@
           ? blob_context->context()->AsWeakPtr()
           : nullptr;
   context_core_.reset(new ServiceWorkerContextCore(
-      user_data_directory, std::move(database_task_runner),
-      std::move(disk_cache_thread), quota_manager_proxy, special_storage_policy,
-      blob_storage_context, loader_factory_getter, core_observer_list_.get(),
-      this));
+      user_data_directory, std::move(database_task_runner), quota_manager_proxy,
+      special_storage_policy, blob_storage_context, loader_factory_getter,
+      core_observer_list_.get(), this));
 }
 
 void ServiceWorkerContextWrapper::ShutdownOnIO() {
diff --git a/content/browser/service_worker/service_worker_context_wrapper.h b/content/browser/service_worker/service_worker_context_wrapper.h
index 557e01f..ed9a9f1 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.h
+++ b/content/browser/service_worker/service_worker_context_wrapper.h
@@ -23,7 +23,6 @@
 
 namespace base {
 class FilePath;
-class SingleThreadTaskRunner;
 }
 
 namespace storage {
@@ -277,7 +276,6 @@
   void InitInternal(
       const base::FilePath& user_data_directory,
       scoped_refptr<base::SequencedTaskRunner> database_task_runner,
-      scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread,
       storage::QuotaManagerProxy* quota_manager_proxy,
       storage::SpecialStoragePolicy* special_storage_policy,
       ChromeBlobStorageContext* blob_context,
diff --git a/content/browser/service_worker/service_worker_installed_scripts_sender.cc b/content/browser/service_worker/service_worker_installed_scripts_sender.cc
index bf4cbfed..51c683e 100644
--- a/content/browser/service_worker/service_worker_installed_scripts_sender.cc
+++ b/content/browser/service_worker/service_worker_installed_scripts_sender.cc
@@ -10,8 +10,8 @@
 #include "content/browser/service_worker/service_worker_disk_cache.h"
 #include "content/browser/service_worker/service_worker_script_cache_map.h"
 #include "content/browser/service_worker/service_worker_storage.h"
-#include "content/common/net_adapters.h"
 #include "net/http/http_response_headers.h"
+#include "services/network/public/cpp/net_adapters.h"
 
 namespace content {
 
@@ -176,7 +176,7 @@
     // an equivalent error.
     DCHECK(!pending_write_);
     uint32_t num_bytes = 0;
-    MojoResult rv = NetToMojoPendingBuffer::BeginWrite(
+    MojoResult rv = network::NetToMojoPendingBuffer::BeginWrite(
         &body_handle_, &pending_write_, &num_bytes);
     switch (rv) {
       case MOJO_RESULT_INVALID_ARGUMENT:
@@ -193,8 +193,8 @@
         break;
     }
 
-    scoped_refptr<NetToMojoIOBuffer> buffer =
-        base::MakeRefCounted<NetToMojoIOBuffer>(pending_write_.get());
+    scoped_refptr<network::NetToMojoIOBuffer> buffer =
+        base::MakeRefCounted<network::NetToMojoIOBuffer>(pending_write_.get());
     reader_->ReadData(buffer.get(), num_bytes,
                       base::Bind(&Sender::OnResponseDataRead, AsWeakPtr()));
   }
@@ -253,7 +253,7 @@
   std::unique_ptr<MetaDataSender> meta_data_sender_;
 
   // For body.
-  scoped_refptr<NetToMojoPendingBuffer> pending_write_;
+  scoped_refptr<network::NetToMojoPendingBuffer> pending_write_;
   mojo::SimpleWatcher watcher_;
 
   // Pipes.
diff --git a/content/browser/service_worker/service_worker_storage.cc b/content/browser/service_worker/service_worker_storage.cc
index a810d71a..1bc1b23 100644
--- a/content/browser/service_worker/service_worker_storage.cc
+++ b/content/browser/service_worker/service_worker_storage.cc
@@ -5,16 +5,15 @@
 #include "content/browser/service_worker/service_worker_storage.h"
 
 #include <stddef.h>
+#include <utility>
 
 #include "base/bind_helpers.h"
 #include "base/files/file_util.h"
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/sequenced_task_runner.h"
-#include "base/single_thread_task_runner.h"
 #include "base/task_runner_util.h"
 #include "base/task_scheduler/post_task.h"
-#include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
 #include "content/browser/service_worker/service_worker_context_core.h"
 #include "content/browser/service_worker/service_worker_disk_cache.h"
@@ -30,6 +29,8 @@
 #include "storage/browser/quota/quota_manager_proxy.h"
 #include "storage/browser/quota/special_storage_policy.h"
 
+using std::swap;
+
 namespace content {
 
 namespace {
@@ -121,12 +122,10 @@
     const base::FilePath& path,
     const base::WeakPtr<ServiceWorkerContextCore>& context,
     scoped_refptr<base::SequencedTaskRunner> database_task_runner,
-    scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread,
     storage::QuotaManagerProxy* quota_manager_proxy,
     storage::SpecialStoragePolicy* special_storage_policy) {
   return base::WrapUnique(
       new ServiceWorkerStorage(path, context, std::move(database_task_runner),
-                               std::move(disk_cache_thread),
                                quota_manager_proxy, special_storage_policy));
 }
 
@@ -136,7 +135,7 @@
     ServiceWorkerStorage* old_storage) {
   return base::WrapUnique(new ServiceWorkerStorage(
       old_storage->path_, context, old_storage->database_task_runner_,
-      old_storage->disk_cache_thread_, old_storage->quota_manager_proxy_.get(),
+      old_storage->quota_manager_proxy_.get(),
       old_storage->special_storage_policy_.get()));
 }
 
@@ -810,13 +809,27 @@
 void ServiceWorkerStorage::DeleteAndStartOver(const StatusCallback& callback) {
   Disable();
 
-  // Delete the database on the database thread.
-  base::PostTaskAndReplyWithResult(
-      database_task_runner_.get(), FROM_HERE,
-      base::Bind(&ServiceWorkerDatabase::DestroyDatabase,
-                 base::Unretained(database_.get())),
-      base::Bind(&ServiceWorkerStorage::DidDeleteDatabase,
-                 weak_factory_.GetWeakPtr(), callback));
+  // Will be used in DiskCacheImplDoneWithDisk()
+  delete_and_start_over_callback_ = callback;
+
+  // Won't get a callback about cleanup being done, so call it ourselves.
+  if (!expecting_done_with_disk_on_disable_)
+    DiskCacheImplDoneWithDisk();
+}
+
+void ServiceWorkerStorage::DiskCacheImplDoneWithDisk() {
+  expecting_done_with_disk_on_disable_ = false;
+  if (!delete_and_start_over_callback_.is_null()) {
+    StatusCallback callback;
+    swap(callback, delete_and_start_over_callback_);
+    // Delete the database on the database thread.
+    PostTaskAndReplyWithResult(
+        database_task_runner_.get(), FROM_HERE,
+        base::Bind(&ServiceWorkerDatabase::DestroyDatabase,
+                   base::Unretained(database_.get())),
+        base::Bind(&ServiceWorkerStorage::DidDeleteDatabase,
+                   weak_factory_.GetWeakPtr(), callback));
+  }
 }
 
 int64_t ServiceWorkerStorage::NewRegistrationId() {
@@ -891,17 +904,16 @@
     const base::FilePath& path,
     base::WeakPtr<ServiceWorkerContextCore> context,
     scoped_refptr<base::SequencedTaskRunner> database_task_runner,
-    scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread,
     storage::QuotaManagerProxy* quota_manager_proxy,
     storage::SpecialStoragePolicy* special_storage_policy)
     : next_registration_id_(kInvalidServiceWorkerRegistrationId),
       next_version_id_(kInvalidServiceWorkerVersionId),
       next_resource_id_(kInvalidServiceWorkerResourceId),
       state_(UNINITIALIZED),
+      expecting_done_with_disk_on_disable_(false),
       path_(path),
       context_(context),
       database_task_runner_(std::move(database_task_runner)),
-      disk_cache_thread_(std::move(disk_cache_thread)),
       quota_manager_proxy_(quota_manager_proxy),
       special_storage_policy_(special_storage_policy),
       is_purge_pending_(false),
@@ -1435,8 +1447,11 @@
 
 void ServiceWorkerStorage::InitializeDiskCache() {
   disk_cache_->set_is_waiting_to_initialize(false);
+  expecting_done_with_disk_on_disable_ = true;
   int rv = disk_cache_->InitWithDiskBackend(
-      GetDiskCachePath(), kMaxDiskCacheSize, false, disk_cache_thread_,
+      GetDiskCachePath(), kMaxDiskCacheSize, false,
+      base::BindOnce(&ServiceWorkerStorage::DiskCacheImplDoneWithDisk,
+                     weak_factory_.GetWeakPtr()),
       base::Bind(&ServiceWorkerStorage::OnDiskCacheInitialized,
                  weak_factory_.GetWeakPtr()));
   if (rv != net::ERR_IO_PENDING)
@@ -1894,12 +1909,18 @@
   }
   DVLOG(1) << "Deleted ServiceWorkerDatabase successfully.";
 
-  // Delete the disk cache on the cache thread.
+  // Delete the disk cache. Use BLOCK_SHUTDOWN to try to avoid things being
+  // half-deleted.
+  // TODO(falken): Investigate if BLOCK_SHUTDOWN is needed, as the next startup
+  // is expected to cleanup the disk cache anyway. Also investigate whether
+  // ClearSessionOnlyOrigins() should try to delete relevant entries from the
+  // disk cache before shutdown.
+
   // TODO(nhiroki): What if there is a bunch of files in the cache directory?
   // Deleting the directory could take a long time and restart could be delayed.
   // We should probably rename the directory and delete it later.
-  base::PostTaskAndReplyWithResult(
-      disk_cache_thread_.get(), FROM_HERE,
+  PostTaskWithTraitsAndReplyWithResult(
+      FROM_HERE, {base::MayBlock(), base::TaskShutdownBehavior::BLOCK_SHUTDOWN},
       base::Bind(&base::DeleteFile, GetDiskCachePath(), true),
       base::Bind(&ServiceWorkerStorage::DidDeleteDiskCache,
                  weak_factory_.GetWeakPtr(), callback));
diff --git a/content/browser/service_worker/service_worker_storage.h b/content/browser/service_worker/service_worker_storage.h
index a588025f..243428f 100644
--- a/content/browser/service_worker/service_worker_storage.h
+++ b/content/browser/service_worker/service_worker_storage.h
@@ -28,7 +28,6 @@
 
 namespace base {
 class SequencedTaskRunner;
-class SingleThreadTaskRunner;
 }
 
 namespace storage {
@@ -82,7 +81,6 @@
       const base::FilePath& path,
       const base::WeakPtr<ServiceWorkerContextCore>& context,
       scoped_refptr<base::SequencedTaskRunner> database_task_runner,
-      scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread,
       storage::QuotaManagerProxy* quota_manager_proxy,
       storage::SpecialStoragePolicy* special_storage_policy);
 
@@ -355,7 +353,6 @@
       const base::FilePath& path,
       base::WeakPtr<ServiceWorkerContextCore> context,
       scoped_refptr<base::SequencedTaskRunner> database_task_runner,
-      scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread,
       storage::QuotaManagerProxy* quota_manager_proxy,
       storage::SpecialStoragePolicy* special_storage_policy);
 
@@ -531,9 +528,13 @@
 
   bool IsDisabled() const;
   void ScheduleDeleteAndStartOver();
-  void DidDeleteDatabase(
-      const StatusCallback& callback,
-      ServiceWorkerDatabase::Status status);
+
+  // Posted by the underlying cache implementation after it finishes making
+  // disk changes upon its destruction.
+  void DiskCacheImplDoneWithDisk();
+  void DidDeleteDatabase(const StatusCallback& callback,
+                         ServiceWorkerDatabase::Status status);
+  // Posted when we finish deleting the cache directory.
   void DidDeleteDiskCache(
       const StatusCallback& callback,
       bool result);
@@ -561,6 +562,19 @@
   };
   State state_;
 
+  // non-null between when DeleteAndStartOver() is called and when the
+  // underlying disk cache stops using the disk.
+  StatusCallback delete_and_start_over_callback_;
+
+  // This is set when we know that a call to Disable() will result in
+  // DiskCacheImplDoneWithDisk() eventually called. This might not happen
+  // for many reasons:
+  // 1) A previous call to Disable() may have already triggered that.
+  // 2) We may be using a memory backend.
+  // 3) |disk_cache_| might not have been created yet.
+  // ... so it's easier to keep track of the case when it will happen.
+  bool expecting_done_with_disk_on_disable_;
+
   base::FilePath path_;
 
   // The context should be valid while the storage is alive.
@@ -570,7 +584,6 @@
   std::unique_ptr<ServiceWorkerDatabase> database_;
   scoped_refptr<base::SequencedTaskRunner> database_task_runner_;
 
-  scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread_;
   scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy_;
   scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy_;
 
diff --git a/content/browser/service_worker/service_worker_storage_unittest.cc b/content/browser/service_worker/service_worker_storage_unittest.cc
index 0fd82a1..e0c29fb 100644
--- a/content/browser/service_worker/service_worker_storage_unittest.cc
+++ b/content/browser/service_worker/service_worker_storage_unittest.cc
@@ -27,10 +27,12 @@
 #include "content/public/common/content_client.h"
 #include "content/public/common/origin_trial_policy.h"
 #include "content/public/test/test_browser_thread_bundle.h"
+#include "content/public/test/test_utils.h"
 #include "ipc/ipc_message.h"
 #include "net/base/io_buffer.h"
 #include "net/base/net_errors.h"
 #include "net/base/test_completion_callback.h"
+#include "net/disk_cache/disk_cache.h"
 #include "net/http/http_response_headers.h"
 #include "net/http/http_util.h"
 #include "net/test/cert_test_util.h"
@@ -311,7 +313,8 @@
 
   void TearDown() override {
     helper_.reset();
-    base::RunLoop().RunUntilIdle();
+    disk_cache::FlushCacheThreadForTesting();
+    content::RunAllBlockingPoolTasksUntilIdle();
   }
 
   bool InitUserDataDirectory() {
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index 375c004..e159471 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -10175,74 +10175,6 @@
       FrameHostMsg_ContextMenu(rfh->GetRoutingID(), ContextMenuParams()));
 }
 
-// Test iframe "allow" attribute is propagated correctly.
-IN_PROC_BROWSER_TEST_F(SitePerProcessFeaturePolicyBrowserTest, AllowedIFrames) {
-  GURL url(embedded_test_server()->GetURL("/allowed_frames.html"));
-  EXPECT_TRUE(NavigateToURL(shell(), url));
-
-  FrameTreeNode* root = web_contents()->GetFrameTree()->root();
-
-  // Iframes without "allow" attribute, or an empty "allow" attribute will not
-  // have any allowed features propagated.
-  EXPECT_TRUE(
-      root->child_at(0)->frame_owner_properties().allowed_features.empty());
-  EXPECT_TRUE(
-      root->child_at(1)->frame_owner_properties().allowed_features.empty());
-
-  // Make sure the third frame starts out at the correct cross-site page.
-  EXPECT_EQ(embedded_test_server()->GetURL("bar.com", "/title1.html"),
-            root->child_at(2)->current_url());
-  // Check allowed features are propagated correctly for cross-site iframes.
-  EXPECT_EQ(root->child_at(2)->frame_owner_properties().allowed_features.size(),
-            2u);
-  EXPECT_EQ(root->child_at(2)->frame_owner_properties().allowed_features[0],
-            blink::WebFeaturePolicyFeature::kFullscreen);
-  EXPECT_EQ(root->child_at(2)->frame_owner_properties().allowed_features[1],
-            blink::WebFeaturePolicyFeature::kVibrate);
-
-  // Check allowed features are propagated correctly for same-site iframes.
-  EXPECT_EQ(root->child_at(3)->frame_owner_properties().allowed_features.size(),
-            2u);
-  EXPECT_EQ(root->child_at(3)->frame_owner_properties().allowed_features[0],
-            blink::WebFeaturePolicyFeature::kFullscreen);
-  EXPECT_EQ(root->child_at(3)->frame_owner_properties().allowed_features[1],
-            blink::WebFeaturePolicyFeature::kVibrate);
-}
-
-// Test dynamic updates to iframe "allow" attribute are propagated correctly.
-IN_PROC_BROWSER_TEST_F(SitePerProcessFeaturePolicyBrowserTest,
-                       AllowedIFramesDynamic) {
-  GURL main_url(embedded_test_server()->GetURL("/allowed_frames.html"));
-  EXPECT_TRUE(NavigateToURL(shell(), main_url));
-
-  FrameTreeNode* root = web_contents()->GetFrameTree()->root();
-
-  // Test for dynamically removing "allow" attribute.
-  EXPECT_TRUE(ExecuteScript(
-      root, "document.getElementById('child-2').removeAttribute('allow')"));
-  EXPECT_TRUE(
-      root->child_at(2)->frame_owner_properties().allowed_features.empty());
-
-  // Test for dynamically setting "allow" attribute by element.setAttribute.
-  EXPECT_TRUE(ExecuteScript(
-      root,
-      "document.getElementById('child-3').setAttribute('allow', 'payment')"));
-  EXPECT_EQ(root->child_at(3)->frame_owner_properties().allowed_features.size(),
-            1u);
-  EXPECT_EQ(root->child_at(3)->frame_owner_properties().allowed_features[0],
-            blink::WebFeaturePolicyFeature::kPayment);
-
-  // Test for dynamically setting "allow" attribute by frame.allow="...".
-  EXPECT_TRUE(ExecuteScript(
-      root, "document.getElementById('child-3').allow='fullscreen vibrate'"));
-  EXPECT_EQ(root->child_at(3)->frame_owner_properties().allowed_features.size(),
-            2u);
-  EXPECT_EQ(root->child_at(3)->frame_owner_properties().allowed_features[0],
-            blink::WebFeaturePolicyFeature::kFullscreen);
-  EXPECT_EQ(root->child_at(3)->frame_owner_properties().allowed_features[1],
-            blink::WebFeaturePolicyFeature::kVibrate);
-}
-
 // Test iframe container policy is replicated properly to the browser.
 IN_PROC_BROWSER_TEST_F(SitePerProcessFeaturePolicyBrowserTest,
                        ContainerPolicy) {
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 4442c8f7..bec99bd 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -3403,6 +3403,7 @@
 
 void WebContentsImpl::DidGetResourceResponseStart(
   const ResourceRequestDetails& details) {
+  SetNotWaitingForResponse();
   controller_.ssl_manager()->DidStartResourceResponse(
       details.url, details.has_certificate, details.ssl_cert_status);
 
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc
index d588e66..6c74fc6 100644
--- a/content/browser/web_contents/web_contents_impl_browsertest.cc
+++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -244,6 +244,7 @@
   EXPECT_EQ(&shell()->web_contents()->GetController(),
             load_observer.controller_);
 }
+
 // Test that a renderer-initiated navigation to an invalid URL does not leave
 // around a pending entry that could be used in a URL spoof.  We test this in
 // a browser test because our unit test framework incorrectly calls
@@ -484,13 +485,15 @@
   base::string16 title = title_watcher.WaitAndGetTitle();
   ASSERT_EQ(title, base::ASCIIToUTF16("pushState"));
 
-  // LoadingStateChanged should be called 4 times: start and stop for the
-  // initial load of push_state.html, and start and stop for the "navigation"
-  // triggered by history.pushState(). However, the start notification for the
-  // history.pushState() navigation should set to_different_document to false.
+  // LoadingStateChanged should be called 5 times: start and stop for the
+  // initial load of push_state.html, once for the switch from
+  // IsWaitingForResponse() to !IsWaitingForResponse(), and start and stop for
+  // the "navigation" triggered by history.pushState(). However, the start
+  // notification for the history.pushState() navigation should set
+  // to_different_document to false.
   EXPECT_EQ("pushState", shell()->web_contents()->GetLastCommittedURL().ref());
-  EXPECT_EQ(4, delegate->loadingStateChangedCount());
-  EXPECT_EQ(3, delegate->loadingStateToDifferentDocumentCount());
+  EXPECT_EQ(5, delegate->loadingStateChangedCount());
+  EXPECT_EQ(4, delegate->loadingStateToDifferentDocumentCount());
 }
 
 IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
@@ -512,6 +515,55 @@
   EXPECT_TRUE(new_web_contents_observer.RenderViewCreatedCalled());
 }
 
+namespace {
+
+class DidGetResourceResponseStartObserver : public WebContentsObserver {
+ public:
+  DidGetResourceResponseStartObserver(Shell* shell)
+      : WebContentsObserver(shell->web_contents()), shell_(shell) {
+    shell->web_contents()->SetDelegate(&delegate_);
+    EXPECT_FALSE(shell->web_contents()->IsWaitingForResponse());
+    EXPECT_FALSE(shell->web_contents()->IsLoading());
+  }
+
+  ~DidGetResourceResponseStartObserver() override {}
+
+  void DidGetResourceResponseStart(
+      const ResourceRequestDetails& details) override {
+    EXPECT_FALSE(shell_->web_contents()->IsWaitingForResponse());
+    EXPECT_TRUE(shell_->web_contents()->IsLoading());
+    EXPECT_GT(delegate_.loadingStateChangedCount(), 0);
+    ++resource_response_start_count_;
+  }
+
+  int resource_response_start_count() const {
+    return resource_response_start_count_;
+  }
+
+ private:
+  Shell* shell_;
+  LoadingStateChangedDelegate delegate_;
+  int resource_response_start_count_ = 0;
+
+  DISALLOW_COPY_AND_ASSIGN(DidGetResourceResponseStartObserver);
+};
+
+}  // namespace
+
+// Makes sure that the WebContents is no longer marked as waiting for a response
+// after DidGetResourceResponseStart() is called.
+IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
+                       DidGetResourceResponseStartUpdatesWaitingState) {
+  DidGetResourceResponseStartObserver observer(shell());
+
+  ASSERT_TRUE(embedded_test_server()->Start());
+  LoadStopNotificationObserver load_observer(
+      &shell()->web_contents()->GetController());
+  NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html"));
+  load_observer.Wait();
+  EXPECT_GT(observer.resource_response_start_count(), 0);
+}
+
 struct LoadProgressDelegateAndObserver : public WebContentsDelegate,
                                          public WebContentsObserver {
   LoadProgressDelegateAndObserver(Shell* shell)
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index ecb25838..0f2c3b3 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -245,8 +245,6 @@
     "net/url_request_service_worker_data.h",
     "net/url_request_user_data.cc",
     "net/url_request_user_data.h",
-    "net_adapters.cc",
-    "net_adapters.h",
     "origin_trials/trial_token.cc",
     "origin_trials/trial_token.h",
     "origin_trials/trial_token_validator.cc",
diff --git a/content/common/DEPS b/content/common/DEPS
index 736590dd..c0da6de2 100644
--- a/content/common/DEPS
+++ b/content/common/DEPS
@@ -65,12 +65,12 @@
   "+third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerState.h",
   "+third_party/WebKit/public/platform/modules/serviceworker/service_worker_event_status.mojom.h",
   "+third_party/WebKit/public/web/WebAXEnums.h",
-  "+third_party/WebKit/public/web/WebCompositionUnderline.h",
   "+third_party/WebKit/public/web/WebDeviceEmulationParams.h",
   "+third_party/WebKit/public/web/WebDragStatus.h",
   "+third_party/WebKit/public/web/WebFindOptions.h",
   "+third_party/WebKit/public/web/WebFrameOwnerProperties.h",
   "+third_party/WebKit/public/web/WebFrameSerializerCacheControlPolicy.h",
+  "+third_party/WebKit/public/web/WebImeTextSpan.h",
   "+third_party/WebKit/public/web/WebMediaPlayerAction.h",
   "+third_party/WebKit/public/web/WebPluginAction.h",
   "+third_party/WebKit/public/web/WebPopupType.h",
diff --git a/content/common/browser_plugin/browser_plugin_messages.h b/content/common/browser_plugin/browser_plugin_messages.h
index 57ac7ad..1258423 100644
--- a/content/common/browser_plugin/browser_plugin_messages.h
+++ b/content/common/browser_plugin/browser_plugin_messages.h
@@ -18,8 +18,8 @@
 #include "ipc/ipc_message_utils.h"
 #include "third_party/WebKit/public/platform/WebDragOperation.h"
 #include "third_party/WebKit/public/platform/WebFocusType.h"
-#include "third_party/WebKit/public/web/WebCompositionUnderline.h"
 #include "third_party/WebKit/public/web/WebDragStatus.h"
+#include "third_party/WebKit/public/web/WebImeTextSpan.h"
 #include "ui/gfx/geometry/point.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
@@ -45,7 +45,7 @@
 
 IPC_STRUCT_BEGIN(BrowserPluginHostMsg_SetComposition_Params)
   IPC_STRUCT_MEMBER(base::string16, text)
-  IPC_STRUCT_MEMBER(std::vector<blink::WebCompositionUnderline>, underlines)
+  IPC_STRUCT_MEMBER(std::vector<blink::WebImeTextSpan>, ime_text_spans)
   IPC_STRUCT_MEMBER(gfx::Range, replacement_range)
   IPC_STRUCT_MEMBER(int, selection_start)
   IPC_STRUCT_MEMBER(int, selection_end)
@@ -81,13 +81,12 @@
 
 // This message is sent from BrowserPlugin to BrowserPluginGuest to notify that
 // deleting the current composition and inserting specified text is requested.
-IPC_MESSAGE_CONTROL5(
-    BrowserPluginHostMsg_ImeCommitText,
-    int /* browser_plugin_instance_id */,
-    base::string16 /* text */,
-    std::vector<blink::WebCompositionUnderline> /* underlines */,
-    gfx::Range /* replacement_range */,
-    int /* relative_cursor_pos */)
+IPC_MESSAGE_CONTROL5(BrowserPluginHostMsg_ImeCommitText,
+                     int /* browser_plugin_instance_id */,
+                     base::string16 /* text */,
+                     std::vector<blink::WebImeTextSpan> /* ime_text_spans */,
+                     gfx::Range /* replacement_range */,
+                     int /* relative_cursor_pos */)
 
 // This message is sent from BrowserPlugin to BrowserPluginGuest to notify that
 // inserting the current composition is requested.
diff --git a/content/common/common.sb b/content/common/common.sb
index fbe0ff5..f8fe48b 100644
--- a/content/common/common.sb
+++ b/content/common/common.sb
@@ -19,6 +19,7 @@
 (define permitted-dir "PERMITTED_DIR")
 (define homedir-as-literal "USER_HOMEDIR_AS_LITERAL")
 (define elcap-or-later "ELCAP_OR_LATER")
+(define macos-1013 "MACOS_1013")
 
 ; Consumes a subpath and appends it to the user's homedir path.
 (define (user-homedir-path subpath)
diff --git a/content/common/content_param_traits_macros.h b/content/common/content_param_traits_macros.h
index a1187c78..9c5638e 100644
--- a/content/common/content_param_traits_macros.h
+++ b/content/common/content_param_traits_macros.h
@@ -21,7 +21,7 @@
 #include "third_party/WebKit/public/platform/WebContentSecurityPolicy.h"
 #include "third_party/WebKit/public/platform/WebInputEvent.h"
 #include "third_party/WebKit/public/platform/WebPageVisibilityState.h"
-#include "third_party/WebKit/public/web/WebCompositionUnderline.h"
+#include "third_party/WebKit/public/web/WebImeTextSpan.h"
 #include "third_party/WebKit/public/web/WebSharedWorkerCreationContextType.h"
 #include "ui/gfx/gpu_memory_buffer.h"
 #include "ui/gfx/ipc/geometry/gfx_param_traits.h"
@@ -52,7 +52,7 @@
 IPC_ENUM_TRAITS_MAX_VALUE(blink::WebPageVisibilityState,
                           blink::kWebPageVisibilityStateLast)
 
-IPC_STRUCT_TRAITS_BEGIN(blink::WebCompositionUnderline)
+IPC_STRUCT_TRAITS_BEGIN(blink::WebImeTextSpan)
   IPC_STRUCT_TRAITS_MEMBER(start_offset)
   IPC_STRUCT_TRAITS_MEMBER(end_offset)
   IPC_STRUCT_TRAITS_MEMBER(color)
diff --git a/content/common/dom_storage/dom_storage_messages.h b/content/common/dom_storage/dom_storage_messages.h
index 3325bf9b..dc552833 100644
--- a/content/common/dom_storage/dom_storage_messages.h
+++ b/content/common/dom_storage/dom_storage_messages.h
@@ -77,17 +77,19 @@
 
 // Set a value that's associated with a key in a storage area.
 // A completion notification is sent in response.
-IPC_MESSAGE_CONTROL4(DOMStorageHostMsg_SetItem,
+IPC_MESSAGE_CONTROL5(DOMStorageHostMsg_SetItem,
                      int /* connection_id */,
                      base::string16 /* key */,
                      base::string16 /* value */,
+                     base::NullableString16 /* client_old_value */,
                      GURL /* page_url */)
 
 // Remove the value associated with a key in a storage area.
 // A completion notification is sent in response.
-IPC_MESSAGE_CONTROL3(DOMStorageHostMsg_RemoveItem,
+IPC_MESSAGE_CONTROL4(DOMStorageHostMsg_RemoveItem,
                      int /* connection_id */,
                      base::string16 /* key */,
+                     base::NullableString16 /* client_old_value */,
                      GURL /* page_url */)
 
 // Clear the storage area. A completion notification is sent in response.
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h
index e9ad8745..a0c1fa7 100644
--- a/content/common/frame_messages.h
+++ b/content/common/frame_messages.h
@@ -193,7 +193,6 @@
   IPC_STRUCT_TRAITS_MEMBER(allow_payment_request)
   IPC_STRUCT_TRAITS_MEMBER(is_display_none)
   IPC_STRUCT_TRAITS_MEMBER(required_csp)
-  IPC_STRUCT_TRAITS_MEMBER(allowed_features)
 IPC_STRUCT_TRAITS_END()
 
 IPC_STRUCT_TRAITS_BEGIN(content::PageImportanceSignals)
diff --git a/content/common/frame_owner_properties.cc b/content/common/frame_owner_properties.cc
index bbe3764..0a135b4d 100644
--- a/content/common/frame_owner_properties.cc
+++ b/content/common/frame_owner_properties.cc
@@ -26,8 +26,7 @@
          allow_fullscreen == other.allow_fullscreen &&
          allow_payment_request == other.allow_payment_request &&
          is_display_none == other.is_display_none &&
-         required_csp == other.required_csp &&
-         allowed_features == other.allowed_features;
+         required_csp == other.required_csp;
 }
 
 }  // namespace content
diff --git a/content/common/frame_owner_properties.h b/content/common/frame_owner_properties.h
index 693d482..00bd2919 100644
--- a/content/common/frame_owner_properties.h
+++ b/content/common/frame_owner_properties.h
@@ -40,8 +40,6 @@
   // for a frame. See https://crbug.com/647588 and
   // https://www.w3.org/TR/csp-embedded-enforcement/#required-csp
   std::string required_csp;
-
-  std::vector<blink::WebFeaturePolicyFeature> allowed_features;
 };
 
 }  // namespace content
diff --git a/content/common/input/input_handler.mojom b/content/common/input/input_handler.mojom
index 39cc748..2613a00 100644
--- a/content/common/input/input_handler.mojom
+++ b/content/common/input/input_handler.mojom
@@ -169,13 +169,13 @@
 
   // This message sends a string being composed with an input method.
   ImeSetComposition(mojo.common.mojom.String16 text,
-                    array<ui.mojom.CompositionUnderline> underlines,
+                    array<ui.mojom.ImeTextSpan> ime_text_spans,
                     gfx.mojom.Range range, int32 start, int32 end);
 
   // This message deletes the current composition, inserts specified text, and
   // moves the cursor.
   ImeCommitText(mojo.common.mojom.String16 text,
-                array<ui.mojom.CompositionUnderline> underlines,
+                array<ui.mojom.ImeTextSpan> ime_text_spans,
                 gfx.mojom.Range range, int32 relative_cursor_position);
 
   // This message inserts the ongoing composition.
@@ -216,7 +216,7 @@
   // Sets the text composition to be between the given start and end offsets in
   // the currently focused editable field.
   SetCompositionFromExistingText(
-      int32 start, int32 end, array<ui.mojom.CompositionUnderline> underlines);
+      int32 start, int32 end, array<ui.mojom.ImeTextSpan> ime_text_spans);
 
   // Deletes the current selection plus the specified number of characters
   // before and after the selection or caret.
diff --git a/content/common/input_messages.h b/content/common/input_messages.h
index 142f8db4..73dedb03 100644
--- a/content/common/input_messages.h
+++ b/content/common/input_messages.h
@@ -169,9 +169,9 @@
 // Sets the text composition to be between the given start and end offsets in
 // the currently focused editable field.
 IPC_MESSAGE_ROUTED3(InputMsg_SetCompositionFromExistingText,
-    int /* start */,
-    int /* end */,
-    std::vector<blink::WebCompositionUnderline> /* underlines */)
+                    int /* start */,
+                    int /* end */,
+                    std::vector<blink::WebImeTextSpan> /* ime_text_spans */)
 
 // Deletes the current selection plus the specified number of characters before
 // and after the selection or caret.
@@ -201,22 +201,20 @@
                     int /* end */)
 
 // This message sends a string being composed with an input method.
-IPC_MESSAGE_ROUTED5(
-    InputMsg_ImeSetComposition,
-    base::string16, /* text */
-    std::vector<blink::WebCompositionUnderline>, /* underlines */
-    gfx::Range /* replacement_range */,
-    int, /* selectiont_start */
-    int /* selection_end */)
+IPC_MESSAGE_ROUTED5(InputMsg_ImeSetComposition,
+                    base::string16,                     /* text */
+                    std::vector<blink::WebImeTextSpan>, /* ime_text_spans */
+                    gfx::Range /* replacement_range */,
+                    int, /* selectiont_start */
+                    int /* selection_end */)
 
 // This message deletes the current composition, inserts specified text, and
 // moves the cursor.
-IPC_MESSAGE_ROUTED4(
-    InputMsg_ImeCommitText,
-    base::string16 /* text */,
-    std::vector<blink::WebCompositionUnderline>, /* underlines */
-    gfx::Range /* replacement_range */,
-    int /* relative_cursor_pos */)
+IPC_MESSAGE_ROUTED4(InputMsg_ImeCommitText,
+                    base::string16 /* text */,
+                    std::vector<blink::WebImeTextSpan>, /* ime_text_spans */
+                    gfx::Range /* replacement_range */,
+                    int /* relative_cursor_pos */)
 
 // This message inserts the ongoing composition.
 IPC_MESSAGE_ROUTED1(InputMsg_ImeFinishComposingText, bool /* keep_selection */)
diff --git a/content/common/media/media_stream_messages.h b/content/common/media/media_stream_messages.h
index ea288d3..e44672f 100644
--- a/content/common/media/media_stream_messages.h
+++ b/content/common/media/media_stream_messages.h
@@ -25,18 +25,12 @@
 
 IPC_STRUCT_TRAITS_BEGIN(content::StreamDeviceInfo)
   IPC_STRUCT_TRAITS_MEMBER(device.type)
-  IPC_STRUCT_TRAITS_MEMBER(device.name)
   IPC_STRUCT_TRAITS_MEMBER(device.id)
   IPC_STRUCT_TRAITS_MEMBER(device.video_facing)
   IPC_STRUCT_TRAITS_MEMBER(device.matched_output_device_id)
-  IPC_STRUCT_TRAITS_MEMBER(device.input.sample_rate)
-  IPC_STRUCT_TRAITS_MEMBER(device.input.channel_layout)
-  IPC_STRUCT_TRAITS_MEMBER(device.input.frames_per_buffer)
-  IPC_STRUCT_TRAITS_MEMBER(device.input.effects)
-  IPC_STRUCT_TRAITS_MEMBER(device.input.mic_positions)
-  IPC_STRUCT_TRAITS_MEMBER(device.matched_output.sample_rate)
-  IPC_STRUCT_TRAITS_MEMBER(device.matched_output.channel_layout)
-  IPC_STRUCT_TRAITS_MEMBER(device.matched_output.frames_per_buffer)
+  IPC_STRUCT_TRAITS_MEMBER(device.name)
+  IPC_STRUCT_TRAITS_MEMBER(device.input)
+  IPC_STRUCT_TRAITS_MEMBER(device.matched_output)
   IPC_STRUCT_TRAITS_MEMBER(device.camera_calibration)
   IPC_STRUCT_TRAITS_MEMBER(session_id)
 IPC_STRUCT_TRAITS_END()
diff --git a/content/common/render_message_filter.mojom b/content/common/render_message_filter.mojom
index e51d3dc..b61002b7 100644
--- a/content/common/render_message_filter.mojom
+++ b/content/common/render_message_filter.mojom
@@ -4,7 +4,6 @@
 
 module content.mojom;
 
-import "cc/ipc/shared_bitmap_allocation_notifier.mojom";
 import "content/common/input/input_handler.mojom";
 import "content/common/native_types.mojom";
 import "content/common/widget.mojom";
diff --git a/content/common/sandbox_mac.h b/content/common/sandbox_mac.h
index 8496104..93765ed 100644
--- a/content/common/sandbox_mac.h
+++ b/content/common/sandbox_mac.h
@@ -61,6 +61,7 @@
 
   // TODO(kerrnel): this is only for the legacy sandbox.
   static const char* kSandboxElCapOrLater;
+  static const char* kSandboxMacOS1013;
 
  private:
   FRIEND_TEST_ALL_PREFIXES(MacDirAccessSandboxTest, StringEscape);
diff --git a/content/common/sandbox_mac.mm b/content/common/sandbox_mac.mm
index 9156287..e9789fe 100644
--- a/content/common/sandbox_mac.mm
+++ b/content/common/sandbox_mac.mm
@@ -84,6 +84,7 @@
 const char* Sandbox::kSandboxPermittedDir = "PERMITTED_DIR";
 
 const char* Sandbox::kSandboxElCapOrLater = "ELCAP_OR_LATER";
+const char* Sandbox::kSandboxMacOS1013 = "MACOS_1013";
 
 // Warm up System APIs that empirically need to be accessed before the Sandbox
 // is turned on.
@@ -282,6 +283,10 @@
   if (!compiler.InsertBooleanParam(kSandboxElCapOrLater, elcap_or_later))
     return false;
 
+  bool macos_1013 = base::mac::IsOS10_13();
+  if (!compiler.InsertBooleanParam(kSandboxMacOS1013, macos_1013))
+    return false;
+
   // Initialize sandbox.
   std::string error_str;
   bool success = compiler.CompileAndApplyProfile(&error_str);
diff --git a/content/network/BUILD.gn b/content/network/BUILD.gn
index fe29a2cf..cc11dea 100644
--- a/content/network/BUILD.gn
+++ b/content/network/BUILD.gn
@@ -59,6 +59,7 @@
     "//content/public/common:common_sources",
     "//mojo/public/cpp/bindings",
     "//net",
+    "//services/network/public/cpp",
     "//services/service_manager/public/cpp",
     "//services/service_manager/public/interfaces",
   ]
diff --git a/content/network/DEPS b/content/network/DEPS
index 2f038c7..b24d403 100644
--- a/content/network/DEPS
+++ b/content/network/DEPS
@@ -4,7 +4,6 @@
   "-content",
   "+content/common/content_export.h",
   "+content/common/loader_util.h",
-  "+content/common/net_adapters.h",
   "+content/network",
   "+content/public/common/appcache_info.h",
   "+content/public/common/content_client.h",
@@ -18,6 +17,7 @@
   "+content/public/common/url_loader.mojom.h",
   "+content/public/common/url_loader_factory.mojom.h",
   "+content/public/network",
+  "+services/network",
   "+services/service_manager/public",
 ]
 
diff --git a/content/network/url_loader_impl.cc b/content/network/url_loader_impl.cc
index b244f79..140cacd 100644
--- a/content/network/url_loader_impl.cc
+++ b/content/network/url_loader_impl.cc
@@ -8,7 +8,6 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "content/common/loader_util.h"
-#include "content/common/net_adapters.h"
 #include "content/network/network_context.h"
 #include "content/public/common/referrer.h"
 #include "content/public/common/resource_response.h"
@@ -19,6 +18,7 @@
 #include "net/base/upload_bytes_element_reader.h"
 #include "net/base/upload_file_element_reader.h"
 #include "net/url_request/url_request_context.h"
+#include "services/network/public/cpp/net_adapters.h"
 
 namespace content {
 
@@ -289,7 +289,7 @@
   if (!pending_write_.get()) {
     // TODO: we should use the abstractions in MojoAsyncResourceHandler.
     pending_write_buffer_offset_ = 0;
-    MojoResult result = NetToMojoPendingBuffer::BeginWrite(
+    MojoResult result = network::NetToMojoPendingBuffer::BeginWrite(
         &response_body_stream_, &pending_write_, &pending_write_buffer_size_);
     if (result != MOJO_RESULT_OK && result != MOJO_RESULT_SHOULD_WAIT) {
       // The response body stream is in a bad state. Bail.
@@ -313,8 +313,8 @@
     }
   }
 
-  scoped_refptr<net::IOBuffer> buf(new NetToMojoIOBuffer(
-      pending_write_.get(), pending_write_buffer_offset_));
+  auto buf = base::MakeRefCounted<network::NetToMojoIOBuffer>(
+      pending_write_.get(), pending_write_buffer_offset_);
   int bytes_read;
   url_request_->Read(buf.get(),
                      static_cast<int>(pending_write_buffer_size_ -
diff --git a/content/network/url_loader_impl.h b/content/network/url_loader_impl.h
index a349be2..d0c057a9 100644
--- a/content/network/url_loader_impl.h
+++ b/content/network/url_loader_impl.h
@@ -18,10 +18,13 @@
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "net/url_request/url_request.h"
 
+namespace network {
+class NetToMojoPendingBuffer;
+}
+
 namespace content {
 
 class NetworkContext;
-class NetToMojoPendingBuffer;
 struct ResourceResponse;
 
 class CONTENT_EXPORT URLLoaderImpl : public mojom::URLLoader,
@@ -73,7 +76,7 @@
   int64_t total_written_bytes_ = 0;
 
   mojo::ScopedDataPipeProducerHandle response_body_stream_;
-  scoped_refptr<NetToMojoPendingBuffer> pending_write_;
+  scoped_refptr<network::NetToMojoPendingBuffer> pending_write_;
   uint32_t pending_write_buffer_size_ = 0;
   uint32_t pending_write_buffer_offset_ = 0;
   mojo::SimpleWatcher writable_handle_watcher_;
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn
index b07eeb6..23452f5 100644
--- a/content/public/android/BUILD.gn
+++ b/content/public/android/BUILD.gn
@@ -378,7 +378,10 @@
 android_library("content_javatests") {
   testonly = true
 
-  srcjar_deps = [ "//content/shell/android:content_javatests_aidl" ]
+  srcjar_deps = [
+    "//content/shell/android:content_javatests_aidl",
+    "//third_party/WebKit/public:blink_cursor_type_java_enums_srcjar",
+  ]
 
   deps = [
     ":content_java",
@@ -403,6 +406,7 @@
     "//net/android:net_java_test_support",
     "//third_party/android_support_test_runner:rules_java",
     "//third_party/android_support_test_runner:runner_java",
+    "//third_party/android_tools:android_support_annotations_java",
     "//third_party/jsr-305:jsr_305_javalib",
     "//third_party/junit",
     "//ui/android:ui_java",
@@ -418,6 +422,7 @@
     "javatests/src/org/chromium/content/browser/ContentCommandLineTest.java",
     "javatests/src/org/chromium/content/browser/ContentViewCoreSelectionTest.java",
     "javatests/src/org/chromium/content/browser/ContentViewLocationTest.java",
+    "javatests/src/org/chromium/content/browser/ContentViewPointerTypeTest.java",
     "javatests/src/org/chromium/content/browser/ContentViewPopupZoomerTest.java",
     "javatests/src/org/chromium/content/browser/ContentViewScrollingTest.java",
     "javatests/src/org/chromium/content/browser/EncodeHtmlDataUriTest.java",
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java
index 713b236..5370d225 100644
--- a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java
+++ b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java
@@ -872,9 +872,10 @@
     }
 
     @CalledByNative
-    private void populateUnderlinesFromSpans(CharSequence text, long underlines) {
+    private void populateImeTextSpansFromJava(CharSequence text, long imeTextSpans) {
         if (DEBUG_LOGS) {
-            Log.i(TAG, "populateUnderlinesFromSpans: text [%s], underlines [%d]", text, underlines);
+            Log.i(TAG, "populateImeTextSpansFromJava: text [%s], ime_text_spans [%d]", text,
+                    imeTextSpans);
         }
         if (!(text instanceof SpannableString)) return;
 
@@ -883,11 +884,11 @@
                 spannableString.getSpans(0, text.length(), CharacterStyle.class);
         for (CharacterStyle span : spans) {
             if (span instanceof BackgroundColorSpan) {
-                nativeAppendBackgroundColorSpan(underlines, spannableString.getSpanStart(span),
+                nativeAppendBackgroundColorSpan(imeTextSpans, spannableString.getSpanStart(span),
                         spannableString.getSpanEnd(span),
                         ((BackgroundColorSpan) span).getBackgroundColor());
             } else if (span instanceof UnderlineSpan) {
-                nativeAppendUnderlineSpan(underlines, spannableString.getSpanStart(span),
+                nativeAppendUnderlineSpan(imeTextSpans, spannableString.getSpanStart(span),
                         spannableString.getSpanEnd(span));
             }
         }
@@ -917,9 +918,9 @@
     private native boolean nativeSendKeyEvent(long nativeImeAdapterAndroid, KeyEvent event,
             int type, int modifiers, long timestampMs, int keyCode, int scanCode,
             boolean isSystemKey, int unicodeChar);
-    private static native void nativeAppendUnderlineSpan(long underlinePtr, int start, int end);
-    private static native void nativeAppendBackgroundColorSpan(long underlinePtr, int start,
-            int end, int backgroundColor);
+    private static native void nativeAppendUnderlineSpan(long spanPtr, int start, int end);
+    private static native void nativeAppendBackgroundColorSpan(
+            long spanPtr, int start, int end, int backgroundColor);
     private native void nativeSetComposingText(long nativeImeAdapterAndroid, CharSequence text,
             String textStr, int newCursorPosition);
     private native void nativeCommitText(
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/ImeUtils.java b/content/public/android/java/src/org/chromium/content/browser/input/ImeUtils.java
index 8ef905d6..b667c45b 100644
--- a/content/public/android/java/src/org/chromium/content/browser/input/ImeUtils.java
+++ b/content/public/android/java/src/org/chromium/content/browser/input/ImeUtils.java
@@ -44,7 +44,6 @@
             outAttrs.inputType |= EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS;
         }
 
-        int imeAction = 0;
         if (inputMode == WebTextInputMode.DEFAULT) {
             if (inputType == TextInputType.TEXT) {
                 // Normal text field
@@ -112,21 +111,8 @@
             }
         }
 
-        if (inputMode == WebTextInputMode.DEFAULT && inputType == TextInputType.SEARCH) {
-            imeAction |= EditorInfo.IME_ACTION_SEARCH;
-        } else if ((outAttrs.inputType & EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE) != 0) {
-            // For textarea that sends you to another webpage on enter key press using
-            // JavaScript, we will only show ENTER.
-            imeAction |= EditorInfo.IME_ACTION_NONE;
-        } else if ((inputFlags & WebTextInputFlags.HAVE_NEXT_FOCUSABLE_ELEMENT) != 0) {
-            imeAction |= EditorInfo.IME_ACTION_NEXT;
-        } else {
-            // For last element inside form, we should give preference to GO key as PREVIOUS
-            // has less importance in those cases.
-            imeAction |= EditorInfo.IME_ACTION_GO;
-        }
-
-        outAttrs.imeOptions |= imeAction;
+        outAttrs.imeOptions |= getImeAction(inputType, inputFlags, inputMode,
+                (outAttrs.inputType & EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE) != 0);
 
         // Handling of autocapitalize. Blink will send the flag taking into account the element's
         // type. This is not using AutocapitalizeNone because Android does not autocapitalize by
@@ -148,6 +134,25 @@
         outAttrs.initialSelEnd = initialSelEnd;
     }
 
+    private static int getImeAction(
+            int inputType, int inputFlags, int inputMode, boolean isMultiLineInput) {
+        int imeAction = 0;
+        if (inputMode == WebTextInputMode.DEFAULT && inputType == TextInputType.SEARCH) {
+            imeAction |= EditorInfo.IME_ACTION_SEARCH;
+        } else if (isMultiLineInput) {
+            // For textarea that sends you to another webpage on enter key press using
+            // JavaScript, we will only show ENTER.
+            imeAction |= EditorInfo.IME_ACTION_NONE;
+        } else if ((inputFlags & WebTextInputFlags.HAVE_NEXT_FOCUSABLE_ELEMENT) != 0) {
+            imeAction |= EditorInfo.IME_ACTION_NEXT;
+        } else {
+            // For last element inside form, we should give preference to GO key as PREVIOUS
+            // has less importance in those cases.
+            imeAction |= EditorInfo.IME_ACTION_GO;
+        }
+        return imeAction;
+    }
+
     /**
      * @param editorInfo The EditorInfo
      * @return Debug string for the given {@EditorInfo}.
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ContentViewPointerTypeTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ContentViewPointerTypeTest.java
new file mode 100644
index 0000000..2f15755
--- /dev/null
+++ b/content/public/android/javatests/src/org/chromium/content/browser/ContentViewPointerTypeTest.java
@@ -0,0 +1,96 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.content.browser;
+
+import android.graphics.Rect;
+import android.os.SystemClock;
+import android.view.InputDevice;
+import android.view.MotionEvent;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.util.DisabledTest;
+import org.chromium.base.test.util.UrlUtils;
+import org.chromium.blink_public.web.WebCursorInfoType;
+import org.chromium.content.browser.test.ContentJUnit4ClassRunner;
+import org.chromium.content.browser.test.util.DOMUtils;
+import org.chromium.content_shell.ShellViewAndroidDelegate.OnCursorUpdateHelper;
+import org.chromium.content_shell_apk.ContentShellActivityTestRule;
+
+/**
+ * Tests that we can move mouse cursor and test cursor icon.
+ */
+@RunWith(ContentJUnit4ClassRunner.class)
+public class ContentViewPointerTypeTest {
+    @Rule
+    public ContentShellActivityTestRule mActivityTestRule = new ContentShellActivityTestRule();
+
+    private static final String CURSOR_PAGE = UrlUtils.encodeHtmlDataUri("<html>"
+            + "<body><a id=\"hand\" href=\"about:blank\">pointer</a>"
+            + "<span id=\"text\">text</span>"
+            + "<span id=\"help\" style=\"cursor:help;\">help</span></body>"
+            + "</html>");
+
+    @Before
+    public void setUp() throws Exception {
+        mActivityTestRule.launchContentShellWithUrl(CURSOR_PAGE);
+        mActivityTestRule.waitForActiveShellToBeDoneLoading();
+    }
+
+    private void moveCursor(final float x, final float y) throws Throwable {
+        mActivityTestRule.runOnUiThreadForTestCommon(new Runnable() {
+            @Override
+            public void run() {
+                MotionEvent.PointerProperties[] pointerProperties =
+                        new MotionEvent.PointerProperties[1];
+                MotionEvent.PointerProperties pp = new MotionEvent.PointerProperties();
+                pp.id = 0;
+                pp.toolType = MotionEvent.TOOL_TYPE_MOUSE;
+                pointerProperties[0] = pp;
+
+                MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[1];
+                MotionEvent.PointerCoords pc = new MotionEvent.PointerCoords();
+                pc.x = x;
+                pc.y = y;
+                pointerCoords[0] = pc;
+
+                MotionEvent cursorMoveEvent = MotionEvent.obtain(SystemClock.uptimeMillis(),
+                        SystemClock.uptimeMillis() + 1, MotionEvent.ACTION_HOVER_MOVE, 1,
+                        pointerProperties, pointerCoords, 0, 0, 1.0f, 1.0f, 0, 0,
+                        InputDevice.SOURCE_MOUSE, 0);
+                cursorMoveEvent.setSource(InputDevice.SOURCE_MOUSE);
+                mActivityTestRule.getContentViewCore()
+                        .getContainerView()
+                        .dispatchGenericMotionEvent(cursorMoveEvent);
+            }
+        });
+    }
+
+    private void checkPointerTypeForNode(final String nodeId, final int type) throws Throwable {
+        Rect rect = DOMUtils.getNodeBounds(mActivityTestRule.getWebContents(), nodeId);
+        float x = (float) (rect.left + rect.right) / 2.0f;
+        float y = (float) (rect.top + rect.bottom) / 2.0f;
+
+        OnCursorUpdateHelper onCursorUpdateHelper = mActivityTestRule.getOnCursorUpdateHelper();
+        int onCursorUpdateCount = onCursorUpdateHelper.getCallCount();
+        moveCursor(x, y);
+        onCursorUpdateHelper.waitForCallback(onCursorUpdateCount);
+        Assert.assertEquals(type, onCursorUpdateHelper.getPointerType());
+    }
+
+    @Test
+    //@SmallTest
+    //@Feature({"Main"})
+    @DisabledTest(message = "crbug.com/755112")
+    public void testPointerType() throws Throwable {
+        checkPointerTypeForNode("hand", WebCursorInfoType.TYPE_HAND);
+        checkPointerTypeForNode("text", WebCursorInfoType.TYPE_I_BEAM);
+        checkPointerTypeForNode("help", WebCursorInfoType.TYPE_HELP);
+    }
+}
diff --git a/content/public/app/mojo/content_browser_manifest.json b/content/public/app/mojo/content_browser_manifest.json
index 54aadee7..b84e3468 100644
--- a/content/public/app/mojo/content_browser_manifest.json
+++ b/content/public/app/mojo/content_browser_manifest.json
@@ -4,13 +4,14 @@
   "interface_provider_specs": {
     "service_manager:connector": {
       "provides": {
+        // Interfaces needed by a generic client of content browser.
+        "app": [
+          "memory_instrumentation::mojom::Coordinator"
+        ],
         "gpu": [
           "content::mojom::FieldTrialRecorder",
           "media::mojom::AndroidOverlayProvider"
         ],
-        "memory_instrumentation": [
-          "memory_instrumentation::mojom::Coordinator"
-        ],
         "plugin": [
           "discardable_memory::mojom::DiscardableSharedMemoryManager",
           "ui::mojom::Gpu"
@@ -25,7 +26,6 @@
           "blink::mojom::OffscreenCanvasProvider",
           "blink::mojom::PermissionService",
           "blink::mojom::WebSocket",
-          "cc::mojom::SharedBitmapAllocationNotifier",
           "content::mojom::FieldTrialRecorder",
           "content::mojom::FrameSinkProvider",
           "content::mojom::MediaStreamDispatcherHost",
@@ -47,17 +47,14 @@
           "resource_coordinator::mojom::CoordinationUnit",
           "shape_detection::mojom::TextDetection",
           "storage::mojom::BlobRegistry",
-          "ui::mojom::Gpu"
+          "ui::mojom::Gpu",
+          "viz::mojom::SharedBitmapAllocationNotifier"
         ],
         "geolocation_config": [
           "device::mojom::GeolocationConfig"
         ],
         "service_manager:service_factory": [
           "service_manager::mojom::ServiceFactory"
-        ],
-        "utility": [
-          "discardable_memory::mojom::DiscardableSharedMemoryManager",
-          "memory_instrumentation::mojom::Coordinator"
         ]
       },
       "requires": {
@@ -67,7 +64,6 @@
         "content_browser": [
           "ash",
           "display",
-          "memory_instrumentation",
           "url_keyed_metrics",
           "geolocation_config"
         ],
diff --git a/content/public/app/mojo/content_gpu_manifest.json b/content/public/app/mojo/content_gpu_manifest.json
index a7d05d7..336eefdc7 100644
--- a/content/public/app/mojo/content_gpu_manifest.json
+++ b/content/public/app/mojo/content_gpu_manifest.json
@@ -15,7 +15,8 @@
         ]
       },
       "requires": {
-        "content_browser": [ "gpu", "memory_instrumentation" ],
+        "*": [ "app" ],
+        "content_browser": [ "gpu" ],
         "device": [ "device:power_monitor" ]
       }
     }
diff --git a/content/public/app/mojo/content_plugin_manifest.json b/content/public/app/mojo/content_plugin_manifest.json
index ed8f326..fc78b99 100644
--- a/content/public/app/mojo/content_plugin_manifest.json
+++ b/content/public/app/mojo/content_plugin_manifest.json
@@ -4,7 +4,7 @@
   "interface_provider_specs": {
     "service_manager:connector": {
       "provides": {
-        "browser": [ 
+        "browser": [
           "content::mojom::Child",
           "IPC::mojom::ChannelBootstrap"
         ],
@@ -13,6 +13,7 @@
         ]
       },
       "requires": {
+        "*": [ "app" ],
         "content_browser": [ "plugin" ],
         "device": [ "device:power_monitor" ],
         "ui": [ "discardable_memory" ]
diff --git a/content/public/app/mojo/content_renderer_manifest.json b/content/public/app/mojo/content_renderer_manifest.json
index a44f29e..ed32e78 100644
--- a/content/public/app/mojo/content_renderer_manifest.json
+++ b/content/public/app/mojo/content_renderer_manifest.json
@@ -19,7 +19,8 @@
         ]
       },
       "requires": {
-        "content_browser": [ "memory_instrumentation", "renderer" ],
+        "*": [ "app" ],
+        "content_browser": [ "renderer" ],
         "device": [
           "device:battery_monitor",
           "device:power_monitor",
diff --git a/content/public/app/mojo/content_utility_manifest.json b/content/public/app/mojo/content_utility_manifest.json
index 3ea2993..5caad0c 100644
--- a/content/public/app/mojo/content_utility_manifest.json
+++ b/content/public/app/mojo/content_utility_manifest.json
@@ -14,7 +14,7 @@
         ]
       },
       "requires": {
-        "content_browser": [ "memory_instrumentation" ],
+        "*": [ "app" ],
         "device": [
           "device:power_monitor",
           "device:time_zone_monitor"
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn
index 8349727..aa409f7 100644
--- a/content/public/browser/BUILD.gn
+++ b/content/public/browser/BUILD.gn
@@ -231,6 +231,7 @@
     "restore_type.h",
     "save_page_type.h",
     "screen_orientation_delegate.h",
+    "security_style_explanation.cc",
     "security_style_explanation.h",
     "security_style_explanations.cc",
     "security_style_explanations.h",
diff --git a/content/public/browser/browser_associated_interface.h b/content/public/browser/browser_associated_interface.h
index 2b86e21..5fedb75 100644
--- a/content/public/browser/browser_associated_interface.h
+++ b/content/public/browser/browser_associated_interface.h
@@ -5,11 +5,11 @@
 #ifndef CONTENT_BROWSER_BROWSER_ASSOCIATED_INTERFACE_H_
 #define CONTENT_BROWSER_BROWSER_ASSOCIATED_INTERFACE_H_
 
-#include <memory>
 #include <string>
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "base/optional.h"
 #include "content/common/content_export.h"
 #include "content/public/browser/browser_message_filter.h"
 #include "content/public/browser/browser_thread.h"
@@ -55,7 +55,6 @@
   // |filter| and |impl| must live at least as long as this object.
   BrowserAssociatedInterface(BrowserMessageFilter* filter, Interface* impl)
       : internal_state_(new InternalState(impl)) {
-    internal_state_->Initialize();
     filter->AddAssociatedInterface(
         Interface::Name_,
         base::Bind(&InternalState::BindRequest, internal_state_),
@@ -69,16 +68,8 @@
 
   class InternalState : public base::RefCountedThreadSafe<InternalState> {
    public:
-    explicit InternalState(Interface* impl) : impl_(impl) {}
-
-    void Initialize() {
-      if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
-        BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
-                                base::Bind(&InternalState::Initialize, this));
-        return;
-      }
-      bindings_.reset(new mojo::AssociatedBindingSet<Interface>);
-    }
+    explicit InternalState(Interface* impl)
+        : impl_(impl), bindings_(base::in_place) {}
 
     void ClearBindings() {
       if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
@@ -106,7 +97,7 @@
     ~InternalState() {}
 
     Interface* impl_;
-    std::unique_ptr<mojo::AssociatedBindingSet<Interface>> bindings_;
+    base::Optional<mojo::AssociatedBindingSet<Interface>> bindings_;
 
     DISALLOW_COPY_AND_ASSIGN(InternalState);
   };
diff --git a/content/public/browser/security_style_explanation.cc b/content/public/browser/security_style_explanation.cc
new file mode 100644
index 0000000..9d497471
--- /dev/null
+++ b/content/public/browser/security_style_explanation.cc
@@ -0,0 +1,36 @@
+// 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 "content/public/browser/security_style_explanation.h"
+
+namespace content {
+
+SecurityStyleExplanation::SecurityStyleExplanation() {}
+
+SecurityStyleExplanation::SecurityStyleExplanation(
+    const std::string& summary,
+    const std::string& description)
+    : summary(summary),
+      description(description),
+      mixed_content_type(blink::WebMixedContentContextType::kNotMixedContent) {}
+
+SecurityStyleExplanation::SecurityStyleExplanation(
+    const std::string& summary,
+    const std::string& description,
+    scoped_refptr<net::X509Certificate> certificate,
+    blink::WebMixedContentContextType mixed_content_type)
+    : summary(summary),
+      description(description),
+      certificate(certificate),
+      mixed_content_type(mixed_content_type) {}
+
+SecurityStyleExplanation::SecurityStyleExplanation(
+    const SecurityStyleExplanation& other) = default;
+
+SecurityStyleExplanation& SecurityStyleExplanation::operator=(
+    const SecurityStyleExplanation& other) = default;
+
+SecurityStyleExplanation::~SecurityStyleExplanation() {}
+
+}  // namespace content
diff --git a/content/public/browser/security_style_explanation.h b/content/public/browser/security_style_explanation.h
index e2d51b9f..9f0b12b 100644
--- a/content/public/browser/security_style_explanation.h
+++ b/content/public/browser/security_style_explanation.h
@@ -8,6 +8,7 @@
 #include <string>
 
 #include "content/common/content_export.h"
+#include "net/cert/x509_certificate.h"
 #include "third_party/WebKit/public/platform/WebMixedContentContextType.h"
 
 namespace content {
@@ -17,32 +18,24 @@
 // resource. An example summary phrase would be "Expired Certificate",
 // with a description along the lines of "This site's certificate chain
 // contains errors (net::CERT_DATE_INVALID)".
-struct SecurityStyleExplanation {
-  CONTENT_EXPORT SecurityStyleExplanation(){};
-  CONTENT_EXPORT SecurityStyleExplanation(const std::string& summary,
-                                          const std::string& description)
-      : summary(summary),
-        description(description),
-        has_certificate(false),
-        mixed_content_type(
-            blink::WebMixedContentContextType::kNotMixedContent) {}
-  CONTENT_EXPORT SecurityStyleExplanation(
+struct CONTENT_EXPORT SecurityStyleExplanation {
+  SecurityStyleExplanation();
+  SecurityStyleExplanation(const std::string& summary,
+                           const std::string& description);
+  SecurityStyleExplanation(
       const std::string& summary,
       const std::string& description,
-      bool has_certificate,
-      blink::WebMixedContentContextType mixed_content_type)
-      : summary(summary),
-        description(description),
-        has_certificate(has_certificate),
-        mixed_content_type(mixed_content_type) {}
-  CONTENT_EXPORT ~SecurityStyleExplanation() {}
+      scoped_refptr<net::X509Certificate> certificate,
+      blink::WebMixedContentContextType mixed_content_type);
+  SecurityStyleExplanation(const SecurityStyleExplanation& other);
+  SecurityStyleExplanation& operator=(const SecurityStyleExplanation& other);
+  ~SecurityStyleExplanation();
 
   std::string summary;
   std::string description;
-  // |has_certificate| indicates that this explanation has an associated
-  // certificate. UI surfaces can use this to add a button/link for viewing the
-  // certificate of the current page.
-  bool has_certificate;
+  // |certificate| indicates that this explanation has an associated
+  // certificate.
+  scoped_refptr<net::X509Certificate> certificate;
   // |mixed_content_type| indicates that the explanation describes a particular
   // type of mixed content. A value of kNotMixedContent means that the
   // explanation does not relate to mixed content. UI surfaces can use this to
diff --git a/content/public/browser/security_style_explanations.h b/content/public/browser/security_style_explanations.h
index 041236d..981970b 100644
--- a/content/public/browser/security_style_explanations.h
+++ b/content/public/browser/security_style_explanations.h
@@ -25,11 +25,10 @@
 // SecurityStyleExplanation that contains a human-readable explanation of the
 // factor. A single page may contain multiple explanations, each of which may
 // have a different severity level ("secure", "warning", "insecure" and "info").
-struct SecurityStyleExplanations {
-  CONTENT_EXPORT SecurityStyleExplanations();
-  CONTENT_EXPORT SecurityStyleExplanations(
-      const SecurityStyleExplanations& other);
-  CONTENT_EXPORT ~SecurityStyleExplanations();
+struct CONTENT_EXPORT SecurityStyleExplanations {
+  SecurityStyleExplanations();
+  SecurityStyleExplanations(const SecurityStyleExplanations& other);
+  ~SecurityStyleExplanations();
 
   // True if the page was loaded over HTTPS and ran mixed (HTTP) content
   // such as scripts.
diff --git a/content/public/browser/web_contents_delegate.cc b/content/public/browser/web_contents_delegate.cc
index 30c545b..959fe72 100644
--- a/content/public/browser/web_contents_delegate.cc
+++ b/content/public/browser/web_contents_delegate.cc
@@ -14,7 +14,6 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/bindings_policy.h"
 #include "content/public/common/url_constants.h"
-#include "net/cert/x509_certificate.h"
 #include "ui/gfx/geometry/rect.h"
 
 namespace content {
@@ -266,11 +265,6 @@
   return blink::kWebSecurityStyleUnknown;
 }
 
-void WebContentsDelegate::ShowCertificateViewerInDevTools(
-    WebContents* web_contents,
-    scoped_refptr<net::X509Certificate> certificate) {
-}
-
 void WebContentsDelegate::RequestAppBannerFromDevTools(
     content::WebContents* web_contents) {
 }
diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h
index 3ffbea6..8b548ba 100644
--- a/content/public/browser/web_contents_delegate.h
+++ b/content/public/browser/web_contents_delegate.h
@@ -63,10 +63,6 @@
 class Size;
 }
 
-namespace net {
-class X509Certificate;
-}
-
 namespace url {
 class Origin;
 }
@@ -546,11 +542,6 @@
       WebContents* web_contents,
       SecurityStyleExplanations* security_style_explanations);
 
-  // Displays platform-specific (OS) dialog with the certificate details.
-  virtual void ShowCertificateViewerInDevTools(
-      WebContents* web_contents,
-      scoped_refptr<net::X509Certificate> certificate);
-
   // Requests the app banner. This method is called from the DevTools.
   virtual void RequestAppBannerFromDevTools(content::WebContents* web_contents);
 
diff --git a/content/public/common/media_stream_request.cc b/content/public/common/media_stream_request.cc
index 8512aad5..b042198b 100644
--- a/content/public/common/media_stream_request.cc
+++ b/content/public/common/media_stream_request.cc
@@ -63,19 +63,21 @@
       id(id),
       video_facing(media::MEDIA_VIDEO_FACING_NONE),
       name(name),
-      input(sample_rate, channel_layout, frames_per_buffer) {}
+      input(media::AudioParameters::AUDIO_FAKE,
+            static_cast<media::ChannelLayout>(channel_layout),
+            sample_rate,
+            0,
+            frames_per_buffer) {}
 
 MediaStreamDevice::MediaStreamDevice(const MediaStreamDevice& other) = default;
 
 MediaStreamDevice::~MediaStreamDevice() {}
 
 bool MediaStreamDevice::IsEqual(const MediaStreamDevice& second) const {
-  const AudioDeviceParameters& input_second = second.input;
-  return type == second.type &&
-      name == second.name &&
-      id == second.id &&
-      input.sample_rate == input_second.sample_rate &&
-      input.channel_layout == input_second.channel_layout;
+  const media::AudioParameters& input_second = second.input;
+  return type == second.type && name == second.name && id == second.id &&
+         input.sample_rate() == input_second.sample_rate() &&
+         input.channel_layout() == input_second.channel_layout();
 }
 
 MediaStreamDevices::MediaStreamDevices() {}
@@ -94,23 +96,6 @@
   return NULL;
 }
 
-MediaStreamDevice::AudioDeviceParameters::AudioDeviceParameters()
-    : sample_rate(), channel_layout(), frames_per_buffer(), effects() {}
-
-MediaStreamDevice::AudioDeviceParameters::AudioDeviceParameters(
-    int sample_rate,
-    int channel_layout,
-    int frames_per_buffer)
-    : sample_rate(sample_rate),
-      channel_layout(channel_layout),
-      frames_per_buffer(frames_per_buffer),
-      effects() {}
-
-MediaStreamDevice::AudioDeviceParameters::AudioDeviceParameters(
-    const AudioDeviceParameters& other) = default;
-
-MediaStreamDevice::AudioDeviceParameters::~AudioDeviceParameters() {}
-
 MediaStreamRequest::MediaStreamRequest(
     int render_process_id,
     int render_frame_id,
diff --git a/content/public/common/media_stream_request.h b/content/public/common/media_stream_request.h
index f3b09c0..36821c43 100644
--- a/content/public/common/media_stream_request.h
+++ b/content/public/common/media_stream_request.h
@@ -122,49 +122,19 @@
   // The device's "friendly" name. Not guaranteed to be unique.
   std::string name;
 
-  // Contains properties that match directly with those with the same name
-  // in media::AudioParameters.
-  // TODO(ajm): Remove this type and use media::AudioParameters directly.
-  struct CONTENT_EXPORT AudioDeviceParameters {
-    AudioDeviceParameters();
-    AudioDeviceParameters(int sample_rate,
-                          int channel_layout,
-                          int frames_per_buffer);
-    AudioDeviceParameters(const AudioDeviceParameters& other);
-
-    ~AudioDeviceParameters();
-
-    // Preferred sample rate in samples per second for the device.
-    int sample_rate;
-
-    // Preferred channel configuration for the device.
-    // TODO(henrika): ideally, we would like to use media::ChannelLayout here
-    // but including media/base/channel_layout.h violates checkdeps rules.
-    int channel_layout;
-
-    // Preferred number of frames per buffer for the device.  This is filled
-    // in on the browser side and can be used by the renderer to match the
-    // expected browser side settings and avoid unnecessary buffering.
-    // See media::AudioParameters for more.
-    int frames_per_buffer;
-
-    // See media::AudioParameters::PlatformEffectsMask.
-    int effects;
-
-    std::vector<media::Point> mic_positions;
-  };
-
   // These below two member variables are valid only when the type of device is
   // audio (i.e. IsAudioInputMediaType returns true).
 
   // Contains the device properties of the capture device.
-  AudioDeviceParameters input;
+  media::AudioParameters input =
+      media::AudioParameters::UnavailableDeviceParams();
 
   // If the capture device has an associated output device (e.g. headphones),
   // this will contain the properties for the output device.  If no such device
   // exists (e.g. webcam w/mic), then the value of this member will be all
   // zeros.
-  AudioDeviceParameters matched_output;
+  media::AudioParameters matched_output =
+      media::AudioParameters::UnavailableDeviceParams();
 
   // This field is optional and available only for some camera models.
   base::Optional<CameraCalibration> camera_calibration;
diff --git a/content/public/test/text_input_test_utils.cc b/content/public/test/text_input_test_utils.cc
index 65ec8d2..1e7153a 100644
--- a/content/public/test/text_input_test_utils.cc
+++ b/content/public/test/text_input_test_utils.cc
@@ -22,8 +22,8 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/test/test_utils.h"
-#include "third_party/WebKit/public/web/WebCompositionUnderline.h"
-#include "ui/base/ime/composition_underline.h"
+#include "third_party/WebKit/public/web/WebImeTextSpan.h"
+#include "ui/base/ime/ime_text_span.h"
 #include "ui/base/ime/input_method.h"
 #include "ui/base/ime/input_method_observer.h"
 
@@ -268,22 +268,22 @@
 void SendImeCommitTextToWidget(
     RenderWidgetHost* rwh,
     const base::string16& text,
-    const std::vector<ui::CompositionUnderline>& underlines,
+    const std::vector<ui::ImeTextSpan>& ime_text_spans,
     const gfx::Range& replacement_range,
     int relative_cursor_pos) {
   RenderWidgetHostImpl::From(rwh)->ImeCommitText(
-      text, underlines, replacement_range, relative_cursor_pos);
+      text, ime_text_spans, replacement_range, relative_cursor_pos);
 }
 
 void SendImeSetCompositionTextToWidget(
     RenderWidgetHost* rwh,
     const base::string16& text,
-    const std::vector<ui::CompositionUnderline>& underlines,
+    const std::vector<ui::ImeTextSpan>& ime_text_spans,
     const gfx::Range& replacement_range,
     int selection_start,
     int selection_end) {
   RenderWidgetHostImpl::From(rwh)->ImeSetComposition(
-      text, underlines, replacement_range, selection_start, selection_end);
+      text, ime_text_spans, replacement_range, selection_start, selection_end);
 }
 
 bool DestroyRenderWidgetHost(int32_t process_id,
diff --git a/content/public/test/text_input_test_utils.h b/content/public/test/text_input_test_utils.h
index c8d9775..80c055c 100644
--- a/content/public/test/text_input_test_utils.h
+++ b/content/public/test/text_input_test_utils.h
@@ -26,7 +26,7 @@
 }
 
 namespace ui {
-struct CompositionUnderline;
+struct ImeTextSpan;
 }
 
 namespace content {
@@ -74,7 +74,7 @@
 void SendImeCommitTextToWidget(
     RenderWidgetHost* rwh,
     const base::string16& text,
-    const std::vector<ui::CompositionUnderline>& underlines,
+    const std::vector<ui::ImeTextSpan>& ime_text_spans,
     const gfx::Range& replacement_range,
     int relative_cursor_pos);
 
@@ -83,7 +83,7 @@
 void SendImeSetCompositionTextToWidget(
     RenderWidgetHost* rwh,
     const base::string16& text,
-    const std::vector<ui::CompositionUnderline>& underlines,
+    const std::vector<ui::ImeTextSpan>& ime_text_spans,
     const gfx::Range& replacement_range,
     int selection_start,
     int selection_end);
diff --git a/content/renderer/browser_plugin/browser_plugin.cc b/content/renderer/browser_plugin/browser_plugin.cc
index 88ef96b5..9e281e4 100644
--- a/content/renderer/browser_plugin/browser_plugin.cc
+++ b/content/renderer/browser_plugin/browser_plugin.cc
@@ -551,7 +551,7 @@
 
 bool BrowserPlugin::SetComposition(
     const blink::WebString& text,
-    const blink::WebVector<blink::WebCompositionUnderline>& underlines,
+    const blink::WebVector<blink::WebImeTextSpan>& ime_text_spans,
     const blink::WebRange& replacementRange,
     int selectionStart,
     int selectionEnd) {
@@ -560,8 +560,8 @@
 
   BrowserPluginHostMsg_SetComposition_Params params;
   params.text = text.Utf16();
-  for (size_t i = 0; i < underlines.size(); ++i) {
-    params.underlines.push_back(underlines[i]);
+  for (size_t i = 0; i < ime_text_spans.size(); ++i) {
+    params.ime_text_spans.push_back(ime_text_spans[i]);
   }
 
   params.replacement_range =
@@ -580,15 +580,15 @@
 
 bool BrowserPlugin::CommitText(
     const blink::WebString& text,
-    const blink::WebVector<blink::WebCompositionUnderline>& underlines,
+    const blink::WebVector<blink::WebImeTextSpan>& ime_text_spans,
     const blink::WebRange& replacementRange,
     int relative_cursor_pos) {
   if (!attached())
     return false;
 
-  std::vector<blink::WebCompositionUnderline> std_underlines;
-  for (size_t i = 0; i < underlines.size(); ++i) {
-    std_underlines.push_back(underlines[i]);
+  std::vector<blink::WebImeTextSpan> std_ime_text_spans;
+  for (size_t i = 0; i < ime_text_spans.size(); ++i) {
+    std_ime_text_spans.push_back(ime_text_spans[i]);
   }
   gfx::Range replacement_range =
       replacementRange.IsNull()
@@ -597,7 +597,7 @@
                        static_cast<uint32_t>(replacementRange.EndOffset()));
 
   BrowserPluginManager::Get()->Send(new BrowserPluginHostMsg_ImeCommitText(
-      browser_plugin_instance_id_, text.Utf16(), std_underlines,
+      browser_plugin_instance_id_, text.Utf16(), std_ime_text_spans,
       replacement_range, relative_cursor_pos));
   // TODO(kochi): This assumes the IPC handling always succeeds.
   return true;
diff --git a/content/renderer/browser_plugin/browser_plugin.h b/content/renderer/browser_plugin/browser_plugin.h
index 637002e8..74abac0 100644
--- a/content/renderer/browser_plugin/browser_plugin.h
+++ b/content/renderer/browser_plugin/browser_plugin.h
@@ -14,8 +14,8 @@
 #include "base/sequenced_task_runner_helpers.h"
 #include "content/renderer/mouse_lock_dispatcher.h"
 #include "content/renderer/render_view_impl.h"
-#include "third_party/WebKit/public/web/WebCompositionUnderline.h"
 #include "third_party/WebKit/public/web/WebDragStatus.h"
+#include "third_party/WebKit/public/web/WebImeTextSpan.h"
 #include "third_party/WebKit/public/web/WebInputMethodController.h"
 #include "third_party/WebKit/public/web/WebNode.h"
 
@@ -111,15 +111,14 @@
                           const blink::WebString& value) override;
   bool SetComposition(
       const blink::WebString& text,
-      const blink::WebVector<blink::WebCompositionUnderline>& underlines,
+      const blink::WebVector<blink::WebImeTextSpan>& ime_text_spans,
       const blink::WebRange& replacementRange,
       int selectionStart,
       int selectionEnd) override;
-  bool CommitText(
-      const blink::WebString& text,
-      const blink::WebVector<blink::WebCompositionUnderline>& underlines,
-      const blink::WebRange& replacementRange,
-      int relative_cursor_pos) override;
+  bool CommitText(const blink::WebString& text,
+                  const blink::WebVector<blink::WebImeTextSpan>& ime_text_spans,
+                  const blink::WebRange& replacementRange,
+                  int relative_cursor_pos) override;
   bool FinishComposingText(
       blink::WebInputMethodController::ConfirmCompositionBehavior
           selection_behavior) override;
diff --git a/content/renderer/dom_storage/dom_storage_cached_area.cc b/content/renderer/dom_storage/dom_storage_cached_area.cc
index b2686d9..12480ea8c 100644
--- a/content/renderer/dom_storage/dom_storage_cached_area.cc
+++ b/content/renderer/dom_storage/dom_storage_cached_area.cc
@@ -53,16 +53,15 @@
     return false;
 
   PrimeIfNeeded(connection_id);
-  base::NullableString16 unused;
-  if (!map_->SetItem(key, value, &unused))
+  base::NullableString16 old_value;
+  if (!map_->SetItem(key, value, &old_value))
     return false;
 
   // Ignore mutations to 'key' until OnSetItemComplete.
   ignore_key_mutations_[key]++;
-  proxy_->SetItem(
-      connection_id, key, value, page_url,
-      base::Bind(&DOMStorageCachedArea::OnSetItemComplete,
-                 weak_factory_.GetWeakPtr(), key));
+  proxy_->SetItem(connection_id, key, value, old_value, page_url,
+                  base::Bind(&DOMStorageCachedArea::OnSetItemComplete,
+                             weak_factory_.GetWeakPtr(), key));
   return true;
 }
 
@@ -70,16 +69,16 @@
                                       const base::string16& key,
                                       const GURL& page_url) {
   PrimeIfNeeded(connection_id);
-  base::string16 unused;
-  if (!map_->RemoveItem(key, &unused))
+  base::string16 old_value;
+  if (!map_->RemoveItem(key, &old_value))
     return;
 
   // Ignore mutations to 'key' until OnRemoveItemComplete.
   ignore_key_mutations_[key]++;
-  proxy_->RemoveItem(
-      connection_id, key, page_url,
-      base::Bind(&DOMStorageCachedArea::OnRemoveItemComplete,
-                 weak_factory_.GetWeakPtr(), key));
+  proxy_->RemoveItem(connection_id, key,
+                     base::NullableString16(old_value, false), page_url,
+                     base::Bind(&DOMStorageCachedArea::OnRemoveItemComplete,
+                                weak_factory_.GetWeakPtr(), key));
 }
 
 void DOMStorageCachedArea::Clear(int connection_id, const GURL& page_url) {
diff --git a/content/renderer/dom_storage/dom_storage_cached_area_unittest.cc b/content/renderer/dom_storage/dom_storage_cached_area_unittest.cc
index 4c433271..46b3815e 100644
--- a/content/renderer/dom_storage/dom_storage_cached_area_unittest.cc
+++ b/content/renderer/dom_storage/dom_storage_cached_area_unittest.cc
@@ -37,6 +37,7 @@
   void SetItem(int connection_id,
                const base::string16& key,
                const base::string16& value,
+               const base::NullableString16& old_value,
                const GURL& page_url,
                const CompletionCallback& callback) override {
     pending_callbacks_.push_back(callback);
@@ -49,6 +50,7 @@
 
   void RemoveItem(int connection_id,
                   const base::string16& key,
+                  const base::NullableString16& old_value,
                   const GURL& page_url,
                   const CompletionCallback& callback) override {
     pending_callbacks_.push_back(callback);
diff --git a/content/renderer/dom_storage/dom_storage_dispatcher.cc b/content/renderer/dom_storage/dom_storage_dispatcher.cc
index b52367ad..9d2ec453 100644
--- a/content/renderer/dom_storage/dom_storage_dispatcher.cc
+++ b/content/renderer/dom_storage/dom_storage_dispatcher.cc
@@ -114,10 +114,12 @@
   void SetItem(int connection_id,
                const base::string16& key,
                const base::string16& value,
+               const base::NullableString16& old_value,
                const GURL& page_url,
                const CompletionCallback& callback) override;
   void RemoveItem(int connection_id,
                   const base::string16& key,
+                  const base::NullableString16& old_value,
                   const GURL& page_url,
                   const CompletionCallback& callback) override;
   void ClearArea(int connection_id,
@@ -243,20 +245,26 @@
 }
 
 void DomStorageDispatcher::ProxyImpl::SetItem(
-    int connection_id, const base::string16& key,
-    const base::string16& value, const GURL& page_url,
+    int connection_id,
+    const base::string16& key,
+    const base::string16& value,
+    const base::NullableString16& old_value,
+    const GURL& page_url,
     const CompletionCallback& callback) {
   PushPendingCallback(callback);
   throttling_filter_->SendThrottled(new DOMStorageHostMsg_SetItem(
-      connection_id, key, value, page_url));
+      connection_id, key, value, old_value, page_url));
 }
 
 void DomStorageDispatcher::ProxyImpl::RemoveItem(
-    int connection_id, const base::string16& key,  const GURL& page_url,
+    int connection_id,
+    const base::string16& key,
+    const base::NullableString16& old_value,
+    const GURL& page_url,
     const CompletionCallback& callback) {
   PushPendingCallback(callback);
   throttling_filter_->SendThrottled(new DOMStorageHostMsg_RemoveItem(
-      connection_id, key, page_url));
+      connection_id, key, old_value, page_url));
 }
 
 void DomStorageDispatcher::ProxyImpl::ClearArea(int connection_id,
diff --git a/content/renderer/dom_storage/dom_storage_proxy.h b/content/renderer/dom_storage/dom_storage_proxy.h
index 80cd87cdc..8fbd361 100644
--- a/content/renderer/dom_storage/dom_storage_proxy.h
+++ b/content/renderer/dom_storage/dom_storage_proxy.h
@@ -26,11 +26,13 @@
   virtual void SetItem(int connection_id,
                        const base::string16& key,
                        const base::string16& value,
+                       const base::NullableString16& old_value,
                        const GURL& page_url,
                        const CompletionCallback& callback) = 0;
 
   virtual void RemoveItem(int connection_id,
                           const base::string16& key,
+                          const base::NullableString16& old_value,
                           const GURL& page_url,
                           const CompletionCallback& callback) = 0;
 
diff --git a/content/renderer/frame_owner_properties.cc b/content/renderer/frame_owner_properties.cc
index b713022e..21c2541c 100644
--- a/content/renderer/frame_owner_properties.cc
+++ b/content/renderer/frame_owner_properties.cc
@@ -24,9 +24,6 @@
   result.allow_payment_request =
       web_frame_owner_properties.allow_payment_request;
   result.required_csp = web_frame_owner_properties.required_csp.Utf8();
-  std::copy(web_frame_owner_properties.allowed_features.begin(),
-            web_frame_owner_properties.allowed_features.end(),
-            std::back_inserter(result.allowed_features));
 
   return result;
 }
@@ -44,8 +41,6 @@
   result.allow_payment_request = frame_owner_properties.allow_payment_request;
   result.required_csp =
       blink::WebString::FromUTF8(frame_owner_properties.required_csp);
-  result.allowed_features = blink::WebVector<blink::WebFeaturePolicyFeature>(
-      frame_owner_properties.allowed_features);
 
   return result;
 }
diff --git a/content/renderer/input/frame_input_handler_impl.cc b/content/renderer/input/frame_input_handler_impl.cc
index ba35f657..637ebdcb 100644
--- a/content/renderer/input/frame_input_handler_impl.cc
+++ b/content/renderer/input/frame_input_handler_impl.cc
@@ -66,11 +66,11 @@
 void FrameInputHandlerImpl::SetCompositionFromExistingText(
     int32_t start,
     int32_t end,
-    const std::vector<ui::CompositionUnderline>& ui_underlines) {
+    const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) {
   if (!main_thread_task_runner_->BelongsToCurrentThread()) {
     RunOnMainThread(
         base::Bind(&FrameInputHandlerImpl::SetCompositionFromExistingText,
-                   weak_this_, start, end, ui_underlines));
+                   weak_this_, start, end, ui_ime_text_spans));
     return;
   }
 
@@ -78,16 +78,17 @@
     return;
 
   ImeEventGuard guard(render_frame_->GetRenderWidget());
-  std::vector<blink::WebCompositionUnderline> underlines;
-  for (const auto& underline : ui_underlines) {
-    blink::WebCompositionUnderline blink_underline(
-        underline.start_offset, underline.end_offset, underline.color,
-        underline.thick, underline.background_color);
-    underlines.push_back(blink_underline);
+  std::vector<blink::WebImeTextSpan> ime_text_spans;
+  for (const auto& ime_text_span : ui_ime_text_spans) {
+    blink::WebImeTextSpan blink_ime_text_span(
+        ime_text_span.start_offset, ime_text_span.end_offset,
+        ime_text_span.color, ime_text_span.thick,
+        ime_text_span.background_color);
+    ime_text_spans.push_back(blink_ime_text_span);
   }
 
   render_frame_->GetWebFrame()->SetCompositionFromExistingText(start, end,
-                                                               underlines);
+                                                               ime_text_spans);
 }
 
 void FrameInputHandlerImpl::ExtendSelectionAndDelete(int32_t before,
diff --git a/content/renderer/input/frame_input_handler_impl.h b/content/renderer/input/frame_input_handler_impl.h
index 705f816..6519950 100644
--- a/content/renderer/input/frame_input_handler_impl.h
+++ b/content/renderer/input/frame_input_handler_impl.h
@@ -44,7 +44,7 @@
   void SetCompositionFromExistingText(
       int32_t start,
       int32_t end,
-      const std::vector<ui::CompositionUnderline>& underlines) override;
+      const std::vector<ui::ImeTextSpan>& ime_text_spans) override;
   void ExtendSelectionAndDelete(int32_t before, int32_t after) override;
   void DeleteSurroundingText(int32_t before, int32_t after) override;
   void DeleteSurroundingTextInCodePoints(int32_t before,
diff --git a/content/renderer/input/widget_input_handler_impl.cc b/content/renderer/input/widget_input_handler_impl.cc
index a042d773..d82da0f3 100644
--- a/content/renderer/input/widget_input_handler_impl.cc
+++ b/content/renderer/input/widget_input_handler_impl.cc
@@ -24,17 +24,17 @@
 
 namespace {
 
-std::vector<blink::WebCompositionUnderline>
-ConvertUIUnderlinesToBlinkUnderlines(
-    const std::vector<ui::CompositionUnderline>& ui_underlines) {
-  std::vector<blink::WebCompositionUnderline> underlines;
-  for (const auto& underline : ui_underlines) {
-    blink::WebCompositionUnderline blink_underline(
-        underline.start_offset, underline.end_offset, underline.color,
-        underline.thick, underline.background_color);
-    underlines.push_back(blink_underline);
+std::vector<blink::WebImeTextSpan> ConvertUIImeTextSpansToBlinkImeTextSpans(
+    const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) {
+  std::vector<blink::WebImeTextSpan> ime_text_spans;
+  for (const auto& ime_text_span : ui_ime_text_spans) {
+    blink::WebImeTextSpan blink_ime_text_span(
+        ime_text_span.start_offset, ime_text_span.end_offset,
+        ime_text_span.color, ime_text_span.thick,
+        ime_text_span.background_color);
+    ime_text_spans.push_back(blink_ime_text_span);
   }
-  return underlines;
+  return ime_text_spans;
 }
 }  // namespace
 
@@ -89,24 +89,25 @@
 
 void WidgetInputHandlerImpl::ImeSetComposition(
     const base::string16& text,
-    const std::vector<ui::CompositionUnderline>& underlines,
+    const std::vector<ui::ImeTextSpan>& ime_text_spans,
     const gfx::Range& range,
     int32_t start,
     int32_t end) {
-  RunOnMainThread(base::Bind(
-      &RenderWidget::OnImeSetComposition, render_widget_, text,
-      ConvertUIUnderlinesToBlinkUnderlines(underlines), range, start, end));
+  RunOnMainThread(
+      base::Bind(&RenderWidget::OnImeSetComposition, render_widget_, text,
+                 ConvertUIImeTextSpansToBlinkImeTextSpans(ime_text_spans),
+                 range, start, end));
 }
 
 void WidgetInputHandlerImpl::ImeCommitText(
     const base::string16& text,
-    const std::vector<ui::CompositionUnderline>& underlines,
+    const std::vector<ui::ImeTextSpan>& ime_text_spans,
     const gfx::Range& range,
     int32_t relative_cursor_position) {
-  RunOnMainThread(base::Bind(&RenderWidget::OnImeCommitText, render_widget_,
-                             text,
-                             ConvertUIUnderlinesToBlinkUnderlines(underlines),
-                             range, relative_cursor_position));
+  RunOnMainThread(
+      base::Bind(&RenderWidget::OnImeCommitText, render_widget_, text,
+                 ConvertUIImeTextSpansToBlinkImeTextSpans(ime_text_spans),
+                 range, relative_cursor_position));
 }
 
 void WidgetInputHandlerImpl::ImeFinishComposingText(bool keep_selection) {
diff --git a/content/renderer/input/widget_input_handler_impl.h b/content/renderer/input/widget_input_handler_impl.h
index c05ac43..5c5cddc2 100644
--- a/content/renderer/input/widget_input_handler_impl.h
+++ b/content/renderer/input/widget_input_handler_impl.h
@@ -36,14 +36,13 @@
   void SetEditCommandsForNextKeyEvent(
       const std::vector<EditCommand>& commands) override;
   void CursorVisibilityChanged(bool visible) override;
-  void ImeSetComposition(
-      const base::string16& text,
-      const std::vector<ui::CompositionUnderline>& underlines,
-      const gfx::Range& range,
-      int32_t start,
-      int32_t end) override;
+  void ImeSetComposition(const base::string16& text,
+                         const std::vector<ui::ImeTextSpan>& ime_text_spans,
+                         const gfx::Range& range,
+                         int32_t start,
+                         int32_t end) override;
   void ImeCommitText(const base::string16& text,
-                     const std::vector<ui::CompositionUnderline>& underlines,
+                     const std::vector<ui::ImeTextSpan>& ime_text_spans,
                      const gfx::Range& range,
                      int32_t relative_cursor_position) override;
   void ImeFinishComposingText(bool keep_selection) override;
diff --git a/content/renderer/media/local_media_stream_audio_source.cc b/content/renderer/media/local_media_stream_audio_source.cc
index 2c7f1aa8..4d2e913 100644
--- a/content/renderer/media/local_media_stream_audio_source.cc
+++ b/content/renderer/media/local_media_stream_audio_source.cc
@@ -22,24 +22,23 @@
   MediaStreamSource::SetDeviceInfo(device_info);
 
   // If the device buffer size was not provided, use a default.
-  int frames_per_buffer = device_info.device.input.frames_per_buffer;
+  int frames_per_buffer = device_info.device.input.frames_per_buffer();
   if (frames_per_buffer <= 0) {
     // TODO(miu): Like in ProcessedLocalAudioSource::GetBufferSize(), we should
     // re-evaluate whether Android needs special treatment here. Or, perhaps we
     // should just DCHECK_GT(device_info...frames_per_buffer, 0)?
     // http://crbug.com/638081
 #if defined(OS_ANDROID)
-    frames_per_buffer = device_info.device.input.sample_rate / 50;  // 20 ms
+    frames_per_buffer = device_info.device.input.sample_rate() / 50;  // 20 ms
 #else
-    frames_per_buffer = device_info.device.input.sample_rate / 100;  // 10 ms
+    frames_per_buffer = device_info.device.input.sample_rate() / 100;  // 10 ms
 #endif
   }
 
   MediaStreamAudioSource::SetFormat(media::AudioParameters(
       media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
-      static_cast<media::ChannelLayout>(
-          device_info.device.input.channel_layout),
-      device_info.device.input.sample_rate,
+      device_info.device.input.channel_layout(),
+      device_info.device.input.sample_rate(),
       16,  // Legacy parameter (data is always in 32-bit float format).
       frames_per_buffer));
 }
diff --git a/content/renderer/media/media_stream_audio_processor_options.cc b/content/renderer/media/media_stream_audio_processor_options.cc
index 5fdd272..70ce8ad6 100644
--- a/content/renderer/media/media_stream_audio_processor_options.cc
+++ b/content/renderer/media/media_stream_audio_processor_options.cc
@@ -292,9 +292,9 @@
 // static
 AudioProcessingProperties AudioProcessingProperties::FromConstraints(
     const blink::WebMediaConstraints& constraints,
-    const MediaStreamDevice::AudioDeviceParameters& input_params) {
+    const media::AudioParameters& input_params) {
   DCHECK(IsOldAudioConstraints());
-  MediaAudioConstraints audio_constraints(constraints, input_params.effects);
+  MediaAudioConstraints audio_constraints(constraints, input_params.effects());
   AudioProcessingProperties properties;
   properties.enable_sw_echo_cancellation =
       audio_constraints.GetEchoCancellationProperty();
@@ -524,14 +524,14 @@
 
 std::vector<media::Point> GetArrayGeometryPreferringConstraints(
     const MediaAudioConstraints& audio_constraints,
-    const MediaStreamDevice::AudioDeviceParameters& input_params) {
+    const media::AudioParameters& input_params) {
   const std::string constraints_geometry =
       audio_constraints.GetGoogArrayGeometry();
 
   // Give preference to the audio constraint over the device-supplied mic
   // positions. This is mainly for testing purposes.
   return constraints_geometry.empty()
-             ? input_params.mic_positions
+             ? input_params.mic_positions()
              : media::ParsePointsFromString(constraints_geometry);
 }
 
diff --git a/content/renderer/media/media_stream_audio_processor_options.h b/content/renderer/media/media_stream_audio_processor_options.h
index dde2d23..ee9619e 100644
--- a/content/renderer/media/media_stream_audio_processor_options.h
+++ b/content/renderer/media/media_stream_audio_processor_options.h
@@ -117,7 +117,7 @@
   // TODO(guidou): Remove this function. http://crbug.com/706408
   static AudioProcessingProperties FromConstraints(
       const blink::WebMediaConstraints& constraints,
-      const MediaStreamDevice::AudioDeviceParameters& input_params);
+      const media::AudioParameters& input_params);
 
   bool enable_sw_echo_cancellation = true;
   bool disable_hw_echo_cancellation = false;
@@ -213,7 +213,7 @@
 // TODO(guidou): Remove this function. http://crbug.com/706408
 CONTENT_EXPORT std::vector<media::Point> GetArrayGeometryPreferringConstraints(
     const MediaAudioConstraints& audio_constraints,
-    const MediaStreamDevice::AudioDeviceParameters& input_params);
+    const media::AudioParameters& input_params);
 
 // TODO(guidou): Remove this function. http://crbug.com/706408
 CONTENT_EXPORT bool IsOldAudioConstraints();
diff --git a/content/renderer/media/media_stream_audio_processor_unittest.cc b/content/renderer/media/media_stream_audio_processor_unittest.cc
index 9aada88..5f55168 100644
--- a/content/renderer/media/media_stream_audio_processor_unittest.cc
+++ b/content/renderer/media/media_stream_audio_processor_unittest.cc
@@ -220,7 +220,6 @@
 
   base::MessageLoop main_thread_message_loop_;
   media::AudioParameters params_;
-  MediaStreamDevice::AudioDeviceParameters input_device_params_;
 
   // TODO(guidou): Remove this field. http://crbug.com/706408
   base::test::ScopedFeatureList scoped_feature_list_;
@@ -383,7 +382,7 @@
   {
     // Both geometries empty.
     MockConstraintFactory constraint_factory;
-    MediaStreamDevice::AudioDeviceParameters input_params;
+    media::AudioParameters input_params;
 
     const auto& actual_geometry = GetArrayGeometryPreferringConstraints(
         MakeMediaAudioConstraints(constraint_factory), input_params);
@@ -392,9 +391,13 @@
   {
     // Constraints geometry empty.
     MockConstraintFactory constraint_factory;
-    MediaStreamDevice::AudioDeviceParameters input_params;
-    input_params.mic_positions.push_back(media::Point(0, 0, 0));
-    input_params.mic_positions.push_back(media::Point(0, 0.05f, 0));
+
+    std::vector<media::Point> mic_positions;
+    mic_positions.push_back(media::Point(0, 0, 0));
+    mic_positions.push_back(media::Point(0, 0.05f, 0));
+
+    media::AudioParameters input_params;
+    input_params.set_mic_positions(mic_positions);
 
     const auto& actual_geometry = GetArrayGeometryPreferringConstraints(
         MakeMediaAudioConstraints(constraint_factory), input_params);
@@ -405,7 +408,7 @@
     MockConstraintFactory constraint_factory;
     constraint_factory.AddAdvanced().goog_array_geometry.SetExact(
         blink::WebString::FromUTF8("-0.02 0 0 0.02 0 0"));
-    MediaStreamDevice::AudioDeviceParameters input_params;
+    media::AudioParameters input_params;
 
     const auto& actual_geometry = GetArrayGeometryPreferringConstraints(
         MakeMediaAudioConstraints(constraint_factory), input_params);
@@ -416,9 +419,13 @@
     MockConstraintFactory constraint_factory;
     constraint_factory.AddAdvanced().goog_array_geometry.SetExact(
         blink::WebString::FromUTF8("-0.02 0 0 0.02 0 0"));
-    MediaStreamDevice::AudioDeviceParameters input_params;
-    input_params.mic_positions.push_back(media::Point(0, 0, 0));
-    input_params.mic_positions.push_back(media::Point(0, 0.05f, 0));
+
+    std::vector<media::Point> mic_positions;
+    mic_positions.push_back(media::Point(0, 0, 0));
+    mic_positions.push_back(media::Point(0, 0.05f, 0));
+
+    media::AudioParameters input_params;
+    input_params.set_mic_positions(mic_positions);
 
     // Constraints geometry is preferred.
     const auto& actual_geometry = GetArrayGeometryPreferringConstraints(
diff --git a/content/renderer/media/mock_media_stream_dispatcher.cc b/content/renderer/media/mock_media_stream_dispatcher.cc
index a4b3fe5..5af1804c 100644
--- a/content/renderer/media/mock_media_stream_dispatcher.cc
+++ b/content/renderer/media/mock_media_stream_dispatcher.cc
@@ -96,9 +96,10 @@
         kAudioOutputDeviceIdPrefix + base::IntToString(session_id_);
   }
   audio.session_id = session_id_;
-  audio.device.input.sample_rate = media::AudioParameters::kAudioCDSampleRate;
-  audio.device.input.channel_layout = media::CHANNEL_LAYOUT_STEREO;
-  audio.device.input.frames_per_buffer = audio.device.input.sample_rate / 100;
+  audio.device.input = media::AudioParameters(
+      media::AudioParameters::AUDIO_FAKE, media::CHANNEL_LAYOUT_STEREO,
+      media::AudioParameters::kAudioCDSampleRate, 0,
+      media::AudioParameters::kAudioCDSampleRate / 100);
   audio_input_array_.push_back(audio);
 }
 
diff --git a/content/renderer/media/user_media_client_impl.cc b/content/renderer/media/user_media_client_impl.cc
index ed7ec65..bb26affa 100644
--- a/content/renderer/media/user_media_client_impl.cc
+++ b/content/renderer/media/user_media_client_impl.cc
@@ -1086,7 +1086,7 @@
     for (auto& device_info : overridden_audio_array) {
       device_info.device.matched_output_device_id = "";
       device_info.device.matched_output =
-          MediaStreamDevice::AudioDeviceParameters();
+          media::AudioParameters::UnavailableDeviceParams();
     }
   }
 
diff --git a/content/renderer/media/webrtc/processed_local_audio_source.cc b/content/renderer/media/webrtc/processed_local_audio_source.cc
index 6fea798..d3a4a35 100644
--- a/content/renderer/media/webrtc/processed_local_audio_source.cc
+++ b/content/renderer/media/webrtc/processed_local_audio_source.cc
@@ -87,21 +87,22 @@
       ", channel_layout=%d, sample_rate=%d, buffer_size=%d"
       ", session_id=%d, paired_output_sample_rate=%d"
       ", paired_output_frames_per_buffer=%d, effects=%d. ",
-      consumer_render_frame_id_, device_info().device.input.channel_layout,
-      device_info().device.input.sample_rate,
-      device_info().device.input.frames_per_buffer, device_info().session_id,
-      device_info().device.matched_output.sample_rate,
-      device_info().device.matched_output.frames_per_buffer,
-      device_info().device.input.effects));
+      consumer_render_frame_id_, device_info().device.input.channel_layout(),
+      device_info().device.input.sample_rate(),
+      device_info().device.input.frames_per_buffer(), device_info().session_id,
+      device_info().device.matched_output.sample_rate(),
+      device_info().device.matched_output.frames_per_buffer(),
+      device_info().device.input.effects()));
 
   // Disable HW echo cancellation if constraints explicitly specified no
   // echo cancellation.
   if (audio_processing_properties_.disable_hw_echo_cancellation &&
-      (device_info().device.input.effects &
+      (device_info().device.input.effects() &
        media::AudioParameters::ECHO_CANCELLER)) {
     StreamDeviceInfo modified_device_info(device_info());
-    modified_device_info.device.input.effects &=
-        ~media::AudioParameters::ECHO_CANCELLER;
+    modified_device_info.device.input.set_effects(
+        modified_device_info.device.input.effects() &
+        ~media::AudioParameters::ECHO_CANCELLER);
     SetDeviceInfo(modified_device_info);
   }
 
@@ -119,9 +120,9 @@
 
   // If KEYBOARD_MIC effect is set, change the layout to the corresponding
   // layout that includes the keyboard mic.
-  media::ChannelLayout channel_layout = static_cast<media::ChannelLayout>(
-      device_info().device.input.channel_layout);
-  if ((device_info().device.input.effects &
+  media::ChannelLayout channel_layout =
+      device_info().device.input.channel_layout();
+  if ((device_info().device.input.effects() &
        media::AudioParameters::KEYBOARD_MIC) &&
       audio_processing_properties_.goog_experimental_noise_suppression) {
     if (channel_layout == media::CHANNEL_LAYOUT_STEREO) {
@@ -150,14 +151,15 @@
   }
 
   DVLOG(1) << "Audio input hardware sample rate: "
-           << device_info().device.input.sample_rate;
+           << device_info().device.input.sample_rate();
   media::AudioSampleRate asr;
-  if (media::ToAudioSampleRate(device_info().device.input.sample_rate, &asr)) {
+  if (media::ToAudioSampleRate(device_info().device.input.sample_rate(),
+                               &asr)) {
     UMA_HISTOGRAM_ENUMERATION(
         "WebRTC.AudioInputSampleRate", asr, media::kAudioSampleRateMax + 1);
   } else {
     UMA_HISTOGRAM_COUNTS("WebRTC.AudioInputSampleRateUnexpected",
-                         device_info().device.input.sample_rate);
+                         device_info().device.input.sample_rate());
   }
 
   // Determine the audio format required of the AudioCapturerSource. Then, pass
@@ -165,9 +167,9 @@
   // ProcessedLocalAudioSource to the processor's output format.
   media::AudioParameters params(
       media::AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout,
-      device_info().device.input.sample_rate, 16,
-      GetBufferSize(device_info().device.input.sample_rate));
-  params.set_effects(device_info().device.input.effects);
+      device_info().device.input.sample_rate(), 16,
+      GetBufferSize(device_info().device.input.sample_rate()));
+  params.set_effects(device_info().device.input.effects());
   DCHECK(params.IsValid());
   audio_processor_->OnCaptureFormatChanged(params);
   MediaStreamAudioSource::SetFormat(audio_processor_->OutputFormat());
@@ -356,7 +358,7 @@
   // If audio processing is off and the native hardware buffer size was
   // provided, use it. It can be harmful, in terms of CPU/power consumption, to
   // use smaller buffer sizes than the native size (http://crbug.com/362261).
-  if (int hardware_buffer_size = device_info().device.input.frames_per_buffer)
+  if (int hardware_buffer_size = device_info().device.input.frames_per_buffer())
     return hardware_buffer_size;
 
   // If the buffer size is missing from the StreamDeviceInfo, provide 10ms as a
diff --git a/content/renderer/media/webrtc_audio_device_impl.cc b/content/renderer/media/webrtc_audio_device_impl.cc
index a7111d0e..147c1f5 100644
--- a/content/renderer/media/webrtc_audio_device_impl.cc
+++ b/content/renderer/media/webrtc_audio_device_impl.cc
@@ -487,15 +487,15 @@
   // Don't set output parameters unless all of them are valid.
   const StreamDeviceInfo& device_info = capturers_.back()->device_info();
   if (device_info.session_id <= 0 ||
-      !device_info.device.matched_output.sample_rate ||
-      !device_info.device.matched_output.frames_per_buffer) {
+      !device_info.device.matched_output.sample_rate() ||
+      !device_info.device.matched_output.frames_per_buffer()) {
     return false;
   }
 
   *session_id = device_info.session_id;
-  *output_sample_rate = device_info.device.matched_output.sample_rate;
+  *output_sample_rate = device_info.device.matched_output.sample_rate();
   *output_frames_per_buffer =
-      device_info.device.matched_output.frames_per_buffer;
+      device_info.device.matched_output.frames_per_buffer();
 
   return true;
 }
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc
index ea83dcf..f4692bf 100644
--- a/content/renderer/pepper/pepper_plugin_instance_impl.cc
+++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -110,9 +110,9 @@
 #include "third_party/WebKit/public/platform/WebURL.h"
 #include "third_party/WebKit/public/platform/WebURLError.h"
 #include "third_party/WebKit/public/platform/WebURLRequest.h"
-#include "third_party/WebKit/public/web/WebCompositionUnderline.h"
 #include "third_party/WebKit/public/web/WebDocument.h"
 #include "third_party/WebKit/public/web/WebDocumentLoader.h"
+#include "third_party/WebKit/public/web/WebImeTextSpan.h"
 #include "third_party/WebKit/public/web/WebLocalFrame.h"
 #include "third_party/WebKit/public/web/WebPluginContainer.h"
 #include "third_party/WebKit/public/web/WebPluginScriptForbiddenScope.h"
@@ -945,22 +945,19 @@
 bool PepperPluginInstanceImpl::SendCompositionEventToPlugin(
     PP_InputEvent_Type type,
     const base::string16& text) {
-  std::vector<blink::WebCompositionUnderline> empty;
-  return SendCompositionEventWithUnderlineInformationToPlugin(
-      type,
-      text,
-      empty,
-      static_cast<int>(text.size()),
+  std::vector<blink::WebImeTextSpan> empty;
+  return SendCompositionEventWithImeTextSpanInformationToPlugin(
+      type, text, empty, static_cast<int>(text.size()),
       static_cast<int>(text.size()));
 }
 
-bool
-PepperPluginInstanceImpl::SendCompositionEventWithUnderlineInformationToPlugin(
-    PP_InputEvent_Type type,
-    const base::string16& text,
-    const std::vector<blink::WebCompositionUnderline>& underlines,
-    int selection_start,
-    int selection_end) {
+bool PepperPluginInstanceImpl::
+    SendCompositionEventWithImeTextSpanInformationToPlugin(
+        PP_InputEvent_Type type,
+        const base::string16& text,
+        const std::vector<blink::WebImeTextSpan>& ime_text_spans,
+        int selection_start,
+        int selection_end) {
   // Keep a reference on the stack. See NOTE above.
   scoped_refptr<PepperPluginInstanceImpl> ref(this);
 
@@ -981,9 +978,9 @@
   std::vector<size_t> utf16_offsets;
   utf16_offsets.push_back(selection_start);
   utf16_offsets.push_back(selection_end);
-  for (size_t i = 0; i < underlines.size(); ++i) {
-    utf16_offsets.push_back(underlines[i].start_offset);
-    utf16_offsets.push_back(underlines[i].end_offset);
+  for (size_t i = 0; i < ime_text_spans.size(); ++i) {
+    utf16_offsets.push_back(ime_text_spans[i].start_offset);
+    utf16_offsets.push_back(ime_text_spans[i].end_offset);
   }
   std::vector<size_t> utf8_offsets(utf16_offsets);
   event.character_text = base::UTF16ToUTF8AndAdjustOffsets(text, &utf8_offsets);
@@ -1006,8 +1003,8 @@
                                            offset_set.end());
 
   // Set the composition target.
-  for (size_t i = 0; i < underlines.size(); ++i) {
-    if (underlines[i].thick) {
+  for (size_t i = 0; i < ime_text_spans.size(); ++i) {
+    if (ime_text_spans[i].thick) {
       std::vector<uint32_t>::iterator it =
           std::find(event.composition_segment_offsets.begin(),
                     event.composition_segment_offsets.end(),
@@ -1049,15 +1046,12 @@
 
 bool PepperPluginInstanceImpl::HandleCompositionUpdate(
     const base::string16& text,
-    const std::vector<blink::WebCompositionUnderline>& underlines,
+    const std::vector<blink::WebImeTextSpan>& ime_text_spans,
     int selection_start,
     int selection_end) {
-  return SendCompositionEventWithUnderlineInformationToPlugin(
-      PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE,
-      text,
-      underlines,
-      selection_start,
-      selection_end);
+  return SendCompositionEventWithImeTextSpanInformationToPlugin(
+      PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE, text, ime_text_spans,
+      selection_start, selection_end);
 }
 
 bool PepperPluginInstanceImpl::HandleCompositionEnd(
@@ -2335,7 +2329,7 @@
         return false;
       render_frame_->SimulateImeCommitText(
           base::UTF8ToUTF16(input_event.character_text),
-          std::vector<blink::WebCompositionUnderline>(), gfx::Range());
+          std::vector<blink::WebImeTextSpan>(), gfx::Range());
       break;
     default:
       return false;
@@ -2358,18 +2352,18 @@
   base::string16 utf16_text =
       base::UTF8ToUTF16AndAdjustOffsets(input_event.character_text, &offsets);
 
-  std::vector<blink::WebCompositionUnderline> underlines;
+  std::vector<blink::WebImeTextSpan> ime_text_spans;
   for (size_t i = 2; i + 1 < offsets.size(); ++i) {
-    blink::WebCompositionUnderline underline;
-    underline.start_offset = offsets[i];
-    underline.end_offset = offsets[i + 1];
+    blink::WebImeTextSpan ime_text_span;
+    ime_text_span.start_offset = offsets[i];
+    ime_text_span.end_offset = offsets[i + 1];
     if (input_event.composition_target_segment == static_cast<int32_t>(i - 2))
-      underline.thick = true;
-    underlines.push_back(underline);
+      ime_text_span.thick = true;
+    ime_text_spans.push_back(ime_text_span);
   }
 
-  render_frame_->SimulateImeSetComposition(
-      utf16_text, underlines, offsets[0], offsets[1]);
+  render_frame_->SimulateImeSetComposition(utf16_text, ime_text_spans,
+                                           offsets[0], offsets[1]);
 }
 
 ContentDecryptorDelegate*
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.h b/content/renderer/pepper/pepper_plugin_instance_impl.h
index f0cc2331..11e1961d 100644
--- a/content/renderer/pepper/pepper_plugin_instance_impl.h
+++ b/content/renderer/pepper/pepper_plugin_instance_impl.h
@@ -78,7 +78,7 @@
 class WebMouseEvent;
 class WebPluginContainer;
 class WebURLResponse;
-struct WebCompositionUnderline;
+struct WebImeTextSpan;
 struct WebCursorInfo;
 struct WebURLError;
 struct WebPrintParams;
@@ -240,7 +240,7 @@
   bool HandleCompositionStart(const base::string16& text);
   bool HandleCompositionUpdate(
       const base::string16& text,
-      const std::vector<blink::WebCompositionUnderline>& underlines,
+      const std::vector<blink::WebImeTextSpan>& ime_text_spans,
       int selection_start,
       int selection_end);
   bool HandleCompositionEnd(const base::string16& text);
@@ -688,10 +688,10 @@
   // Internal helper functions for HandleCompositionXXX().
   bool SendCompositionEventToPlugin(PP_InputEvent_Type type,
                                     const base::string16& text);
-  bool SendCompositionEventWithUnderlineInformationToPlugin(
+  bool SendCompositionEventWithImeTextSpanInformationToPlugin(
       PP_InputEvent_Type type,
       const base::string16& text,
-      const std::vector<blink::WebCompositionUnderline>& underlines,
+      const std::vector<blink::WebImeTextSpan>& ime_text_spans,
       int selection_start,
       int selection_end);
 
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index f0b6745..971139b7 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -1478,19 +1478,19 @@
 
 void RenderFrameImpl::SimulateImeSetComposition(
     const base::string16& text,
-    const std::vector<blink::WebCompositionUnderline>& underlines,
+    const std::vector<blink::WebImeTextSpan>& ime_text_spans,
     int selection_start,
     int selection_end) {
-  render_view_->OnImeSetComposition(
-      text, underlines, gfx::Range::InvalidRange(),
-      selection_start, selection_end);
+  render_view_->OnImeSetComposition(text, ime_text_spans,
+                                    gfx::Range::InvalidRange(), selection_start,
+                                    selection_end);
 }
 
 void RenderFrameImpl::SimulateImeCommitText(
     const base::string16& text,
-    const std::vector<blink::WebCompositionUnderline>& underlines,
+    const std::vector<blink::WebImeTextSpan>& ime_text_spans,
     const gfx::Range& replacement_range) {
-  render_view_->OnImeCommitText(text, underlines, replacement_range, 0);
+  render_view_->OnImeCommitText(text, ime_text_spans, replacement_range, 0);
 }
 
 void RenderFrameImpl::SimulateImeFinishComposingText(bool keep_selection) {
@@ -1499,7 +1499,7 @@
 
 void RenderFrameImpl::OnImeSetComposition(
     const base::string16& text,
-    const std::vector<blink::WebCompositionUnderline>& underlines,
+    const std::vector<blink::WebImeTextSpan>& ime_text_spans,
     int selection_start,
     int selection_end) {
   // When a PPAPI plugin has focus, we bypass WebKit.
@@ -1523,7 +1523,8 @@
     // Nonempty: composition is ongoing.
     if (!pepper_composition_text_.empty()) {
       focused_pepper_plugin_->HandleCompositionUpdate(
-          pepper_composition_text_, underlines, selection_start, selection_end);
+          pepper_composition_text_, ime_text_spans, selection_start,
+          selection_end);
     }
   }
 }
@@ -2215,10 +2216,11 @@
 }
 
 void RenderFrameImpl::OnSetCompositionFromExistingText(
-    int start, int end,
-    const std::vector<blink::WebCompositionUnderline>& underlines) {
+    int start,
+    int end,
+    const std::vector<blink::WebImeTextSpan>& ime_text_spans) {
   ImeEventGuard guard(GetRenderWidget());
-  frame_->SetCompositionFromExistingText(start, end, underlines);
+  frame_->SetCompositionFromExistingText(start, end, ime_text_spans);
 }
 
 void RenderFrameImpl::OnExecuteNoValueEditCommand(const std::string& name) {
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index d83c434..8b5770dd 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -103,7 +103,7 @@
 class WebPresentationClient;
 class WebPushClient;
 class WebSecurityOrigin;
-struct WebCompositionUnderline;
+struct WebImeTextSpan;
 struct WebContextMenuData;
 struct WebCursorInfo;
 struct WebFindOptions;
@@ -372,12 +372,12 @@
   // Simulates IME events for testing purpose.
   void SimulateImeSetComposition(
       const base::string16& text,
-      const std::vector<blink::WebCompositionUnderline>& underlines,
+      const std::vector<blink::WebImeTextSpan>& ime_text_spans,
       int selection_start,
       int selection_end);
   void SimulateImeCommitText(
       const base::string16& text,
-      const std::vector<blink::WebCompositionUnderline>& underlines,
+      const std::vector<blink::WebImeTextSpan>& ime_text_spans,
       const gfx::Range& replacement_range);
   void SimulateImeFinishComposingText(bool keep_selection);
 
@@ -385,7 +385,7 @@
   // RenderFrame.
   void OnImeSetComposition(
       const base::string16& text,
-      const std::vector<blink::WebCompositionUnderline>& underlines,
+      const std::vector<blink::WebImeTextSpan>& ime_text_spans,
       int selection_start,
       int selection_end);
   void OnImeCommitText(const base::string16& text,
@@ -940,8 +940,9 @@
   void OnVisualStateRequest(uint64_t key);
   void OnSetEditableSelectionOffsets(int start, int end);
   void OnSetCompositionFromExistingText(
-      int start, int end,
-      const std::vector<blink::WebCompositionUnderline>& underlines);
+      int start,
+      int end,
+      const std::vector<blink::WebImeTextSpan>& ime_text_spans);
   void OnExecuteNoValueEditCommand(const std::string& name);
   void OnExtendSelectionAndDelete(int before, int after);
   void OnDeleteSurroundingText(int before, int after);
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index 6ce744eb..ed991b7 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -669,13 +669,13 @@
       IsRunningInMash() ? ui::mojom::kServiceName : mojom::kBrowserServiceName,
       GetIOTaskRunner());
 
-  cc::mojom::SharedBitmapAllocationNotifierPtr
+  viz::mojom::SharedBitmapAllocationNotifierPtr
       shared_bitmap_allocation_notifier_ptr;
   GetConnector()->BindInterface(
       mojom::kBrowserServiceName,
       mojo::MakeRequest(&shared_bitmap_allocation_notifier_ptr));
   shared_bitmap_manager_ = base::MakeUnique<viz::ClientSharedBitmapManager>(
-      cc::mojom::ThreadSafeSharedBitmapAllocationNotifierPtr::Create(
+      viz::mojom::ThreadSafeSharedBitmapAllocationNotifierPtr::Create(
           shared_bitmap_allocation_notifier_ptr.PassInterface(),
           GetChannel()->ipc_task_runner_refptr()));
 
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc
index dec950f..8a8b844 100644
--- a/content/renderer/render_view_browsertest.cc
+++ b/content/renderer/render_view_browsertest.cc
@@ -1256,15 +1256,13 @@
       case IME_SETCOMPOSITION:
         view()->OnImeSetComposition(
             base::WideToUTF16(ime_message->ime_string),
-            std::vector<blink::WebCompositionUnderline>(),
-            gfx::Range::InvalidRange(),
-            ime_message->selection_start,
-            ime_message->selection_end);
+            std::vector<blink::WebImeTextSpan>(), gfx::Range::InvalidRange(),
+            ime_message->selection_start, ime_message->selection_end);
         break;
 
       case IME_COMMITTEXT:
         view()->OnImeCommitText(base::WideToUTF16(ime_message->ime_string),
-                                std::vector<blink::WebCompositionUnderline>(),
+                                std::vector<blink::WebImeTextSpan>(),
                                 gfx::Range::InvalidRange(), 0);
         break;
 
@@ -1273,11 +1271,9 @@
         break;
 
       case IME_CANCELCOMPOSITION:
-        view()->OnImeSetComposition(
-            base::string16(),
-            std::vector<blink::WebCompositionUnderline>(),
-            gfx::Range::InvalidRange(),
-            0, 0);
+        view()->OnImeSetComposition(base::string16(),
+                                    std::vector<blink::WebImeTextSpan>(),
+                                    gfx::Range::InvalidRange(), 0, 0);
         break;
     }
 
@@ -1511,48 +1507,44 @@
   ExecuteJavaScriptForTests("document.getElementById('test').focus();");
 
   const base::string16 empty_string;
-  const std::vector<blink::WebCompositionUnderline> empty_underline;
+  const std::vector<blink::WebImeTextSpan> empty_ime_text_span;
   std::vector<gfx::Rect> bounds;
   view()->OnSetFocus(true);
 
   // ASCII composition
   const base::string16 ascii_composition = base::UTF8ToUTF16("aiueo");
-  view()->OnImeSetComposition(ascii_composition, empty_underline,
+  view()->OnImeSetComposition(ascii_composition, empty_ime_text_span,
                               gfx::Range::InvalidRange(), 0, 0);
   view()->GetCompositionCharacterBounds(&bounds);
   ASSERT_EQ(ascii_composition.size(), bounds.size());
 
   for (size_t i = 0; i < bounds.size(); ++i)
     EXPECT_LT(0, bounds[i].width());
-  view()->OnImeCommitText(empty_string,
-                          std::vector<blink::WebCompositionUnderline>(),
+  view()->OnImeCommitText(empty_string, std::vector<blink::WebImeTextSpan>(),
                           gfx::Range::InvalidRange(), 0);
 
   // Non surrogate pair unicode character.
   const base::string16 unicode_composition = base::UTF8ToUTF16(
       "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
-  view()->OnImeSetComposition(unicode_composition, empty_underline,
+  view()->OnImeSetComposition(unicode_composition, empty_ime_text_span,
                               gfx::Range::InvalidRange(), 0, 0);
   view()->GetCompositionCharacterBounds(&bounds);
   ASSERT_EQ(unicode_composition.size(), bounds.size());
   for (size_t i = 0; i < bounds.size(); ++i)
     EXPECT_LT(0, bounds[i].width());
-  view()->OnImeCommitText(empty_string, empty_underline,
+  view()->OnImeCommitText(empty_string, empty_ime_text_span,
                           gfx::Range::InvalidRange(), 0);
 
   // Surrogate pair character.
   const base::string16 surrogate_pair_char =
       base::UTF8ToUTF16("\xF0\xA0\xAE\x9F");
-  view()->OnImeSetComposition(surrogate_pair_char,
-                              empty_underline,
-                              gfx::Range::InvalidRange(),
-                              0,
-                              0);
+  view()->OnImeSetComposition(surrogate_pair_char, empty_ime_text_span,
+                              gfx::Range::InvalidRange(), 0, 0);
   view()->GetCompositionCharacterBounds(&bounds);
   ASSERT_EQ(surrogate_pair_char.size(), bounds.size());
   EXPECT_LT(0, bounds[0].width());
   EXPECT_EQ(0, bounds[1].width());
-  view()->OnImeCommitText(empty_string, empty_underline,
+  view()->OnImeCommitText(empty_string, empty_ime_text_span,
                           gfx::Range::InvalidRange(), 0);
 
   // Mixed string.
@@ -1563,10 +1555,8 @@
   const bool is_surrogate_pair_empty_rect[8] = {
     false, true, false, false, true, false, false, true };
   view()->OnImeSetComposition(surrogate_pair_mixed_composition,
-                              empty_underline,
-                              gfx::Range::InvalidRange(),
-                              0,
-                              0);
+                              empty_ime_text_span, gfx::Range::InvalidRange(),
+                              0, 0);
   view()->GetCompositionCharacterBounds(&bounds);
   ASSERT_EQ(utf16_length, bounds.size());
   for (size_t i = 0; i < utf16_length; ++i) {
@@ -1576,7 +1566,7 @@
       EXPECT_LT(0, bounds[i].width());
     }
   }
-  view()->OnImeCommitText(empty_string, empty_underline,
+  view()->OnImeCommitText(empty_string, empty_ime_text_span,
                           gfx::Range::InvalidRange(), 0);
 }
 #endif
@@ -1592,8 +1582,8 @@
            "</html>");
   ExecuteJavaScriptForTests("document.getElementById('test1').focus();");
   frame()->SetEditableSelectionOffsets(4, 8);
-  const std::vector<blink::WebCompositionUnderline> empty_underline;
-  frame()->SetCompositionFromExistingText(7, 10, empty_underline);
+  const std::vector<blink::WebImeTextSpan> empty_ime_text_span;
+  frame()->SetCompositionFromExistingText(7, 10, empty_ime_text_span);
   blink::WebInputMethodController* controller =
       frame()->GetWebFrame()->GetInputMethodController();
   blink::WebTextInputInfo info = controller->TextInputInfo();
@@ -2457,13 +2447,13 @@
   ExecuteJavaScriptForTests("document.getElementById('test').focus();");
 
   const base::string16 empty_string;
-  const std::vector<blink::WebCompositionUnderline> empty_underline;
+  const std::vector<blink::WebImeTextSpan> empty_ime_text_span;
   std::vector<gfx::Rect> bounds_at_1x;
   view()->OnSetFocus(true);
 
   // ASCII composition
   const base::string16 ascii_composition = base::UTF8ToUTF16("aiueo");
-  view()->OnImeSetComposition(ascii_composition, empty_underline,
+  view()->OnImeSetComposition(ascii_composition, empty_ime_text_span,
                               gfx::Range::InvalidRange(), 0, 0);
   view()->GetCompositionCharacterBounds(&bounds_at_1x);
   ASSERT_EQ(ascii_composition.size(), bounds_at_1x.size());
diff --git a/content/renderer/render_view_browsertest_mac.mm b/content/renderer/render_view_browsertest_mac.mm
index c425813..21e28f8 100644
--- a/content/renderer/render_view_browsertest_mac.mm
+++ b/content/renderer/render_view_browsertest_mac.mm
@@ -23,7 +23,7 @@
 #include <Cocoa/Cocoa.h>
 
 using blink::WebFrameContentDumper;
-using blink::WebCompositionUnderline;
+using blink::WebImeTextSpan;
 
 namespace content {
 
@@ -182,11 +182,11 @@
 
   // Simulate some IME related IPCs.
   using Text = base::string16;
-  using Underlines = std::vector<blink::WebCompositionUnderline>;
+  using ImeTextSpans = std::vector<blink::WebImeTextSpan>;
   view->OnMessageReceived(InputMsg_ImeSetComposition(
-      routing_id, Text(), Underlines(), Range(), 0, 0));
+      routing_id, Text(), ImeTextSpans(), Range(), 0, 0));
   view->OnMessageReceived(
-      InputMsg_ImeCommitText(routing_id, Text(), Underlines(), Range(), 0));
+      InputMsg_ImeCommitText(routing_id, Text(), ImeTextSpans(), Range(), 0));
   view->OnMessageReceived(InputMsg_ImeFinishComposingText(routing_id, false));
 }
 
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 89e9a3af..5c373d4 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -120,7 +120,7 @@
 #include "content/renderer/text_input_client_observer.h"
 #endif
 
-using blink::WebCompositionUnderline;
+using blink::WebImeTextSpan;
 using blink::WebCursorInfo;
 using blink::WebDeviceEmulationParams;
 using blink::WebDragOperation;
@@ -1660,15 +1660,16 @@
 
 void RenderWidget::OnImeSetComposition(
     const base::string16& text,
-    const std::vector<WebCompositionUnderline>& underlines,
+    const std::vector<WebImeTextSpan>& ime_text_spans,
     const gfx::Range& replacement_range,
-    int selection_start, int selection_end) {
+    int selection_start,
+    int selection_end) {
   if (!ShouldHandleImeEvents())
     return;
 
 #if BUILDFLAG(ENABLE_PLUGINS)
   if (auto* plugin = GetFocusedPepperPluginInsideWidget()) {
-    plugin->render_frame()->OnImeSetComposition(text, underlines,
+    plugin->render_frame()->OnImeSetComposition(text, ime_text_spans,
                                                 selection_start, selection_end);
     return;
   }
@@ -1677,8 +1678,7 @@
   blink::WebInputMethodController* controller = GetInputMethodController();
   if (!controller ||
       !controller->SetComposition(
-          WebString::FromUTF16(text),
-          WebVector<WebCompositionUnderline>(underlines),
+          WebString::FromUTF16(text), WebVector<WebImeTextSpan>(ime_text_spans),
           replacement_range.IsValid()
               ? WebRange(replacement_range.start(), replacement_range.length())
               : WebRange(),
@@ -1693,7 +1693,7 @@
 
 void RenderWidget::OnImeCommitText(
     const base::string16& text,
-    const std::vector<WebCompositionUnderline>& underlines,
+    const std::vector<WebImeTextSpan>& ime_text_spans,
     const gfx::Range& replacement_range,
     int relative_cursor_pos) {
   if (!ShouldHandleImeEvents())
@@ -1710,8 +1710,7 @@
   input_handler_->set_handling_input_event(true);
   if (auto* controller = GetInputMethodController()) {
     controller->CommitText(
-        WebString::FromUTF16(text),
-        WebVector<WebCompositionUnderline>(underlines),
+        WebString::FromUTF16(text), WebVector<WebImeTextSpan>(ime_text_spans),
         replacement_range.IsValid()
             ? WebRange(replacement_range.start(), replacement_range.length())
             : WebRange(),
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index ab1b3ea..3785f02 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -52,7 +52,7 @@
 #include "third_party/WebKit/public/platform/WebRect.h"
 #include "third_party/WebKit/public/platform/WebReferrerPolicy.h"
 #include "third_party/WebKit/public/platform/WebTextInputInfo.h"
-#include "third_party/WebKit/public/web/WebCompositionUnderline.h"
+#include "third_party/WebKit/public/web/WebImeTextSpan.h"
 #include "third_party/WebKit/public/web/WebPopupType.h"
 #include "third_party/WebKit/public/web/WebTextDirection.h"
 #include "third_party/WebKit/public/web/WebWidget.h"
@@ -435,15 +435,14 @@
   void OnSetEditCommandsForNextKeyEvent(const EditCommands& edit_commands);
   void OnImeSetComposition(
       const base::string16& text,
-      const std::vector<blink::WebCompositionUnderline>& underlines,
+      const std::vector<blink::WebImeTextSpan>& ime_text_spans,
       const gfx::Range& replacement_range,
       int selection_start,
       int selection_end);
-  void OnImeCommitText(
-      const base::string16& text,
-      const std::vector<blink::WebCompositionUnderline>& underlines,
-      const gfx::Range& replacement_range,
-      int relative_cursor_pos);
+  void OnImeCommitText(const base::string16& text,
+                       const std::vector<blink::WebImeTextSpan>& ime_text_spans,
+                       const gfx::Range& replacement_range,
+                       int relative_cursor_pos);
   void OnImeFinishComposingText(bool keep_selection);
 
   // Called by the browser process to update text input state.
diff --git a/content/renderer/render_widget_browsertest.cc b/content/renderer/render_widget_browsertest.cc
index 3f8fcf9..7d4cc20 100644
--- a/content/renderer/render_widget_browsertest.cc
+++ b/content/renderer/render_widget_browsertest.cc
@@ -37,10 +37,9 @@
   }
 
   void CommitText(std::string text) {
-    widget()->OnImeCommitText(
-        base::UTF8ToUTF16(text),
-        std::vector<blink::WebCompositionUnderline>(),
-        gfx::Range::InvalidRange(), 0);
+    widget()->OnImeCommitText(base::UTF8ToUTF16(text),
+                              std::vector<blink::WebImeTextSpan>(),
+                              gfx::Range::InvalidRange(), 0);
   }
 
   ui::TextInputType GetTextInputType() { return widget()->GetTextInputType(); }
@@ -128,10 +127,10 @@
   LoadHTML(
       "<div contenteditable>EDITABLE</div>"
       "<script> document.querySelector('div').focus(); </script>");
-  blink::WebVector<blink::WebCompositionUnderline> emptyUnderlines;
+  blink::WebVector<blink::WebImeTextSpan> empty_ime_text_spans;
   DCHECK(widget()->GetInputMethodController());
-  widget()->GetInputMethodController()->SetComposition("hello", emptyUnderlines,
-                                                       blink::WebRange(), 3, 3);
+  widget()->GetInputMethodController()->SetComposition(
+      "hello", empty_ime_text_spans, blink::WebRange(), 3, 3);
   gfx::Range range;
   GetCompositionRange(&range);
   EXPECT_TRUE(range.IsValid());
diff --git a/content/renderer/render_widget_fullscreen_pepper.cc b/content/renderer/render_widget_fullscreen_pepper.cc
index a40db586f..4206136 100644
--- a/content/renderer/render_widget_fullscreen_pepper.cc
+++ b/content/renderer/render_widget_fullscreen_pepper.cc
@@ -30,7 +30,7 @@
 
 using blink::WebCanvas;
 using blink::WebCoalescedInputEvent;
-using blink::WebCompositionUnderline;
+using blink::WebImeTextSpan;
 using blink::WebCursorInfo;
 using blink::WebGestureEvent;
 using blink::WebInputEvent;
diff --git a/content/renderer/renderer.sb b/content/renderer/renderer.sb
index fd54bf7..daa3666 100644
--- a/content/renderer/renderer.sb
+++ b/content/renderer/renderer.sb
@@ -33,8 +33,12 @@
 
 ; https://crbug.com/288697
 (allow file-read*
-  (path "/private/etc/localtime")
-  (subpath "/usr/share/zoneinfo"))
+  (path "/private/etc/localtime"))
+
+; https://crbug.com/754280
+(if (param-true? macos-1013)
+  (allow file-read-data (subpath "/usr/share/zoneinfo.default"))
+  (allow file-read-data (subpath "/usr/share/zoneinfo")))
 
 (allow file-read-metadata (path "/private/etc"))
 
diff --git a/content/shell/android/BUILD.gn b/content/shell/android/BUILD.gn
index 4451c1ed..2187a04f 100644
--- a/content/shell/android/BUILD.gn
+++ b/content/shell/android/BUILD.gn
@@ -7,6 +7,9 @@
 import("//build/config/android/rules.gni")
 import("//third_party/icu/config.gni")
 
+content_shell_manifest =
+    "$target_gen_dir/content_shell_manifest/AndroidManifest.xml"
+
 generate_jni("content_shell_jni_headers") {
   jni_package = "content/shell"
   sources = [
@@ -60,6 +63,7 @@
   testonly = true
   deps = [
     ":content_shell_java_resources",
+    ":content_shell_manifest",
     "//base:base_java",
     "//base:base_java_test_support",
     "//content/public/android:content_java",
@@ -76,10 +80,10 @@
     "java/src/org/chromium/content_shell/ShellManager.java",
     "java/src/org/chromium/content_shell/ShellViewAndroidDelegate.java",
   ]
-}
 
-content_shell_manifest =
-    "$target_gen_dir/content_shell_manifest/AndroidManifest.xml"
+  # Manifest used for linting (determining unused resources).
+  android_manifest = content_shell_manifest
+}
 
 jinja_template("content_shell_manifest") {
   testonly = true
diff --git a/content/shell/android/java/src/org/chromium/content_shell/ShellViewAndroidDelegate.java b/content/shell/android/java/src/org/chromium/content_shell/ShellViewAndroidDelegate.java
index 0e51e9d..3e0f852 100644
--- a/content/shell/android/java/src/org/chromium/content_shell/ShellViewAndroidDelegate.java
+++ b/content/shell/android/java/src/org/chromium/content_shell/ShellViewAndroidDelegate.java
@@ -4,8 +4,11 @@
 
 package org.chromium.content_shell;
 
+import android.graphics.Bitmap;
 import android.view.ViewGroup;
 
+import org.chromium.base.test.util.CallbackHelper;
+import org.chromium.blink_public.web.WebCursorInfoType;
 import org.chromium.ui.base.ViewAndroidDelegate;
 
 /**
@@ -13,14 +16,47 @@
  * Extended for testing.
  */
 public class ShellViewAndroidDelegate extends ViewAndroidDelegate {
+    /**
+     * CallbackHelper for cursor update.
+     */
+    public static class OnCursorUpdateHelper extends CallbackHelper {
+        private int mPointerType;
+        public void notifyCalled(int type) {
+            mPointerType = type;
+            notifyCalled();
+        }
+        public int getPointerType() {
+            assert getCallCount() > 0;
+            return mPointerType;
+        }
+    }
+
     private final ViewGroup mContainerView;
+    private final OnCursorUpdateHelper mOnCursorUpdateHelper;
 
     public ShellViewAndroidDelegate(ViewGroup containerView) {
         mContainerView = containerView;
+        mOnCursorUpdateHelper = new OnCursorUpdateHelper();
     }
 
     @Override
     public ViewGroup getContainerView() {
         return mContainerView;
     }
+
+    public OnCursorUpdateHelper getOnCursorUpdateHelper() {
+        return mOnCursorUpdateHelper;
+    }
+
+    @Override
+    public void onCursorChangedToCustom(Bitmap customCursorBitmap, int hotspotX, int hotspotY) {
+        super.onCursorChangedToCustom(customCursorBitmap, hotspotX, hotspotY);
+        mOnCursorUpdateHelper.notifyCalled(WebCursorInfoType.TYPE_CUSTOM);
+    }
+
+    @Override
+    public void onCursorChanged(int cursorType) {
+        super.onCursorChanged(cursorType);
+        mOnCursorUpdateHelper.notifyCalled(cursorType);
+    }
 }
diff --git a/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellActivityTestRule.java b/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellActivityTestRule.java
index 7106f5d..7f704821 100644
--- a/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellActivityTestRule.java
+++ b/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellActivityTestRule.java
@@ -21,6 +21,7 @@
 import org.chromium.content_public.browser.NavigationController;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_shell.Shell;
+import org.chromium.content_shell.ShellViewAndroidDelegate.OnCursorUpdateHelper;
 import org.chromium.content_shell_apk.ContentShellTestCommon.TestCommonCallback;
 
 import java.lang.annotation.ElementType;
@@ -76,6 +77,13 @@
     }
 
     /**
+     * Returns the OnCursorUpdateHelper.
+     */
+    public OnCursorUpdateHelper getOnCursorUpdateHelper() throws ExecutionException {
+        return mDelegate.getOnCursorUpdateHelper();
+    }
+
+    /**
      * Returns the current ContentViewCore or null if there is no ContentView.
      */
     public ContentViewCore getContentViewCore() {
diff --git a/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellTestCommon.java b/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellTestCommon.java
index cac7590b..75ac4bc 100644
--- a/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellTestCommon.java
+++ b/content/shell/android/javatests/src/org/chromium/content_shell_apk/ContentShellTestCommon.java
@@ -32,6 +32,7 @@
 import org.chromium.content_public.browser.NavigationController;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_shell.Shell;
+import org.chromium.content_shell.ShellViewAndroidDelegate.OnCursorUpdateHelper;
 
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
@@ -118,6 +119,18 @@
         }, WAIT_FOR_ACTIVE_SHELL_LOADING_TIMEOUT, CriteriaHelper.DEFAULT_POLLING_INTERVAL);
     }
 
+    OnCursorUpdateHelper getOnCursorUpdateHelper() throws ExecutionException {
+        return ThreadUtils.runOnUiThreadBlocking(new Callable<OnCursorUpdateHelper>() {
+            @Override
+            public OnCursorUpdateHelper call() {
+                return mCallback.getActivityForTestCommon()
+                        .getActiveShell()
+                        .getViewAndroidDelegate()
+                        .getOnCursorUpdateHelper();
+            }
+        });
+    }
+
     ContentViewCore getContentViewCore() {
         return mCallback.getActivityForTestCommon().getActiveShell().getContentViewCore();
     }
diff --git a/content/shell/app/blink_test_platform_support_win.cc b/content/shell/app/blink_test_platform_support_win.cc
index 672895e..3694b22e 100644
--- a/content/shell/app/blink_test_platform_support_win.cc
+++ b/content/shell/app/blink_test_platform_support_win.cc
@@ -19,12 +19,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "ui/gfx/win/direct_write.h"
 
-#define SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(struct_name, member) \
-    offsetof(struct_name, member) + \
-    (sizeof static_cast<struct_name*>(0)->member)
-#define NONCLIENTMETRICS_SIZE_PRE_VISTA \
-    SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(NONCLIENTMETRICS, lfMessageFont)
-
 namespace content {
 
 namespace {
@@ -57,35 +51,25 @@
   if (::GetSystemMetrics(SM_CXVSCROLL) != 17)
     errors.push_back("Must use normal size fonts (96 dpi).");
 
-  // Check that we're using the default system fonts.
-  OSVERSIONINFO version_info = {0};
-  version_info.dwOSVersionInfoSize = sizeof(version_info);
-  ::GetVersionEx(&version_info);
-  bool is_vista_or_later = (version_info.dwMajorVersion >= 6);
   NONCLIENTMETRICS metrics = {0};
-  metrics.cbSize = is_vista_or_later ? sizeof(NONCLIENTMETRICS)
-                                     : NONCLIENTMETRICS_SIZE_PRE_VISTA;
+  metrics.cbSize = sizeof(NONCLIENTMETRICS);
   bool success = !!::SystemParametersInfo(
       SPI_GETNONCLIENTMETRICS, metrics.cbSize, &metrics, 0);
   CHECK(success);
   LOGFONTW* system_fonts[] =
       {&metrics.lfStatusFont, &metrics.lfMenuFont, &metrics.lfSmCaptionFont};
-  const wchar_t* required_font = is_vista_or_later ? L"Segoe UI" : L"Tahoma";
-  int required_font_size = is_vista_or_later ? -12 : -11;
+  const wchar_t required_font[] = L"Segoe UI";
+  int required_font_size = -12;
   for (size_t i = 0; i < arraysize(system_fonts); ++i) {
     if (system_fonts[i]->lfHeight != required_font_size ||
         wcscmp(required_font, system_fonts[i]->lfFaceName)) {
-      errors.push_back(is_vista_or_later
-                           ? "Must use either the Aero or Basic theme."
-                           : "Must use the default XP theme (Luna).");
+      errors.push_back("Must use either the Aero or Basic theme.");
       break;
     }
   }
 
-  for (std::list<std::string>::iterator it = errors.begin(); it != errors.end();
-       ++it) {
-    std::cerr << *it << "\n";
-  }
+  for (const auto& error : errors)
+    std::cerr << error << "\n";
   return errors.empty();
 }
 
diff --git a/content/shell/test_runner/text_input_controller.cc b/content/shell/test_runner/text_input_controller.cc
index 9e7d7ba..d9f0929 100644
--- a/content/shell/test_runner/text_input_controller.cc
+++ b/content/shell/test_runner/text_input_controller.cc
@@ -14,8 +14,8 @@
 #include "third_party/WebKit/public/platform/WebCoalescedInputEvent.h"
 #include "third_party/WebKit/public/platform/WebInputEventResult.h"
 #include "third_party/WebKit/public/platform/WebKeyboardEvent.h"
-#include "third_party/WebKit/public/web/WebCompositionUnderline.h"
 #include "third_party/WebKit/public/web/WebFrameWidget.h"
+#include "third_party/WebKit/public/web/WebImeTextSpan.h"
 #include "third_party/WebKit/public/web/WebInputMethodController.h"
 #include "third_party/WebKit/public/web/WebKit.h"
 #include "third_party/WebKit/public/web/WebLocalFrame.h"
@@ -173,7 +173,7 @@
 void TextInputController::InsertText(const std::string& text) {
   if (auto* controller = GetInputMethodController()) {
     controller->CommitText(blink::WebString::FromUTF8(text),
-                           std::vector<blink::WebCompositionUnderline>(),
+                           std::vector<blink::WebImeTextSpan>(),
                            blink::WebRange(), 0);
   }
 }
@@ -202,28 +202,28 @@
   blink::WebString web_text(blink::WebString::FromUTF8(text));
 
   // Split underline into up to 3 elements (before, selection, and after).
-  std::vector<blink::WebCompositionUnderline> underlines;
-  blink::WebCompositionUnderline underline;
+  std::vector<blink::WebImeTextSpan> ime_text_spans;
+  blink::WebImeTextSpan ime_text_span;
   if (!start) {
-    underline.end_offset = length;
+    ime_text_span.end_offset = length;
   } else {
-    underline.end_offset = start;
-    underlines.push_back(underline);
-    underline.start_offset = start;
-    underline.end_offset = start + length;
+    ime_text_span.end_offset = start;
+    ime_text_spans.push_back(ime_text_span);
+    ime_text_span.start_offset = start;
+    ime_text_span.end_offset = start + length;
   }
-  underline.thick = true;
-  underlines.push_back(underline);
+  ime_text_span.thick = true;
+  ime_text_spans.push_back(ime_text_span);
   if (start + length < static_cast<int>(web_text.length())) {
-    underline.start_offset = underline.end_offset;
-    underline.end_offset = web_text.length();
-    underline.thick = false;
-    underlines.push_back(underline);
+    ime_text_span.start_offset = ime_text_span.end_offset;
+    ime_text_span.end_offset = web_text.length();
+    ime_text_span.thick = false;
+    ime_text_spans.push_back(ime_text_span);
   }
 
   if (auto* controller = GetInputMethodController()) {
-    controller->SetComposition(web_text, underlines, blink::WebRange(), start,
-                               start + length);
+    controller->SetComposition(web_text, ime_text_spans, blink::WebRange(),
+                               start, start + length);
   }
 }
 
@@ -311,12 +311,12 @@
   blink::WebString newText = blink::WebString::FromUTF8(text);
   size_t textLength = newText.length();
 
-  std::vector<blink::WebCompositionUnderline> underlines;
-  underlines.push_back(blink::WebCompositionUnderline(
-      0, textLength, SK_ColorBLACK, false, SK_ColorTRANSPARENT));
+  std::vector<blink::WebImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(blink::WebImeTextSpan(0, textLength, SK_ColorBLACK,
+                                                 false, SK_ColorTRANSPARENT));
   if (auto* controller = GetInputMethodController()) {
     controller->SetComposition(
-        newText, blink::WebVector<blink::WebCompositionUnderline>(underlines),
+        newText, blink::WebVector<blink::WebImeTextSpan>(ime_text_spans),
         blink::WebRange(), textLength, textLength);
   }
 }
diff --git a/content/test/data/accessibility/aria/aria-col-attr-expected-mac.txt b/content/test/data/accessibility/aria/aria-col-attr-expected-mac.txt
index 2f53480..e2f6b921 100644
--- a/content/test/data/accessibility/aria/aria-col-attr-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-col-attr-expected-mac.txt
@@ -1,5 +1,5 @@
 AXWebArea
-++AXGrid AXARIAColumnCount='5'
+++AXTable AXARIAColumnCount='5'
 ++++AXRow
 ++++++AXCell AXTitle='cell 2' AXARIAColumnIndex='2'
 ++++++++AXStaticText AXValue='cell 2'
diff --git a/content/test/data/accessibility/aria/aria-columnheader-expected-mac.txt b/content/test/data/accessibility/aria/aria-columnheader-expected-mac.txt
index ada8210..7c778711 100644
--- a/content/test/data/accessibility/aria/aria-columnheader-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-columnheader-expected-mac.txt
@@ -1,5 +1,5 @@
 AXWebArea
-++AXGrid
+++AXTable
 ++++AXRow
 ++++++AXCell AXTitle='Browser'
 ++++++++AXStaticText AXValue='Browser'
diff --git a/content/test/data/accessibility/aria/aria-grid-expected-mac.txt b/content/test/data/accessibility/aria/aria-grid-expected-mac.txt
index 22c6b08..68f4871 100644
--- a/content/test/data/accessibility/aria/aria-grid-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-grid-expected-mac.txt
@@ -1,5 +1,5 @@
 AXWebArea AXRoleDescription='HTML content'
-++AXGrid AXRoleDescription='grid'
+++AXTable AXRoleDescription='table'
 ++++AXRow AXRoleDescription='row'
 ++++++AXCell AXRoleDescription='cell' AXTitle='Browser'
 ++++++++AXStaticText AXRoleDescription='text' AXValue='Browser'
diff --git a/content/test/data/accessibility/aria/aria-gridcell-expected-mac.txt b/content/test/data/accessibility/aria/aria-gridcell-expected-mac.txt
index 22c6b08..68f4871 100644
--- a/content/test/data/accessibility/aria/aria-gridcell-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-gridcell-expected-mac.txt
@@ -1,5 +1,5 @@
 AXWebArea AXRoleDescription='HTML content'
-++AXGrid AXRoleDescription='grid'
+++AXTable AXRoleDescription='table'
 ++++AXRow AXRoleDescription='row'
 ++++++AXCell AXRoleDescription='cell' AXTitle='Browser'
 ++++++++AXStaticText AXRoleDescription='text' AXValue='Browser'
diff --git a/content/test/data/accessibility/aria/aria-row-attr-expected-mac.txt b/content/test/data/accessibility/aria/aria-row-attr-expected-mac.txt
index 35def74..a4fc45e 100644
--- a/content/test/data/accessibility/aria/aria-row-attr-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-row-attr-expected-mac.txt
@@ -1,5 +1,5 @@
 AXWebArea
-++AXGrid AXARIARowCount='5'
+++AXTable AXARIARowCount='5'
 ++++AXRow
 ++++++AXCell AXTitle='cell 2' AXARIARowIndex='3'
 ++++++++AXStaticText AXValue='cell 2'
diff --git a/content/test/data/accessibility/aria/aria-row-expected-mac.txt b/content/test/data/accessibility/aria/aria-row-expected-mac.txt
index ada8210..7c778711 100644
--- a/content/test/data/accessibility/aria/aria-row-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-row-expected-mac.txt
@@ -1,5 +1,5 @@
 AXWebArea
-++AXGrid
+++AXTable
 ++++AXRow
 ++++++AXCell AXTitle='Browser'
 ++++++++AXStaticText AXValue='Browser'
diff --git a/content/test/data/accessibility/aria/aria-rowgroup-expected-mac.txt b/content/test/data/accessibility/aria/aria-rowgroup-expected-mac.txt
index f22f6ef8..b8033e6 100644
--- a/content/test/data/accessibility/aria/aria-rowgroup-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-rowgroup-expected-mac.txt
@@ -1,5 +1,5 @@
 AXWebArea
-++AXGrid
+++AXTable
 ++++AXRow
 ++++AXRow
 ++++AXGroup
diff --git a/content/test/data/accessibility/aria/aria-rowheader-expected-mac.txt b/content/test/data/accessibility/aria/aria-rowheader-expected-mac.txt
index c8d13ff..5b6be0fa 100644
--- a/content/test/data/accessibility/aria/aria-rowheader-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-rowheader-expected-mac.txt
@@ -1,5 +1,5 @@
 AXWebArea
-++AXGrid
+++AXTable
 ++++AXRow
 ++++++AXCell AXTitle='Browser'
 ++++++++AXStaticText AXValue='Browser'
diff --git a/content/test/data/accessibility/aria/aria-sort-aria-grid-expected-mac.txt b/content/test/data/accessibility/aria/aria-sort-aria-grid-expected-mac.txt
index 747f5a01..b4b49bd 100644
--- a/content/test/data/accessibility/aria/aria-sort-aria-grid-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-sort-aria-grid-expected-mac.txt
@@ -1,5 +1,5 @@
 AXWebArea
-++AXGrid
+++AXTable
 ++++AXRow
 ++++++AXCell AXTitle='Alphabet'
 ++++++++AXStaticText AXValue='Alphabet'
@@ -11,7 +11,7 @@
 ++++++++AXStaticText AXValue='B'
 ++++AXColumn
 ++++AXGroup
-++AXGrid
+++AXTable
 ++++AXRow
 ++++++AXCell AXTitle='Alphabet'
 ++++++++AXStaticText AXValue='Alphabet'
@@ -23,7 +23,7 @@
 ++++++++AXStaticText AXValue='B'
 ++++AXColumn
 ++++AXGroup
-++AXGrid
+++AXTable
 ++++AXRow
 ++++++AXCell AXTitle='Alphabet' AXSortDirection='AXAscendingSortDirection'
 ++++++++AXStaticText AXValue='Alphabet'
@@ -35,7 +35,7 @@
 ++++++++AXStaticText AXValue='B'
 ++++AXColumn
 ++++AXGroup
-++AXGrid
+++AXTable
 ++++AXRow
 ++++++AXCell AXTitle='Alphabet' AXSortDirection='AXDescendingSortDirection'
 ++++++++AXStaticText AXValue='Alphabet'
@@ -47,7 +47,7 @@
 ++++++++AXStaticText AXValue='A'
 ++++AXColumn
 ++++AXGroup
-++AXGrid
+++AXTable
 ++++AXRow
 ++++++AXCell AXTitle='Alphabet' AXSortDirection='AXUnknownSortDirection'
 ++++++++AXStaticText AXValue='Alphabet'
@@ -59,7 +59,7 @@
 ++++++++AXStaticText AXValue='A'
 ++++AXColumn
 ++++AXGroup
-++AXGrid
+++AXTable
 ++++AXRow
 ++++++AXCell AXTitle='Alphabet'
 ++++++++AXStaticText AXValue='Alphabet'
@@ -71,7 +71,7 @@
 ++++AXColumn
 ++++AXColumn
 ++++AXGroup
-++AXGrid
+++AXTable
 ++++AXRow
 ++++++AXCell AXTitle='Alphabet'
 ++++++++AXStaticText AXValue='Alphabet'
@@ -83,7 +83,7 @@
 ++++AXColumn
 ++++AXColumn
 ++++AXGroup
-++AXGrid
+++AXTable
 ++++AXRow
 ++++++AXCell AXTitle='Alphabet' AXSortDirection='AXAscendingSortDirection'
 ++++++++AXStaticText AXValue='Alphabet'
@@ -95,7 +95,7 @@
 ++++AXColumn
 ++++AXColumn
 ++++AXGroup
-++AXGrid
+++AXTable
 ++++AXRow
 ++++++AXCell AXTitle='Alphabet' AXSortDirection='AXDescendingSortDirection'
 ++++++++AXStaticText AXValue='Alphabet'
@@ -107,7 +107,7 @@
 ++++AXColumn
 ++++AXColumn
 ++++AXGroup
-++AXGrid
+++AXTable
 ++++AXRow
 ++++++AXCell AXTitle='Alphabet' AXSortDirection='AXUnknownSortDirection'
 ++++++++AXStaticText AXValue='Alphabet'
diff --git a/content/test/data/accessibility/aria/table-column-hidden-expected-mac.txt b/content/test/data/accessibility/aria/table-column-hidden-expected-mac.txt
index 073f663..a178596 100644
--- a/content/test/data/accessibility/aria/table-column-hidden-expected-mac.txt
+++ b/content/test/data/accessibility/aria/table-column-hidden-expected-mac.txt
@@ -1,5 +1,5 @@
 AXWebArea
-++AXGrid AXARIAColumnCount='4'
+++AXTable AXARIAColumnCount='4'
 ++++AXRow
 ++++++AXCell AXTitle='Month' AXARIAColumnIndex='1' AXARIARowIndex='1'
 ++++++++AXStaticText AXValue='Month'
diff --git a/content/test/data/gpu/pixel_webgl_preserved_after_tab_switch.html b/content/test/data/gpu/pixel_webgl_preserved_after_tab_switch.html
new file mode 100644
index 0000000..8263a49d
--- /dev/null
+++ b/content/test/data/gpu/pixel_webgl_preserved_after_tab_switch.html
@@ -0,0 +1,102 @@
+<!DOCTYPE HTML>
+<!-- READ BEFORE UPDATING:
+If this test is updated make sure to increment the "revision" value of the
+associated test in content/test/gpu/page_sets/pixel_tests.py. This will ensure
+that the baseline images are regenerated on the next run.
+-->
+<html>
+<head>
+<title>WebGL Test: WebGL Content Preserved after Tab Switched</title>
+<style type="text/css">
+    .nomargin {
+        margin: 0px auto;
+    }
+</style>
+<script src="pixel_webgl_util.js"></script>
+</head>
+<body onload="main()">
+<canvas id="source" width="100" height="100" class="nomargin"></canvas>
+<canvas id="destination" width="100" height="100" class="nomargin"></canvas>
+
+<script id="vertex" type="x-shader">
+attribute vec2 aVertexPosition;
+void main() {
+gl_Position = vec4(aVertexPosition, 0.0, 1.0);
+}
+</script>
+
+<script id="fragment" type="x-shader">
+precision mediump float;
+uniform vec4 uColor;
+void main() {
+gl_FragColor = uColor;
+}
+</script>
+
+<script>
+    window.canvasSource = document.getElementById("source");
+    var canvasDestination = document.getElementById("destination");
+    var canvasOptions = {
+        preserveDrawingBuffer: true
+    };
+    var destinationContext = canvasDestination.getContext("2d", canvasOptions);
+
+    window.canvasSource.addEventListener("webglcontextlost", function(event) {
+        console.log('context lost');
+        event.preventDefault();
+    }, false);
+
+    window.canvasSource.addEventListener("webglcontextrestored", init3d, false);
+
+    function copyImage() {
+        var error = window.gl.getError();
+        if (error) {
+            console.log('Gl Error: ' + error);
+        }
+        destinationContext.clearRect(0, 0, 100, 100);
+        destinationContext.drawImage(window.canvasSource, 0, 0);
+    }
+
+    function init3d() {
+        window.gl = window.canvasSource.getContext("webgl", canvasOptions);
+        var gl = window.gl;
+        if (gl == null)
+            console.log("couldn't get webgl context");
+        else
+            console.log(gl);
+
+        gl.viewport(0, 0, window.canvasSource.width, window.canvasSource.height);
+        gl.clearColor(0, 0.5, 0, 1);
+        gl.clear(gl.COLOR_BUFFER_BIT);
+
+        var v = document.getElementById("vertex").firstChild.nodeValue;
+        var f = document.getElementById("fragment").firstChild.nodeValue;
+
+        var vs = gl.createShader(gl.VERTEX_SHADER);
+        gl.shaderSource(vs, v);
+        gl.compileShader(vs);
+
+        var fs = gl.createShader(gl.FRAGMENT_SHADER);
+        gl.shaderSource(fs, f);
+        gl.compileShader(fs);
+
+        program = gl.createProgram();
+        gl.attachShader(program, vs);
+        gl.attachShader(program, fs);
+        gl.linkProgram(program);
+    }
+
+    function main() {
+        init3d();
+        if (gl && setup(gl)) {
+            copyImage();
+            domAutomationController.setAutomationId(1);
+            domAutomationController.send("SUCCESS");
+        } else {
+            domAutomationController.setAutomationId(1);
+            domAutomationController.send("FAILURE");
+        }
+    }
+</script>
+</body>
+</html>
diff --git a/content/test/gpu/generate_buildbot_json.py b/content/test/gpu/generate_buildbot_json.py
index 0019ccc5..b4702b5c 100755
--- a/content/test/gpu/generate_buildbot_json.py
+++ b/content/test/gpu/generate_buildbot_json.py
@@ -264,19 +264,6 @@
       'swarming': True,
       'os_type': 'win',
     },
-    'Win10 Release (Intel HD 530)': {
-      'swarming_dimensions': [
-        {
-          'gpu': '8086:1912',
-          'os': 'Windows-10',
-        },
-      ],
-      'build_config': 'Release',
-      # This bot is a one-off and doesn't have similar slaves in the
-      # swarming pool.
-      'swarming': False,
-      'os_type': 'win',
-    },
     'Win10 Release (Intel HD 630)': {
       'swarming_dimensions': [
         {
@@ -290,19 +277,6 @@
       'swarming': False,
       'os_type': 'win',
     },
-    'Win10 Debug (Intel HD 530)': {
-      'swarming_dimensions': [
-        {
-          'gpu': '8086:1912',
-          'os': 'Windows-10',
-        },
-      ],
-      'build_config': 'Debug',
-      # This bot is a one-off and doesn't have similar slaves in the
-      # swarming pool.
-      'swarming': False,
-      'os_type': 'win',
-    },
     'Win10 Release (NVIDIA Quadro P400)': {
       'swarming_dimensions': [
         {
@@ -538,19 +512,6 @@
       'swarming': True,
       'os_type': 'linux',
     },
-    'Linux Release (Intel HD 530)': {
-      'swarming_dimensions': [
-        {
-          'gpu': '8086:1912',
-          'os': 'Ubuntu'
-        },
-      ],
-      'build_config': 'Release',
-      # This bot is a one-off and doesn't have similar slaves in the
-      # swarming pool.
-      'swarming': False,
-      'os_type': 'linux',
-    },
     'Linux Release (Intel HD 630)': {
       'swarming_dimensions': [
         {
@@ -564,19 +525,6 @@
       'swarming': False,
       'os_type': 'linux',
     },
-    'Linux Debug (Intel HD 530)': {
-      'swarming_dimensions': [
-        {
-          'gpu': '8086:1912',
-          'os': 'Ubuntu'
-        },
-      ],
-      'build_config': 'Debug',
-      # This bot is a one-off and doesn't have similar slaves in the
-      # swarming pool.
-      'swarming': False,
-      'os_type': 'linux',
-    },
     'Linux Release (AMD R7 240)': {
       'swarming_dimensions': [
         {
@@ -1351,6 +1299,25 @@
     ],
     'desktop_args': ['--use-gpu-in-tests']
   },
+  'gl_tests_passthrough': {
+    'tester_configs': [
+      {
+        'os_types': ['win'],
+      }
+    ],
+    'disabled_tester_configs': [
+      {
+        'names': [
+          'Linux ChromiumOS Ozone (Intel)',
+        ],
+      },
+    ],
+    'test': 'gl_tests',
+    'desktop_args': [
+      '--use-gpu-in-tests',
+      '--use-passthrough-cmd-decoder',
+     ]
+  },
   'gl_unittests': {
     'disabled_tester_configs': [
       {
@@ -1543,8 +1510,6 @@
     'disabled_tester_configs': [
       {
         'names': [
-          'Win10 Debug (Intel HD 530)',
-          'Win10 Release (Intel HD 530)',
           'Win10 Release (Intel HD 630)',
         ],
       },
diff --git a/content/test/gpu/gpu_tests/pixel_expectations.py b/content/test/gpu/gpu_tests/pixel_expectations.py
index 274eb29..4f1df7a7 100644
--- a/content/test/gpu/gpu_tests/pixel_expectations.py
+++ b/content/test/gpu/gpu_tests/pixel_expectations.py
@@ -72,3 +72,6 @@
 
     self.Flaky('Pixel_OffscreenCanvasWebGLSoftwareCompositingWorker',
         ['mac', ('nvidia', 0xfe9), 'debug'], bug=751328)
+
+    # TODO(xing.xu): remove these after new reference images are generated.
+    self.Fail('Pixel_WebGLPreserved_After_Tab_Switch', bug=736969)
diff --git a/content/test/gpu/gpu_tests/pixel_integration_test.py b/content/test/gpu/gpu_tests/pixel_integration_test.py
index 65121cab..e5d8124 100644
--- a/content/test/gpu/gpu_tests/pixel_integration_test.py
+++ b/content/test/gpu/gpu_tests/pixel_integration_test.py
@@ -122,6 +122,18 @@
       self.fail('page indicated test failure')
     if not tab.screenshot_supported:
       self.fail('Browser does not support screenshot capture')
+
+    if page.create_and_close_new_tab == True:
+      # Load the tmp tab.
+      tmp_tab = tab.browser.tabs.New()
+      tmp_tab.Navigate('chrome://about')
+      tmp_tab.Close()
+      # Activate the original tab and wait for completion.
+      tab.Activate()
+      tab.action_runner.WaitForJavaScriptCondition(
+        'domAutomationController._finished', timeout=300)
+      tab.EvaluateJavaScript('copyImage()')
+
     screenshot = tab.Screenshot(5)
     if screenshot is None:
       self.fail('Could not capture screenshot')
diff --git a/content/test/gpu/gpu_tests/pixel_test_pages.py b/content/test/gpu/gpu_tests/pixel_test_pages.py
index 55da2c7..41268b92b 100644
--- a/content/test/gpu/gpu_tests/pixel_test_pages.py
+++ b/content/test/gpu/gpu_tests/pixel_test_pages.py
@@ -7,7 +7,8 @@
   from the old-style GPU tests.
   """
   def __init__(self, url, name, test_rect, revision,
-               tolerance=2, browser_args=None, expected_colors=None):
+               tolerance=2, browser_args=None, expected_colors=None,
+               create_and_close_new_tab=False):
     super(PixelTestPage, self).__init__()
     self.url = url
     self.name = name
@@ -22,6 +23,7 @@
     # by contract with _CompareScreenshotSamples in
     # cloud_storage_integration_test_base.py.
     self.expected_colors = expected_colors
+    self.create_and_close_new_tab = create_and_close_new_tab
 
   def CopyWithNewBrowserArgsAndSuffix(self, browser_args, suffix):
     return PixelTestPage(
@@ -97,6 +99,13 @@
       revision=1),
 
     PixelTestPage(
+      'pixel_webgl_preserved_after_tab_switch.html',
+      base_name + '_WebGLPreserved_After_Tab_Switch',
+      test_rect=[0, 0, 300, 300],
+      revision=1,
+      create_and_close_new_tab=True),
+
+    PixelTestPage(
       'pixel_scissor.html',
       base_name + '_ScissorTestWithPreserveDrawingBuffer',
       test_rect=[0, 0, 300, 300],
diff --git a/content/test/test_render_frame.cc b/content/test/test_render_frame.cc
index 09a4d4b..d6c1bb15 100644
--- a/content/test/test_render_frame.cc
+++ b/content/test/test_render_frame.cc
@@ -106,8 +106,8 @@
 void TestRenderFrame::SetCompositionFromExistingText(
     int start,
     int end,
-    const std::vector<blink::WebCompositionUnderline>& underlines) {
-  OnSetCompositionFromExistingText(start, end, underlines);
+    const std::vector<blink::WebImeTextSpan>& ime_text_spans) {
+  OnSetCompositionFromExistingText(start, end, ime_text_spans);
 }
 
 blink::WebNavigationPolicy TestRenderFrame::DecidePolicyForNavigation(
diff --git a/content/test/test_render_frame.h b/content/test/test_render_frame.h
index 567b3555a..cc888aa 100644
--- a/content/test/test_render_frame.h
+++ b/content/test/test_render_frame.h
@@ -49,7 +49,7 @@
   void SetCompositionFromExistingText(
       int start,
       int end,
-      const std::vector<blink::WebCompositionUnderline>& underlines);
+      const std::vector<blink::WebImeTextSpan>& ime_text_spans);
 
   blink::WebNavigationPolicy DecidePolicyForNavigation(
       const blink::WebFrameClient::NavigationPolicyInfo& info) override;
diff --git a/device/bluetooth/test/fake_central.cc b/device/bluetooth/test/fake_central.cc
index afe554ec6..9f0bc62 100644
--- a/device/bluetooth/test/fake_central.cc
+++ b/device/bluetooth/test/fake_central.cc
@@ -28,17 +28,14 @@
     const std::string& name,
     const std::vector<device::BluetoothUUID>& known_service_uuids,
     SimulatePreconnectedPeripheralCallback callback) {
-  auto device_iter = devices_.find(address);
-  if (device_iter == devices_.end()) {
-    auto fake_peripheral = base::MakeUnique<FakePeripheral>(this, address);
-
-    auto insert_iter = devices_.emplace(address, std::move(fake_peripheral));
-    DCHECK(insert_iter.second);
-    device_iter = insert_iter.first;
+  FakePeripheral* fake_peripheral = GetFakePeripheral(address);
+  if (fake_peripheral == nullptr) {
+    auto fake_peripheral_ptr = base::MakeUnique<FakePeripheral>(this, address);
+    fake_peripheral = fake_peripheral_ptr.get();
+    auto pair = devices_.emplace(address, std::move(fake_peripheral_ptr));
+    DCHECK(pair.second);
   }
 
-  FakePeripheral* fake_peripheral =
-      static_cast<FakePeripheral*>(device_iter->second.get());
   fake_peripheral->SetName(name);
   fake_peripheral->SetSystemConnected(true);
   fake_peripheral->SetServiceUUIDs(device::BluetoothDevice::UUIDSet(
@@ -51,14 +48,12 @@
     const std::string& address,
     uint16_t code,
     SetNextGATTConnectionResponseCallback callback) {
-  auto device_iter = devices_.find(address);
-  if (device_iter == devices_.end()) {
+  FakePeripheral* fake_peripheral = GetFakePeripheral(address);
+  if (fake_peripheral == nullptr) {
     std::move(callback).Run(false);
     return;
   }
 
-  FakePeripheral* fake_peripheral =
-      static_cast<FakePeripheral*>(device_iter->second.get());
   fake_peripheral->SetNextGATTConnectionResponse(code);
   std::move(callback).Run(true);
 }
@@ -67,13 +62,12 @@
     const std::string& address,
     uint16_t code,
     SetNextGATTDiscoveryResponseCallback callback) {
-  auto device_iter = devices_.find(address);
-  if (device_iter == devices_.end()) {
+  FakePeripheral* fake_peripheral = GetFakePeripheral(address);
+  if (fake_peripheral == nullptr) {
     std::move(callback).Run(false);
+    return;
   }
 
-  FakePeripheral* fake_peripheral =
-      static_cast<FakePeripheral*>(device_iter->second.get());
   fake_peripheral->SetNextGATTDiscoveryResponse(code);
   std::move(callback).Run(true);
 }
@@ -81,19 +75,24 @@
 void FakeCentral::SimulateGATTServicesChanged(
     const std::string& address,
     SimulateGATTServicesChangedCallback callback) {
+  FakePeripheral* fake_peripheral = GetFakePeripheral(address);
+  if (fake_peripheral == nullptr) {
+    std::move(callback).Run(false);
+    return;
+  }
+
   std::move(callback).Run(true);
 }
 
 void FakeCentral::AddFakeService(const std::string& peripheral_address,
                                  const device::BluetoothUUID& service_uuid,
                                  AddFakeServiceCallback callback) {
-  auto device_iter = devices_.find(peripheral_address);
-  if (device_iter == devices_.end()) {
+  FakePeripheral* fake_peripheral = GetFakePeripheral(peripheral_address);
+  if (fake_peripheral == nullptr) {
     std::move(callback).Run(base::nullopt);
+    return;
   }
 
-  FakePeripheral* fake_peripheral =
-      static_cast<FakePeripheral*>(device_iter->second.get());
   std::move(callback).Run(fake_peripheral->AddFakeService(service_uuid));
 }
 
@@ -103,16 +102,11 @@
     const std::string& service_id,
     const std::string& peripheral_address,
     AddFakeCharacteristicCallback callback) {
-  auto device_iter = devices_.find(peripheral_address);
-  if (device_iter == devices_.end()) {
-    std::move(callback).Run(base::nullopt);
-  }
-
   FakeRemoteGattService* fake_remote_gatt_service =
-      static_cast<FakeRemoteGattService*>(
-          device_iter->second.get()->GetGattService(service_id));
+      GetFakeRemoteGattService(peripheral_address, service_id);
   if (fake_remote_gatt_service == nullptr) {
     std::move(callback).Run(base::nullopt);
+    return;
   }
 
   std::move(callback).Run(fake_remote_gatt_service->AddFakeCharacteristic(
@@ -124,15 +118,8 @@
     const std::string& service_id,
     const std::string& peripheral_address,
     RemoveFakeCharacteristicCallback callback) {
-  auto device_iter = devices_.find(peripheral_address);
-  if (device_iter == devices_.end()) {
-    std::move(callback).Run(false);
-    return;
-  }
-
   FakeRemoteGattService* fake_remote_gatt_service =
-      static_cast<FakeRemoteGattService*>(
-          device_iter->second.get()->GetGattService(service_id));
+      GetFakeRemoteGattService(peripheral_address, service_id);
   if (fake_remote_gatt_service == nullptr) {
     std::move(callback).Run(false);
     return;
@@ -374,18 +361,34 @@
 
 FakeCentral::~FakeCentral() {}
 
-FakeRemoteGattCharacteristic* FakeCentral::GetFakeRemoteGattCharacteristic(
-    const std::string& peripheral_address,
-    const std::string& service_id,
-    const std::string& characteristic_id) const {
+FakePeripheral* FakeCentral::GetFakePeripheral(
+    const std::string& peripheral_address) const {
   auto device_iter = devices_.find(peripheral_address);
   if (device_iter == devices_.end()) {
     return nullptr;
   }
 
+  return static_cast<FakePeripheral*>(device_iter->second.get());
+}
+
+FakeRemoteGattService* FakeCentral::GetFakeRemoteGattService(
+    const std::string& peripheral_address,
+    const std::string& service_id) const {
+  FakePeripheral* fake_peripheral = GetFakePeripheral(peripheral_address);
+  if (fake_peripheral == nullptr) {
+    return nullptr;
+  }
+
+  return static_cast<FakeRemoteGattService*>(
+      fake_peripheral->GetGattService(service_id));
+}
+
+FakeRemoteGattCharacteristic* FakeCentral::GetFakeRemoteGattCharacteristic(
+    const std::string& peripheral_address,
+    const std::string& service_id,
+    const std::string& characteristic_id) const {
   FakeRemoteGattService* fake_remote_gatt_service =
-      static_cast<FakeRemoteGattService*>(
-          device_iter->second.get()->GetGattService(service_id));
+      GetFakeRemoteGattService(peripheral_address, service_id);
   if (fake_remote_gatt_service == nullptr) {
     return nullptr;
   }
diff --git a/device/bluetooth/test/fake_central.h b/device/bluetooth/test/fake_central.h
index 775e114..5aa27f22 100644
--- a/device/bluetooth/test/fake_central.h
+++ b/device/bluetooth/test/fake_central.h
@@ -15,8 +15,10 @@
 
 namespace bluetooth {
 
+class FakePeripheral;
 class FakeRemoteGattCharacteristic;
 class FakeRemoteGattDescriptor;
+class FakeRemoteGattService;
 
 // Implementation of FakeCentral in
 // src/device/bluetooth/public/interfaces/test/fake_bluetooth.mojom.
@@ -150,6 +152,11 @@
  private:
   ~FakeCentral() override;
 
+  FakePeripheral* GetFakePeripheral(
+      const std::string& peripheral_address) const;
+  FakeRemoteGattService* GetFakeRemoteGattService(
+      const std::string& peripheral_address,
+      const std::string& service_id) const;
   FakeRemoteGattCharacteristic* GetFakeRemoteGattCharacteristic(
       const std::string& peripheral_address,
       const std::string& service_id,
diff --git a/docs/updating_clang.md b/docs/updating_clang.md
index 28b1ac13..5ef098d 100644
--- a/docs/updating_clang.md
+++ b/docs/updating_clang.md
@@ -27,7 +27,8 @@
 1.  Run an exhaustive set of try jobs to test the new compiler:
 ```
     git cl try &&
-    git cl try -m tryserver.chromium.mac -b mac_chromium_asan_rel_ng &&
+    git cl try -m tryserver.chromium.mac -b mac_chromium_asan_rel_ng \
+      -b ios-device && \
     git cl try -m tryserver.chromium.linux -b linux_chromium_chromeos_dbg_ng \
       -b linux_chromium_chromeos_asan_rel_ng -b linux_chromium_msan_rel_ng \
       -b fuchsia -b linux_chromium_cfi_rel_ng &&
diff --git a/extensions/browser/api/app_current_window_internal/app_current_window_internal_api.cc b/extensions/browser/api/app_current_window_internal/app_current_window_internal_api.cc
index 779e9a2c..6130865 100644
--- a/extensions/browser/api/app_current_window_internal/app_current_window_internal_api.cc
+++ b/extensions/browser/api/app_current_window_internal/app_current_window_internal_api.cc
@@ -330,27 +330,21 @@
   std::unique_ptr<SetShape::Params> params(SetShape::Params::Create(*args_));
   const Region& shape = params->region;
 
-  // Build a region from the supplied list of rects.
+  // Build the list of hit-test rects from the supplied list of rects.
   // If |rects| is missing, then the input region is removed. This clears the
   // input region so that the entire window accepts input events.
   // To specify an empty input region (so the window ignores all input),
   // |rects| should be an empty list.
-  std::unique_ptr<SkRegion> region(new SkRegion);
+  std::unique_ptr<AppWindow::ShapeRects> shape_rects;
   if (shape.rects) {
+    shape_rects = base::MakeUnique<AppWindow::ShapeRects>();
+    shape_rects->reserve(shape.rects->size());
     for (const RegionRect& input_rect : *shape.rects) {
-      int32_t x = input_rect.left;
-      int32_t y = input_rect.top;
-      int32_t width = input_rect.width;
-      int32_t height = input_rect.height;
-
-      SkIRect rect = SkIRect::MakeXYWH(x, y, width, height);
-      region->op(rect, SkRegion::kUnion_Op);
+      shape_rects->emplace_back(input_rect.left, input_rect.top,
+                                input_rect.width, input_rect.height);
     }
-  } else {
-    region.reset(NULL);
   }
-
-  window()->UpdateShape(std::move(region));
+  window()->UpdateShape(std::move(shape_rects));
 
   return RespondNow(NoArguments());
 }
diff --git a/extensions/browser/api/feedback_private/feedback_private_delegate.h b/extensions/browser/api/feedback_private/feedback_private_delegate.h
index feb1f066..ab9e048 100644
--- a/extensions/browser/api/feedback_private/feedback_private_delegate.h
+++ b/extensions/browser/api/feedback_private/feedback_private_delegate.h
@@ -15,6 +15,10 @@
 class BrowserContext;
 }  // namespace content
 
+namespace system_logs {
+class SystemLogsFetcher;
+}  // namespace system_logs
+
 namespace extensions {
 
 // Delegate class for embedder-specific chrome.feedbackPrivate behavior.
@@ -29,6 +33,10 @@
   virtual std::unique_ptr<base::DictionaryValue> GetStrings(
       content::BrowserContext* browser_context,
       bool from_crash) const = 0;
+
+  // Returns a SystemLogsFetcher for responding to a request for system logs.
+  virtual system_logs::SystemLogsFetcher* CreateSystemLogsFetcher(
+      content::BrowserContext* context) const = 0;
 };
 
 }  // namespace extensions
diff --git a/extensions/browser/api/storage/backend_task_runner.cc b/extensions/browser/api/storage/backend_task_runner.cc
index 0d5e614..50794e1 100644
--- a/extensions/browser/api/storage/backend_task_runner.cc
+++ b/extensions/browser/api/storage/backend_task_runner.cc
@@ -4,15 +4,14 @@
 
 #include "extensions/browser/api/storage/backend_task_runner.h"
 
-#include "base/task_scheduler/lazy_task_runner.h"
+#include "extensions/browser/extension_file_task_runner.h"
 
 namespace extensions {
 
-base::LazySequencedTaskRunner g_sequenced_task_task_runner =
-    LAZY_SEQUENCED_TASK_RUNNER_INITIALIZER({base::MayBlock()});
-
+// TODO(stanisc): consider switching all calls of GetBackendTaskRunner() to
+// GetExtensionFileTaskRunner().
 scoped_refptr<base::SequencedTaskRunner> GetBackendTaskRunner() {
-  return g_sequenced_task_task_runner.Get();
+  return GetExtensionFileTaskRunner();
 }
 
 bool IsOnBackendSequence() {
diff --git a/extensions/browser/app_window/app_window.cc b/extensions/browser/app_window/app_window.cc
index ed4ba26..ca452e18 100644
--- a/extensions/browser/app_window/app_window.cc
+++ b/extensions/browser/app_window/app_window.cc
@@ -578,8 +578,8 @@
                  image_loader_ptr_factory_.GetWeakPtr()));
 }
 
-void AppWindow::UpdateShape(std::unique_ptr<SkRegion> region) {
-  native_app_window_->UpdateShape(std::move(region));
+void AppWindow::UpdateShape(std::unique_ptr<ShapeRects> rects) {
+  native_app_window_->UpdateShape(std::move(rects));
 }
 
 void AppWindow::UpdateDraggableRegions(
diff --git a/extensions/browser/app_window/app_window.h b/extensions/browser/app_window/app_window.h
index 7d07ae89..09536a8 100644
--- a/extensions/browser/app_window/app_window.h
+++ b/extensions/browser/app_window/app_window.h
@@ -118,6 +118,8 @@
     FULLSCREEN_TYPE_FORCED = 1 << 3,
   };
 
+  using ShapeRects = std::vector<gfx::Rect>;
+
   struct BoundsSpecification {
     // INT_MIN represents an unspecified position component.
     static const int kUnspecifiedPosition;
@@ -275,8 +277,8 @@
   // Specifies a url for the launcher icon.
   void SetAppIconUrl(const GURL& icon_url);
 
-  // Set the window shape. Passing a NULL |region| sets the default shape.
-  void UpdateShape(std::unique_ptr<SkRegion> region);
+  // Sets the window shape. Passing a nullptr |rects| sets the default shape.
+  void UpdateShape(std::unique_ptr<ShapeRects> rects);
 
   // Called from the render interface to modify the draggable regions.
   void UpdateDraggableRegions(const std::vector<DraggableRegion>& regions);
diff --git a/extensions/browser/app_window/native_app_window.h b/extensions/browser/app_window/native_app_window.h
index 719180bb..0ae528f 100644
--- a/extensions/browser/app_window/native_app_window.h
+++ b/extensions/browser/app_window/native_app_window.h
@@ -29,6 +29,8 @@
 class NativeAppWindow : public ui::BaseWindow,
                         public web_modal::WebContentsModalDialogHost {
  public:
+  using ShapeRects = std::vector<gfx::Rect>;
+
   // Sets whether the window is fullscreen and the type of fullscreen.
   // |fullscreen_types| is a bit field of AppWindow::FullscreenType.
   virtual void SetFullscreen(int fullscreen_types) = 0;
@@ -46,12 +48,13 @@
   virtual void UpdateDraggableRegions(
       const std::vector<DraggableRegion>& regions) = 0;
 
-  // Returns the region used by frameless windows for dragging. May return NULL.
+  // Returns the region used by frameless windows for dragging. May return
+  // nullptr.
   virtual SkRegion* GetDraggableRegion() = 0;
 
-  // Called when the window shape is changed. If |region| is NULL then the
+  // Called when the window shape is changed. If |region| is nullptr then the
   // window is restored to the default shape.
-  virtual void UpdateShape(std::unique_ptr<SkRegion> region) = 0;
+  virtual void UpdateShape(std::unique_ptr<ShapeRects> rects) = 0;
 
   // Allows the window to handle unhandled keyboard messages coming back from
   // the renderer.
diff --git a/extensions/common/extension_api.cc b/extensions/common/extension_api.cc
index a60af27..8dbf447 100644
--- a/extensions/common/extension_api.cc
+++ b/extensions/common/extension_api.cc
@@ -183,11 +183,10 @@
 
   // Check to see if there are any parts of this API that are allowed in this
   // context.
-  const std::vector<Feature*> features = provider->second->GetChildren(api);
-  for (std::vector<Feature*>::const_iterator it = features.begin();
-       it != features.end();
-       ++it) {
-    if ((*it)->IsAvailableToContext(extension, context, url).is_available())
+  const std::vector<const Feature*> features =
+      provider->second->GetChildren(api);
+  for (const Feature* feature : features) {
+    if (feature->IsAvailableToContext(extension, context, url).is_available())
       return true;
   }
 
@@ -210,7 +209,7 @@
                                                 Feature::Context context,
                                                 const GURL& url,
                                                 CheckAliasStatus check_alias) {
-  Feature* feature = GetFeatureDependency(full_name);
+  const Feature* feature = GetFeatureDependency(full_name);
   if (!feature) {
     return Feature::Availability(Feature::NOT_PRESENT,
                                  std::string("Unknown feature: ") + full_name);
@@ -222,7 +221,7 @@
     return availability;
 
   Feature::Availability alias_availability =
-      IsAliasAvailable(full_name, feature, extension, context, url);
+      IsAliasAvailable(full_name, *feature, extension, context, url);
   return alias_availability.is_available() ? alias_availability : availability;
 }
 
@@ -272,7 +271,8 @@
   return result;
 }
 
-Feature* ExtensionAPI::GetFeatureDependency(const std::string& full_name) {
+const Feature* ExtensionAPI::GetFeatureDependency(
+    const std::string& full_name) {
   std::string feature_type;
   std::string feature_name;
   SplitDependencyName(full_name, &feature_type, &feature_name);
@@ -282,7 +282,7 @@
   if (provider == dependency_providers_.end())
     return NULL;
 
-  Feature* feature = provider->second->GetFeature(feature_name);
+  const Feature* feature = provider->second->GetFeature(feature_name);
   // Try getting the feature for the parent API, if this was a child.
   if (!feature) {
     std::string child_name;
@@ -328,11 +328,11 @@
 
 Feature::Availability ExtensionAPI::IsAliasAvailable(
     const std::string& full_name,
-    Feature* feature,
+    const Feature& feature,
     const Extension* extension,
     Feature::Context context,
     const GURL& url) {
-  const std::string& alias = feature->alias();
+  const std::string& alias = feature.alias();
   if (alias.empty())
     return Feature::Availability(Feature::NOT_PRESENT, "Alias not defined");
 
@@ -348,7 +348,7 @@
   std::string child_name;
   GetAPINameFromFullName(full_name, &child_name);
   std::string full_alias_name = alias + "." + child_name;
-  Feature* alias_feature = provider->second->GetFeature(full_alias_name);
+  const Feature* alias_feature = provider->second->GetFeature(full_alias_name);
 
   // If there is no child feature, use the alias API feature to check
   // availability.
@@ -356,7 +356,7 @@
     alias_feature = provider->second->GetFeature(alias);
 
   CHECK(alias_feature) << "Cannot find alias feature " << alias
-                       << " for API feature " << feature->name();
+                       << " for API feature " << feature.name();
 
   return alias_feature->IsAvailableToContext(extension, context, url);
 }
diff --git a/extensions/common/extension_api.h b/extensions/common/extension_api.h
index 493674aecc4..01761a6 100644
--- a/extensions/common/extension_api.h
+++ b/extensions/common/extension_api.h
@@ -142,7 +142,7 @@
 
   // Gets a feature from any dependency provider registered with ExtensionAPI.
   // Returns NULL if the feature could not be found.
-  Feature* GetFeatureDependency(const std::string& dependency_name);
+  const Feature* GetFeatureDependency(const std::string& dependency_name);
 
  private:
   FRIEND_TEST_ALL_PREFIXES(ExtensionAPITest, DefaultConfigurationFeatures);
@@ -157,7 +157,7 @@
   // Checks if |full_name| is available to provided context and extension under
   // associated API's alias name.
   Feature::Availability IsAliasAvailable(const std::string& full_name,
-                                         Feature* feature,
+                                         const Feature& feature,
                                          const Extension* extension,
                                          Feature::Context context,
                                          const GURL& url);
diff --git a/extensions/common/features/feature_provider.cc b/extensions/common/features/feature_provider.cc
index 2d75f82..51a697cd 100644
--- a/extensions/common/features/feature_provider.cc
+++ b/extensions/common/features/feature_provider.cc
@@ -127,7 +127,7 @@
   return GetFeatureFromProviderByName("behavior", name);
 }
 
-Feature* FeatureProvider::GetFeature(const std::string& name) const {
+const Feature* FeatureProvider::GetFeature(const std::string& name) const {
   FeatureMap::const_iterator iter = features_.find(name);
   if (iter != features_.end())
     return iter->second.get();
@@ -149,7 +149,7 @@
 
 // Children of a given API are named starting with parent.name()+".", which
 // means they'll be contiguous in the features_ std::map.
-std::vector<Feature*> FeatureProvider::GetChildren(
+std::vector<const Feature*> FeatureProvider::GetChildren(
     const Feature& parent) const {
   std::string prefix = parent.name() + ".";
   const FeatureMap::const_iterator first_child = features_.lower_bound(prefix);
@@ -159,7 +159,7 @@
   const FeatureMap::const_iterator after_children =
       features_.lower_bound(prefix);
 
-  std::vector<Feature*> result;
+  std::vector<const Feature*> result;
   result.reserve(std::distance(first_child, after_children));
   for (FeatureMap::const_iterator it = first_child; it != after_children;
        ++it) {
diff --git a/extensions/common/features/feature_provider.h b/extensions/common/features/feature_provider.h
index c5cde10..0576dc7c 100644
--- a/extensions/common/features/feature_provider.h
+++ b/extensions/common/features/feature_provider.h
@@ -18,7 +18,7 @@
 
 // Note: Binding code (specifically native_extension_bindings_system.cc) relies
 // on this being a sorted map.
-using FeatureMap = std::map<std::string, std::unique_ptr<Feature>>;
+using FeatureMap = std::map<std::string, std::unique_ptr<const Feature>>;
 
 // Implemented by classes that can vend features.
 class FeatureProvider {
@@ -46,13 +46,13 @@
   static const Feature* GetBehaviorFeature(const std::string& name);
 
   // Returns the feature with the specified name.
-  Feature* GetFeature(const std::string& name) const;
+  const Feature* GetFeature(const std::string& name) const;
 
   // Returns the parent feature of |feature|, or null if there isn't one.
   const Feature* GetParent(const Feature& feature) const;
 
   // Returns the features inside the |parent| namespace, recursively.
-  std::vector<Feature*> GetChildren(const Feature& parent) const;
+  std::vector<const Feature*> GetChildren(const Feature& parent) const;
 
   // Returns a map containing all features described by this instance.
   // TODO(devlin): Rename this to be features().
diff --git a/extensions/common/features/feature_provider_unittest.cc b/extensions/common/features/feature_provider_unittest.cc
index 2bf161f..1af86f9 100644
--- a/extensions/common/features/feature_provider_unittest.cc
+++ b/extensions/common/features/feature_provider_unittest.cc
@@ -56,7 +56,7 @@
           .Build();
   ASSERT_TRUE(extension.get());
 
-  Feature* feature = provider->GetFeature("description");
+  const Feature* feature = provider->GetFeature("description");
   EXPECT_EQ(Feature::IS_AVAILABLE,
             feature
                 ->IsAvailableToContext(extension.get(),
@@ -125,7 +125,7 @@
   ASSERT_TRUE(app->is_platform_app());
 
   // A permission requested in the manifest is available.
-  Feature* feature = provider->GetFeature("power");
+  const Feature* feature = provider->GetFeature("power");
   EXPECT_EQ(Feature::IS_AVAILABLE,
             feature
                 ->IsAvailableToContext(app.get(), Feature::UNSPECIFIED_CONTEXT,
@@ -169,9 +169,9 @@
   add_feature("parent.other_child.other_grandchild");
   add_feature("parent.unparented_child", true);
 
-  Feature* parent = provider.GetFeature("parent");
+  const Feature* parent = provider.GetFeature("parent");
   ASSERT_TRUE(parent);
-  std::vector<Feature*> children = provider.GetChildren(*parent);
+  std::vector<const Feature*> children = provider.GetChildren(*parent);
   std::set<std::string> children_names;
   for (const Feature* child : children)
     children_names.insert(child->name());
diff --git a/extensions/common/features/simple_feature.cc b/extensions/common/features/simple_feature.cc
index 4e68be6..55b5da0 100644
--- a/extensions/common/features/simple_feature.cc
+++ b/extensions/common/features/simple_feature.cc
@@ -469,7 +469,7 @@
 Feature::Availability SimpleFeature::CheckDependencies(
     const base::Callback<Availability(const Feature*)>& checker) const {
   for (const auto& dep_name : dependencies_) {
-    Feature* dependency =
+    const Feature* dependency =
         ExtensionAPI::GetSharedInstance()->GetFeatureDependency(dep_name);
     if (!dependency)
       return CreateAvailability(NOT_PRESENT);
diff --git a/extensions/common/manifest.cc b/extensions/common/manifest.cc
index c2e608f..0aef218 100644
--- a/extensions/common/manifest.cc
+++ b/extensions/common/manifest.cc
@@ -247,7 +247,8 @@
 }
 
 bool Manifest::CanAccessKey(const std::string& key) const {
-  Feature* feature = FeatureProvider::GetManifestFeatures()->GetFeature(key);
+  const Feature* feature =
+      FeatureProvider::GetManifestFeatures()->GetFeature(key);
   if (!feature)
     return true;
 
diff --git a/extensions/common/manifest_handlers/permissions_parser.cc b/extensions/common/manifest_handlers/permissions_parser.cc
index af8ba0c..5cbe8bc 100644
--- a/extensions/common/manifest_handlers/permissions_parser.cc
+++ b/extensions/common/manifest_handlers/permissions_parser.cc
@@ -117,7 +117,7 @@
   for (APIPermissionSet::const_iterator iter = api_permissions->begin();
        iter != api_permissions->end();
        ++iter) {
-    Feature* feature = permission_features->GetFeature(iter->name());
+    const Feature* feature = permission_features->GetFeature(iter->name());
 
     // The feature should exist since we just got an APIPermission for it. The
     // two systems should be updated together whenever a permission is added.
diff --git a/extensions/components/native_app_window/native_app_window_views.cc b/extensions/components/native_app_window/native_app_window_views.cc
index 4081af9..0104b55 100644
--- a/extensions/components/native_app_window/native_app_window_views.cc
+++ b/extensions/components/native_app_window/native_app_window_views.cc
@@ -372,7 +372,7 @@
   return draggable_region_.get();
 }
 
-void NativeAppWindowViews::UpdateShape(std::unique_ptr<SkRegion> region) {
+void NativeAppWindowViews::UpdateShape(std::unique_ptr<ShapeRects> rects) {
   // Stub implementation. See also ChromeNativeAppWindowViews.
 }
 
diff --git a/extensions/components/native_app_window/native_app_window_views.h b/extensions/components/native_app_window/native_app_window_views.h
index f89c263..a782d40 100644
--- a/extensions/components/native_app_window/native_app_window_views.h
+++ b/extensions/components/native_app_window/native_app_window_views.h
@@ -130,7 +130,7 @@
   void UpdateDraggableRegions(
       const std::vector<extensions::DraggableRegion>& regions) override;
   SkRegion* GetDraggableRegion() override;
-  void UpdateShape(std::unique_ptr<SkRegion> region) override;
+  void UpdateShape(std::unique_ptr<ShapeRects> rects) override;
   void HandleKeyboardEvent(
       const content::NativeWebKeyboardEvent& event) override;
   bool IsFrameless() const override;
diff --git a/extensions/renderer/bindings/argument_spec.cc b/extensions/renderer/bindings/argument_spec.cc
index d97263da..b7929cf0 100644
--- a/extensions/renderer/bindings/argument_spec.cc
+++ b/extensions/renderer/bindings/argument_spec.cc
@@ -214,7 +214,10 @@
 
   switch (type_) {
     case ArgumentType::INTEGER:
-      is_valid_type = value->IsInt32();
+      // -0 is treated internally as a double, but we classify it as an integer.
+      is_valid_type =
+          value->IsInt32() ||
+          (value->IsNumber() && value.As<v8::Number>()->Value() == 0.0);
       break;
     case ArgumentType::DOUBLE:
       is_valid_type = value->IsNumber();
@@ -383,8 +386,15 @@
     std::string* error) const {
   switch (type_) {
     case ArgumentType::INTEGER: {
-      DCHECK(value->IsInt32());
-      int int_val = value.As<v8::Int32>()->Value();
+      DCHECK(value->IsNumber());
+      int int_val = 0;
+      if (value->IsInt32()) {
+        int_val = value.As<v8::Int32>()->Value();
+      } else {
+        // See comment in IsCorrectType().
+        DCHECK_EQ(0.0, value.As<v8::Number>()->Value());
+        int_val = 0;
+      }
       if (!CheckFundamentalBounds(int_val, minimum_, maximum_, error))
         return false;
       if (out_value)
diff --git a/extensions/renderer/bindings/argument_spec_unittest.cc b/extensions/renderer/bindings/argument_spec_unittest.cc
index a12b487..1ebabea 100644
--- a/extensions/renderer/bindings/argument_spec_unittest.cc
+++ b/extensions/renderer/bindings/argument_spec_unittest.cc
@@ -154,6 +154,10 @@
     ExpectSuccess(spec, "-1", "-1");
     ExpectSuccess(spec, "0", "0");
     ExpectSuccess(spec, "0.0", "0");
+    ExpectSuccess(spec, "-0.0", "0");
+    ExpectSuccess(spec, "-0.", "0");
+    ExpectSuccess(spec, "-.0", "0");
+    ExpectSuccess(spec, "-0", "0");
     ExpectFailure(spec, "undefined", InvalidType(kTypeInteger, kTypeUndefined));
     ExpectFailure(spec, "null", InvalidType(kTypeInteger, kTypeNull));
     ExpectFailure(spec, "1.1", InvalidType(kTypeInteger, kTypeDouble));
diff --git a/extensions/renderer/feature_cache.cc b/extensions/renderer/feature_cache.cc
index df10bd2..11e28d7 100644
--- a/extensions/renderer/feature_cache.cc
+++ b/extensions/renderer/feature_cache.cc
@@ -61,7 +61,7 @@
   GURL empty_url;
   const Extension* extension = context->extension();
   for (const auto& map_entry : api_feature_provider->GetAllFeatures()) {
-    Feature* feature = map_entry.second.get();
+    const Feature* feature = map_entry.second.get();
     // Exclude internal APIs.
     if (feature->IsInternal())
       continue;
diff --git a/extensions/shell/BUILD.gn b/extensions/shell/BUILD.gn
index 495aa1c..d821baf 100644
--- a/extensions/shell/BUILD.gn
+++ b/extensions/shell/BUILD.gn
@@ -174,6 +174,8 @@
 
   if (use_aura) {
     sources += [
+      "browser/root_window_controller.cc",
+      "browser/root_window_controller.h",
       "browser/shell_app_window_client_aura.cc",
       "browser/shell_desktop_controller_aura.cc",
       "browser/shell_desktop_controller_aura.h",
@@ -309,6 +311,7 @@
 
   if (use_aura) {
     sources += [
+      "browser/root_window_controller_unittest.cc",
       "browser/shell_desktop_controller_aura_unittest.cc",
       "browser/shell_native_app_window_aura_unittest.cc",
       "browser/shell_screen_unittest.cc",
diff --git a/extensions/shell/browser/default_shell_browser_main_delegate.cc b/extensions/shell/browser/default_shell_browser_main_delegate.cc
index 1275f32..c81eb702 100644
--- a/extensions/shell/browser/default_shell_browser_main_delegate.cc
+++ b/extensions/shell/browser/default_shell_browser_main_delegate.cc
@@ -101,9 +101,10 @@
 void DefaultShellBrowserMainDelegate::Shutdown() {
 }
 
-DesktopController* DefaultShellBrowserMainDelegate::CreateDesktopController() {
+DesktopController* DefaultShellBrowserMainDelegate::CreateDesktopController(
+    content::BrowserContext* context) {
 #if defined(USE_AURA)
-  return new ShellDesktopControllerAura();
+  return new ShellDesktopControllerAura(context);
 #elif defined(OS_MACOSX)
   return new ShellDesktopControllerMac();
 #else
diff --git a/extensions/shell/browser/default_shell_browser_main_delegate.h b/extensions/shell/browser/default_shell_browser_main_delegate.h
index 05ce558f..64a132ca 100644
--- a/extensions/shell/browser/default_shell_browser_main_delegate.h
+++ b/extensions/shell/browser/default_shell_browser_main_delegate.h
@@ -21,7 +21,8 @@
   // ShellBrowserMainDelegate:
   void Start(content::BrowserContext* context) override;
   void Shutdown() override;
-  DesktopController* CreateDesktopController() override;
+  DesktopController* CreateDesktopController(
+      content::BrowserContext* context) override;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(DefaultShellBrowserMainDelegate);
diff --git a/extensions/shell/browser/root_window_controller.cc b/extensions/shell/browser/root_window_controller.cc
new file mode 100644
index 0000000..4988082
--- /dev/null
+++ b/extensions/shell/browser/root_window_controller.cc
@@ -0,0 +1,169 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "extensions/shell/browser/root_window_controller.h"
+
+#include "extensions/browser/app_window/app_window.h"
+#include "extensions/browser/app_window/native_app_window.h"
+#include "extensions/shell/browser/shell_app_delegate.h"
+#include "extensions/shell/browser/shell_screen.h"
+#include "ui/aura/layout_manager.h"
+#include "ui/aura/window.h"
+#include "ui/aura/window_tracker.h"
+#include "ui/aura/window_tree_host.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/geometry/size.h"
+
+namespace extensions {
+
+namespace {
+
+// A simple layout manager that makes each new window fill its parent.
+class FillLayout : public aura::LayoutManager {
+ public:
+  FillLayout(aura::Window* owner) : owner_(owner) { DCHECK(owner_); }
+  ~FillLayout() override = default;
+
+ private:
+  // aura::LayoutManager:
+  void OnWindowResized() override {
+    // Size the owner's immediate child windows.
+    aura::WindowTracker children_tracker(owner_->children());
+    while (!children_tracker.windows().empty()) {
+      aura::Window* child = children_tracker.Pop();
+      child->SetBounds(gfx::Rect(owner_->bounds().size()));
+    }
+  }
+
+  void OnWindowAddedToLayout(aura::Window* child) override {
+    DCHECK_EQ(owner_, child->parent());
+
+    // Create a rect at 0,0 with the size of the parent.
+    gfx::Size parent_size = child->parent()->bounds().size();
+    child->SetBounds(gfx::Rect(parent_size));
+  }
+
+  void OnWillRemoveWindowFromLayout(aura::Window* child) override {}
+
+  void OnWindowRemovedFromLayout(aura::Window* child) override {}
+
+  void OnChildWindowVisibilityChanged(aura::Window* child,
+                                      bool visible) override {}
+
+  void SetChildBounds(aura::Window* child,
+                      const gfx::Rect& requested_bounds) override {
+    SetChildBoundsDirect(child, requested_bounds);
+  }
+
+  aura::Window* owner_;  // Not owned.
+
+  DISALLOW_COPY_AND_ASSIGN(FillLayout);
+};
+
+}  // namespace
+
+RootWindowController::RootWindowController(
+    DesktopDelegate* desktop_delegate,
+    ShellScreen* screen,
+    const gfx::Rect& bounds,
+    content::BrowserContext* browser_context)
+    : desktop_delegate_(desktop_delegate),
+      screen_(screen),
+      browser_context_(browser_context) {
+  DCHECK(desktop_delegate_);
+  DCHECK(screen_);
+  DCHECK(browser_context_);
+  host_.reset(aura::WindowTreeHost::Create(
+      gfx::Rect(screen_->GetPrimaryDisplay().GetSizeInPixel())));
+
+  // The ShellScreen will resize the primary display when the WindowTreeHost is
+  // resized, so the display is always the size of the WindowTreeHost.
+  host_->AddObserver(screen_);
+
+  host_->InitHost();
+  host_->window()->Show();
+
+  aura::client::SetWindowParentingClient(host_->window(), this);
+
+  // Ensure the window fills the display.
+  host_->window()->SetLayoutManager(new FillLayout(host_->window()));
+
+  host_->AddObserver(this);
+  host_->Show();
+}
+
+RootWindowController::~RootWindowController() {
+  CloseAppWindows();
+  DestroyWindowTreeHost();
+}
+
+AppWindow* RootWindowController::CreateAppWindow(
+    content::BrowserContext* browser_context,
+    const Extension* extension) {
+  // Only one BrowserContext should ever be used with this class.
+  DCHECK_EQ(browser_context_, browser_context);
+
+  if (app_windows_.empty()) {
+    // Start observing for OnAppWindowRemoved.
+    AppWindowRegistry* registry = AppWindowRegistry::Get(browser_context_);
+    registry->AddObserver(this);
+  }
+
+  app_windows_.push_back(
+      new AppWindow(browser_context, new ShellAppDelegate, extension));
+  return app_windows_.back();
+}
+
+void RootWindowController::AddAppWindow(gfx::NativeWindow window) {
+  aura::Window* root_window = host_->window();
+  root_window->AddChild(window);
+}
+
+void RootWindowController::CloseAppWindows() {
+  if (app_windows_.empty())
+    return;
+
+  // Remove the observer before closing windows to avoid triggering
+  // OnAppWindowRemoved, which would mutate |app_windows_|.
+  AppWindowRegistry::Get(browser_context_)->RemoveObserver(this);
+  for (AppWindow* app_window : app_windows_)
+    app_window->GetBaseWindow()->Close();  // Close() deletes |app_window|.
+  app_windows_.clear();
+}
+
+void RootWindowController::UpdateSize(const gfx::Size& size) {
+  host_->UpdateRootWindowSizeInPixels(size);
+}
+
+aura::Window* RootWindowController::GetDefaultParent(aura::Window* window,
+                                                     const gfx::Rect& bounds) {
+  return host_->window();
+}
+
+void RootWindowController::OnHostCloseRequested(aura::WindowTreeHost* host) {
+  DCHECK_EQ(host_.get(), host);
+  CloseAppWindows();
+
+  // The ShellDesktopControllerAura will delete us.
+  desktop_delegate_->CloseRootWindowController(this);
+}
+
+void RootWindowController::OnAppWindowRemoved(AppWindow* window) {
+  if (app_windows_.empty())
+    return;
+
+  // If we created this AppWindow, remove it from our list so we don't try to
+  // close it again later.
+  app_windows_.remove(window);
+  if (app_windows_.empty())
+    AppWindowRegistry::Get(browser_context_)->RemoveObserver(this);
+}
+
+void RootWindowController::DestroyWindowTreeHost() {
+  host_->RemoveObserver(screen_);
+  host_->RemoveObserver(this);
+  host_.reset();
+}
+
+}  // namespace extensions
diff --git a/extensions/shell/browser/root_window_controller.h b/extensions/shell/browser/root_window_controller.h
new file mode 100644
index 0000000..92bf969
--- /dev/null
+++ b/extensions/shell/browser/root_window_controller.h
@@ -0,0 +1,109 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef EXTENSIONS_SHELL_BROWSER_ROOT_WINDOW_CONTROLLER_H_
+#define EXTENSIONS_SHELL_BROWSER_ROOT_WINDOW_CONTROLLER_H_
+
+#include <list>
+#include <memory>
+
+#include "base/macros.h"
+#include "extensions/browser/app_window/app_window_registry.h"
+#include "ui/aura/client/window_parenting_client.h"
+#include "ui/aura/window_tree_host_observer.h"
+#include "ui/gfx/native_widget_types.h"
+
+namespace aura {
+class WindowTreeHost;
+}  // namespace aura
+
+namespace content {
+class BrowserContext;
+}  // namespace content
+
+namespace gfx {
+class Rect;
+class Size;
+}  // namespace gfx
+
+namespace extensions {
+class AppWindow;
+class Extension;
+class ShellScreen;
+
+// Owns and manages a WindowTreeHost for a display. New AppWindows will fill
+// the entire root window. Any additional AppWindows are simply drawn over the
+// existing AppWindow(s) and cannot be resized except by resizing the
+// WindowTreeHost.
+class RootWindowController : public aura::client::WindowParentingClient,
+                             public aura::WindowTreeHostObserver,
+                             public AppWindowRegistry::Observer {
+ public:
+  class DesktopDelegate {
+   public:
+    virtual ~DesktopDelegate() = default;
+
+    // Called when the root window requests to be closed. This should eventually
+    // destroy |root_window_controller|.
+    virtual void CloseRootWindowController(
+        RootWindowController* root_window_controller) = 0;
+  };
+
+  // RootWindowController initializes and displays a WindowTreeHost within
+  // |bounds|. |desktop_delegate| must outlive the RootWindowController.
+  RootWindowController(DesktopDelegate* desktop_delegate,
+                       ShellScreen* screen,
+                       const gfx::Rect& bounds,
+                       content::BrowserContext* browser_context);
+  ~RootWindowController() override;
+
+  // Creates a new app window and adds it to the desktop. The AppWindow deletes
+  // itself when its native window closes.
+  AppWindow* CreateAppWindow(content::BrowserContext* context,
+                             const Extension* extension);
+
+  // Attaches a NativeAppWindow's window to our root window.
+  void AddAppWindow(gfx::NativeWindow window);
+
+  // Closes the root window's AppWindows, resulting in their destruction.
+  void CloseAppWindows();
+
+  // Updates the size of the root window.
+  void UpdateSize(const gfx::Size& size);
+
+  aura::WindowTreeHost* host() { return host_.get(); }
+
+  // aura::client::WindowParentingClient:
+  aura::Window* GetDefaultParent(aura::Window* window,
+                                 const gfx::Rect& bounds) override;
+
+  // aura::WindowTreeHostObserver:
+  void OnHostCloseRequested(aura::WindowTreeHost* host) override;
+
+  // AppWindowRegistry::Observer:
+  void OnAppWindowRemoved(AppWindow* app_window) override;
+
+ private:
+  void DestroyWindowTreeHost();
+
+  DesktopDelegate* const desktop_delegate_;
+  ShellScreen* const screen_;
+
+  // The BrowserContext used to create AppWindows.
+  content::BrowserContext* const browser_context_;
+
+  // The host we create.
+  std::unique_ptr<aura::WindowTreeHost> host_;
+
+  // List of AppWindows we've created. Used to close any remaining app windows
+  // when |host_| is closed or |this| is destroyed.
+  // Note: Pointers are unowned. NativeAppWindow::Close() will delete them.
+  std::list<AppWindow*> app_windows_;
+
+  DISALLOW_COPY_AND_ASSIGN(RootWindowController);
+};
+
+}  // namespace extensions
+
+#endif  // EXTENSIONS_SHELL_BROWSER_ROOT_WINDOW_CONTROLLER_H_
diff --git a/extensions/shell/browser/root_window_controller_unittest.cc b/extensions/shell/browser/root_window_controller_unittest.cc
new file mode 100644
index 0000000..1455c7b8
--- /dev/null
+++ b/extensions/shell/browser/root_window_controller_unittest.cc
@@ -0,0 +1,236 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "extensions/shell/browser/root_window_controller.h"
+
+#include <algorithm>
+#include <list>
+#include <memory>
+
+#include "base/memory/ptr_util.h"
+#include "content/public/browser/browser_context.h"
+#include "extensions/browser/app_window/app_window.h"
+#include "extensions/browser/app_window/native_app_window.h"
+#include "extensions/common/test_util.h"
+#include "extensions/shell/browser/root_window_controller.h"
+#include "extensions/shell/browser/shell_app_window_client.h"
+#include "extensions/shell/browser/shell_native_app_window_aura.h"
+#include "extensions/shell/browser/shell_screen.h"
+#include "extensions/shell/test/shell_test_base_aura.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/aura/window.h"
+#include "ui/aura/window_tree_host.h"
+#include "ui/display/screen.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/geometry/size.h"
+
+namespace extensions {
+
+namespace {
+
+// A fake that creates and exposes RootWindowControllers.
+class FakeDesktopDelegate : public RootWindowController::DesktopDelegate {
+ public:
+  explicit FakeDesktopDelegate(content::BrowserContext* browser_context,
+                               ShellScreen* screen,
+                               const gfx::Rect& bounds)
+      : browser_context_(browser_context), screen_(screen), bounds_(bounds) {}
+  ~FakeDesktopDelegate() override = default;
+
+  RootWindowController* CreateRootWindowController() {
+    root_window_controllers_.emplace_back(
+        base::MakeUnique<RootWindowController>(this, screen_, bounds_,
+                                               browser_context_));
+    return root_window_controllers_.back().get();
+  }
+
+  // RootWindowController::DesktopDelegate:
+  void CloseRootWindowController(
+      RootWindowController* root_window_controller) override {
+    auto it = std::find_if(root_window_controllers_.begin(),
+                           root_window_controllers_.end(),
+                           [&](const auto& candidate) {
+                             return candidate.get() == root_window_controller;
+                           });
+    DCHECK(it != root_window_controllers_.end());
+    root_window_controllers_.erase(it);
+  }
+
+  auto root_window_controller_count() {
+    return root_window_controllers_.size();
+  }
+
+ private:
+  content::BrowserContext* browser_context_;
+  ShellScreen* screen_;
+  const gfx::Rect bounds_;
+  std::list<std::unique_ptr<RootWindowController>> root_window_controllers_;
+
+  DISALLOW_COPY_AND_ASSIGN(FakeDesktopDelegate);
+};
+
+// An AppWindowClient for use without a DesktopController.
+class TestAppWindowClient : public ShellAppWindowClient {
+ public:
+  TestAppWindowClient() = default;
+  ~TestAppWindowClient() override = default;
+
+  NativeAppWindow* CreateNativeAppWindow(
+      AppWindow* window,
+      AppWindow::CreateParams* params) override {
+    return new ShellNativeAppWindowAura(window, *params);
+  }
+};
+
+constexpr gfx::Rect kScreenBounds = gfx::Rect(0, 0, 800, 600);
+
+}  // namespace
+
+class RootWindowControllerTest : public ShellTestBaseAura {
+ public:
+  RootWindowControllerTest() = default;
+  ~RootWindowControllerTest() override = default;
+
+  void SetUp() override {
+    ShellTestBaseAura::SetUp();
+
+    AppWindowClient::Set(&app_window_client_);
+    screen_ = base::MakeUnique<ShellScreen>(nullptr, kScreenBounds.size());
+    display::Screen::SetScreenInstance(screen_.get());
+    extension_ = test_util::CreateEmptyExtension();
+
+    desktop_delegate_ = base::MakeUnique<FakeDesktopDelegate>(
+        browser_context(), screen_.get(), kScreenBounds);
+  }
+
+  void TearDown() override {
+    desktop_delegate_.reset();
+    display::Screen::SetScreenInstance(nullptr);
+    screen_.reset();
+    AppWindowClient::Set(nullptr);
+    ShellTestBaseAura::TearDown();
+  }
+
+ protected:
+  // Creates and returns an AppWindow using the RootWindowController.
+  AppWindow* CreateAppWindow(RootWindowController* root) {
+    AppWindow* app_window =
+        root->CreateAppWindow(browser_context(), extension());
+    InitAppWindow(app_window);
+    root->AddAppWindow(app_window->GetNativeWindow());
+    return app_window;
+  }
+
+  // Checks that there are |num_expected| AppWindows open.
+  void ExpectNumAppWindows(RootWindowController* root, size_t expected) {
+    EXPECT_EQ(expected, root->host()->window()->children().size());
+    EXPECT_EQ(expected,
+              AppWindowRegistry::Get(browser_context())->app_windows().size());
+  }
+
+  FakeDesktopDelegate* desktop_delegate() { return desktop_delegate_.get(); }
+  const Extension* extension() { return extension_.get(); }
+
+  ShellScreen* screen() { return screen_.get(); }
+
+ private:
+  TestAppWindowClient app_window_client_;
+
+  scoped_refptr<Extension> extension_;
+  std::unique_ptr<ShellScreen> screen_;
+  std::unique_ptr<FakeDesktopDelegate> desktop_delegate_;
+
+  DISALLOW_COPY_AND_ASSIGN(RootWindowControllerTest);
+};
+
+// Tests RootWindowController's basic setup and teardown.
+TEST_F(RootWindowControllerTest, Basic) {
+  RootWindowController* root_window_controller =
+      desktop_delegate()->CreateRootWindowController();
+  EXPECT_TRUE(root_window_controller->host());
+
+  // The RootWindowController destroys itself when the root window closes.
+  root_window_controller->OnHostCloseRequested(root_window_controller->host());
+  EXPECT_EQ(0u, desktop_delegate()->root_window_controller_count());
+}
+
+// Tests the window layout.
+TEST_F(RootWindowControllerTest, FillLayout) {
+  RootWindowController* root_window_controller =
+      desktop_delegate()->CreateRootWindowController();
+
+  root_window_controller->host()->SetBoundsInPixels(gfx::Rect(0, 0, 500, 700));
+
+  AppWindow* app_window =
+      root_window_controller->CreateAppWindow(browser_context(), extension());
+  InitAppWindow(app_window);
+  root_window_controller->AddAppWindow(app_window->GetNativeWindow());
+
+  ExpectNumAppWindows(root_window_controller, 1u);
+
+  // Test that reshaping the host window also resizes the child window, and
+  // moving the host doesn't affect the child's position relative to the host.
+  root_window_controller->host()->SetBoundsInPixels(
+      gfx::Rect(100, 200, 300, 400));
+
+  const aura::Window* root_window = root_window_controller->host()->window();
+  EXPECT_EQ(gfx::Rect(0, 0, 300, 400), root_window->bounds());
+  EXPECT_EQ(gfx::Rect(0, 0, 300, 400), root_window->children()[0]->bounds());
+
+  // The AppWindow will close on shutdown.
+}
+
+// Tests creating and removing AppWindows.
+TEST_F(RootWindowControllerTest, AppWindows) {
+  RootWindowController* root_window_controller =
+      desktop_delegate()->CreateRootWindowController();
+
+  {
+    // Create some AppWindows.
+    CreateAppWindow(root_window_controller);
+    AppWindow* middle_window = CreateAppWindow(root_window_controller);
+    CreateAppWindow(root_window_controller);
+
+    ExpectNumAppWindows(root_window_controller, 3u);
+
+    // Close one window, which deletes |middle_window|.
+    middle_window->GetBaseWindow()->Close();
+  }
+
+  ExpectNumAppWindows(root_window_controller, 2u);
+
+  // Close all remaining windows.
+  root_window_controller->CloseAppWindows();
+  ExpectNumAppWindows(root_window_controller, 0u);
+}
+
+// Tests that a second RootWindowController can be used independently of the
+// first.
+TEST_F(RootWindowControllerTest, Multiple) {
+  // Create the longer-lived RootWindowController before the shorter-lived one
+  // is deleted. Otherwise it may be created at the same address, preventing
+  // the test from failing on use-after-free.
+  RootWindowController* longer_lived =
+      desktop_delegate()->CreateRootWindowController();
+  {
+    RootWindowController* shorter_lived =
+        desktop_delegate()->CreateRootWindowController();
+    {
+      AppWindow* app_window = CreateAppWindow(shorter_lived);
+      ExpectNumAppWindows(shorter_lived, 1u);
+      app_window->GetBaseWindow()->Close();  // Deletes the AppWindow.
+    }
+    ExpectNumAppWindows(shorter_lived, 0u);
+
+    // Simulate a close request to delete the controller.
+    shorter_lived->OnHostCloseRequested(shorter_lived->host());
+  }
+
+  // The still-living RootWindowController can still be used.
+  AppWindow* app_window = CreateAppWindow(longer_lived);
+  ExpectNumAppWindows(longer_lived, 1u);
+  app_window->GetBaseWindow()->Close();
+}
+
+}  // namespace extensions
diff --git a/extensions/shell/browser/shell_browser_main_delegate.h b/extensions/shell/browser/shell_browser_main_delegate.h
index a3ddf7f..67d2d7c7 100644
--- a/extensions/shell/browser/shell_browser_main_delegate.h
+++ b/extensions/shell/browser/shell_browser_main_delegate.h
@@ -28,7 +28,8 @@
   // Creates the ShellDesktopControllerAura instance to initialize the root
   // window and window manager. Subclass may return its subclass to customize
   // the window manager.
-  virtual DesktopController* CreateDesktopController() = 0;
+  virtual DesktopController* CreateDesktopController(
+      content::BrowserContext* context) = 0;
 };
 
 }  // namespace extensions
diff --git a/extensions/shell/browser/shell_browser_main_parts.cc b/extensions/shell/browser/shell_browser_main_parts.cc
index ea8076a1..b772850a 100644
--- a/extensions/shell/browser/shell_browser_main_parts.cc
+++ b/extensions/shell/browser/shell_browser_main_parts.cc
@@ -179,7 +179,8 @@
 
   storage_monitor::StorageMonitor::Create();
 
-  desktop_controller_.reset(browser_main_delegate_->CreateDesktopController());
+  desktop_controller_.reset(
+      browser_main_delegate_->CreateDesktopController(browser_context_.get()));
 
   // TODO(jamescook): Initialize user_manager::UserManager.
 
diff --git a/extensions/shell/browser/shell_desktop_controller_aura.cc b/extensions/shell/browser/shell_desktop_controller_aura.cc
index 5ecf36f..c563510 100644
--- a/extensions/shell/browser/shell_desktop_controller_aura.cc
+++ b/extensions/shell/browser/shell_desktop_controller_aura.cc
@@ -4,36 +4,28 @@
 
 #include "extensions/shell/browser/shell_desktop_controller_aura.h"
 
-#include <algorithm>
 #include <string>
 
 #include "base/command_line.h"
 #include "base/location.h"
 #include "base/logging.h"
-#include "base/macros.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 "build/build_config.h"
-#include "extensions/browser/app_window/app_window.h"
-#include "extensions/browser/app_window/native_app_window.h"
-#include "extensions/shell/browser/shell_app_delegate.h"
 #include "extensions/shell/browser/shell_app_window_client.h"
 #include "extensions/shell/browser/shell_screen.h"
 #include "extensions/shell/common/switches.h"
 #include "ui/aura/client/cursor_client.h"
 #include "ui/aura/client/default_capture_client.h"
-#include "ui/aura/layout_manager.h"
 #include "ui/aura/window.h"
-#include "ui/aura/window_tracker.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/base/cursor/cursor.h"
 #include "ui/base/cursor/image_cursors.h"
 #include "ui/base/ime/input_method.h"
+#include "ui/base/ime/input_method_factory.h"
 #include "ui/base/user_activity/user_activity_detector.h"
 #include "ui/display/screen.h"
-#include "ui/events/event_sink.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/native_widget_types.h"
@@ -58,55 +50,14 @@
 namespace extensions {
 namespace {
 
-// A simple layout manager that makes each new window fill the root window.
-class FillLayout : public aura::LayoutManager {
- public:
-  FillLayout(aura::Window* owner) : owner_(owner) { DCHECK(owner_); }
-
-  ~FillLayout() override {}
-
- private:
-  // aura::LayoutManager:
-  void OnWindowResized() override {
-    // Size the owner's immediate child windows.
-    aura::WindowTracker children_tracker(owner_->children());
-    while (!children_tracker.windows().empty()) {
-      aura::Window* child = children_tracker.Pop();
-      child->SetBounds(gfx::Rect(owner_->bounds().size()));
-    }
-  }
-
-  void OnWindowAddedToLayout(aura::Window* child) override {
-    DCHECK_EQ(owner_, child->parent());
-
-    // Create a rect at 0,0 with the size of the parent.
-    gfx::Size parent_size = child->parent()->bounds().size();
-    child->SetBounds(gfx::Rect(parent_size));
-  }
-
-  void OnWillRemoveWindowFromLayout(aura::Window* child) override {}
-
-  void OnWindowRemovedFromLayout(aura::Window* child) override {}
-
-  void OnChildWindowVisibilityChanged(aura::Window* child,
-                                      bool visible) override {}
-
-  void SetChildBounds(aura::Window* child,
-                      const gfx::Rect& requested_bounds) override {
-    SetChildBoundsDirect(child, requested_bounds);
-  }
-
-  aura::Window* owner_;  // Not owned.
-
-  DISALLOW_COPY_AND_ASSIGN(FillLayout);
-};
-
 // A class that bridges the gap between CursorManager and Aura. It borrows
 // heavily from NativeCursorManagerAsh.
 class ShellNativeCursorManager : public wm::NativeCursorManager {
  public:
-  explicit ShellNativeCursorManager(aura::WindowTreeHost* host)
-      : host_(host), image_cursors_(new ui::ImageCursors) {}
+  explicit ShellNativeCursorManager(
+      ShellDesktopControllerAura* desktop_controller)
+      : desktop_controller_(desktop_controller),
+        image_cursors_(new ui::ImageCursors) {}
   ~ShellNativeCursorManager() override {}
 
   // wm::NativeCursorManager overrides.
@@ -123,7 +74,7 @@
     delegate->CommitCursor(cursor);
 
     if (delegate->IsCursorVisible())
-      ApplyCursor(cursor);
+      SetCursorOnAllRootWindows(cursor);
   }
 
   void SetVisibility(bool visible,
@@ -135,7 +86,7 @@
     } else {
       gfx::NativeCursor invisible_cursor(ui::CursorType::kNone);
       image_cursors_->SetPlatformCursor(&invisible_cursor);
-      ApplyCursor(invisible_cursor);
+      SetCursorOnAllRootWindows(invisible_cursor);
     }
   }
 
@@ -156,9 +107,12 @@
 
  private:
   // Sets |cursor| as the active cursor within Aura.
-  void ApplyCursor(gfx::NativeCursor cursor) { host_->SetCursor(cursor); }
+  void SetCursorOnAllRootWindows(gfx::NativeCursor cursor) {
+    if (desktop_controller_->GetPrimaryHost())
+      desktop_controller_->GetPrimaryHost()->SetCursor(cursor);
+  }
 
-  aura::WindowTreeHost* host_;  // Not owned.
+  ShellDesktopControllerAura* desktop_controller_;  // Not owned.
 
   std::unique_ptr<ui::ImageCursors> image_cursors_;
 
@@ -180,8 +134,10 @@
 
 }  // namespace
 
-ShellDesktopControllerAura::ShellDesktopControllerAura()
-    : app_window_client_(new ShellAppWindowClient) {
+ShellDesktopControllerAura::ShellDesktopControllerAura(
+    content::BrowserContext* browser_context)
+    : browser_context_(browser_context),
+      app_window_client_(new ShellAppWindowClient) {
   extensions::AppWindowClient::Set(app_window_client_.get());
 
 #if defined(OS_CHROMEOS)
@@ -193,12 +149,12 @@
   display_configurator_->ForceInitialConfigure();
   display_configurator_->AddObserver(this);
 #endif
-  CreateRootWindow();
+
+  InitWindowManager();
 }
 
 ShellDesktopControllerAura::~ShellDesktopControllerAura() {
-  CloseAppWindows();
-  DestroyRootWindow();
+  TearDownWindowManager();
 #if defined(OS_CHROMEOS)
   chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver(
       this);
@@ -216,41 +172,26 @@
 AppWindow* ShellDesktopControllerAura::CreateAppWindow(
     content::BrowserContext* context,
     const Extension* extension) {
-  // Start observing for OnAppWindowClosed. Note: We can't remove this observer
-  // later because this class expects to outlive the AppWindowRegistry.
-  AppWindowRegistry* registry = AppWindowRegistry::Get(context);
-  if (!registry->HasObserver(this))
-    registry->AddObserver(this);
-
-  app_windows_.push_back(
-      new AppWindow(context, new ShellAppDelegate, extension));
-  return app_windows_.back();
+  return root_window_controller_->CreateAppWindow(context, extension);
 }
 
 void ShellDesktopControllerAura::AddAppWindow(gfx::NativeWindow window) {
-  aura::Window* root_window = host_->window();
-  root_window->AddChild(window);
+  root_window_controller_->AddAppWindow(window);
 }
 
 void ShellDesktopControllerAura::CloseAppWindows() {
-  // Move the original list into a temporary one: Closing the windows will
-  // trigger OnAppWindowRemoved, which would invalidate iterators into the
-  // original list.
-  std::list<AppWindow*> app_windows = std::move(app_windows_);
-  for (AppWindow* app_window : app_windows)
-    app_window->GetBaseWindow()->Close();  // Close() deletes |app_window|.
+  root_window_controller_->CloseAppWindows();
 }
 
-void ShellDesktopControllerAura::OnAppWindowRemoved(AppWindow* window) {
-  // If we created this AppWindow, remove it from our list so we don't try to
-  // close it again later.
-  app_windows_.remove(window);
-}
+void ShellDesktopControllerAura::CloseRootWindowController(
+    RootWindowController* root_window_controller) {
+  DCHECK_EQ(root_window_controller_.get(), root_window_controller);
 
-aura::Window* ShellDesktopControllerAura::GetDefaultParent(
-    aura::Window* window,
-    const gfx::Rect& bounds) {
-  return host_->window();
+  // Just quit. The RootWindowController must stay alive until we begin
+  // TearDownWindowManager().
+  // run_loop_ may be null in tests.
+  if (run_loop_)
+    run_loop_->QuitWhenIdle();
 }
 
 #if defined(OS_CHROMEOS)
@@ -268,56 +209,103 @@
     const display::DisplayConfigurator::DisplayStateList& displays) {
   gfx::Size size = GetPrimaryDisplaySize();
   if (!size.IsEmpty())
-    host_->UpdateRootWindowSizeInPixels(size);
+    root_window_controller_->UpdateSize(size);
 }
 #endif
 
-void ShellDesktopControllerAura::OnHostCloseRequested(
-    aura::WindowTreeHost* host) {
-  DCHECK_EQ(host_.get(), host);
-  CloseAppWindows();
-
-  // run_loop_ may be null in tests.
-  if (run_loop_)
-    run_loop_->QuitWhenIdle();
-}
-
 ui::EventDispatchDetails ShellDesktopControllerAura::DispatchKeyEventPostIME(
     ui::KeyEvent* key_event) {
-  return host_->DispatchKeyEventPostIME(key_event);
+  DCHECK(root_window_controller_);
+
+  // TODO(michaelpg): With multiple windows, determine which root window
+  // triggered the event. See ash::WindowTreeHostManager for example.
+  return GetPrimaryHost()->DispatchKeyEventPostIME(key_event);
+}
+
+aura::WindowTreeHost* ShellDesktopControllerAura::GetPrimaryHost() {
+  if (!root_window_controller_)
+    return nullptr;
+  return root_window_controller_->host();
 }
 
 void ShellDesktopControllerAura::InitWindowManager() {
-  wm::FocusController* focus_controller =
-      new wm::FocusController(new AppsFocusRules());
-  aura::client::SetFocusClient(host_->window(), focus_controller);
-  host_->window()->AddPreTargetHandler(focus_controller);
-  wm::SetActivationClient(host_->window(), focus_controller);
-  focus_client_.reset(focus_controller);
+  root_window_event_filter_ = base::MakeUnique<wm::CompoundEventFilter>();
 
-  capture_client_.reset(
-      new aura::client::DefaultCaptureClient(host_->window()));
+  // Set up basic pieces of ui::wm.
+  screen_ = base::MakeUnique<ShellScreen>(this, GetStartingWindowSize());
+  display::Screen::SetScreenInstance(screen_.get());
 
-  // Ensure new windows fill the display.
-  host_->window()->SetLayoutManager(new FillLayout(host_->window()));
+  focus_controller_ =
+      base::MakeUnique<wm::FocusController>(new AppsFocusRules());
 
-  cursor_manager_.reset(
-      new wm::CursorManager(std::unique_ptr<wm::NativeCursorManager>(
-          new ShellNativeCursorManager(host_.get()))));
-  cursor_manager_->SetDisplay(
-      display::Screen::GetScreen()->GetPrimaryDisplay());
-  cursor_manager_->SetCursor(ui::CursorType::kPointer);
-  aura::client::SetCursorClient(host_->window(), cursor_manager_.get());
+  cursor_manager_ = base::MakeUnique<wm::CursorManager>(
+      base::MakeUnique<ShellNativeCursorManager>(this));
 
-  user_activity_detector_.reset(new ui::UserActivityDetector);
+  user_activity_detector_ = base::MakeUnique<ui::UserActivityDetector>();
 #if defined(OS_CHROMEOS)
-  user_activity_notifier_.reset(
-      new ui::UserActivityPowerManagerNotifier(user_activity_detector_.get()));
+  user_activity_notifier_ =
+      base::MakeUnique<ui::UserActivityPowerManagerNotifier>(
+          user_activity_detector_.get());
 #endif
+
+  // Create the root window, then set it up as our primary window.
+  CreateRootWindowController();
+  FinalizeWindowManager();
 }
 
-void ShellDesktopControllerAura::CreateRootWindow() {
-  // Set up basic pieces of ui::wm.
+void ShellDesktopControllerAura::CreateRootWindowController() {
+  // TODO(michaelpg): Support creating a host for a secondary display.
+  root_window_controller_ = base::MakeUnique<RootWindowController>(
+      this, screen_.get(),
+      gfx::Rect(screen_->GetPrimaryDisplay().GetSizeInPixel()),
+      browser_context_);
+
+  // Initialize the root window with our clients.
+  aura::Window* root_window = root_window_controller_->host()->window();
+  root_window->AddPreTargetHandler(root_window_event_filter_.get());
+  aura::client::SetFocusClient(root_window, focus_controller_.get());
+  root_window->AddPreTargetHandler(focus_controller_.get());
+  wm::SetActivationClient(root_window, focus_controller_.get());
+  aura::client::SetCursorClient(root_window, cursor_manager_.get());
+}
+
+void ShellDesktopControllerAura::FinalizeWindowManager() {
+  // Create an input method and become its delegate.
+  input_method_ =
+      ui::CreateInputMethod(this, GetPrimaryHost()->GetAcceleratedWidget());
+
+  cursor_manager_->SetDisplay(screen_->GetPrimaryDisplay());
+  cursor_manager_->SetCursor(ui::CursorType::kPointer);
+
+  // TODO(michaelpg): Replace with a capture client supporting multiple
+  // WindowTreeHosts.
+  capture_client_ = base::MakeUnique<aura::client::DefaultCaptureClient>(
+      GetPrimaryHost()->window());
+}
+
+void ShellDesktopControllerAura::TearDownWindowManager() {
+  GetPrimaryHost()->window()->RemovePreTargetHandler(
+      root_window_event_filter_.get());
+  root_window_event_filter_.reset();
+
+  // The DefaultCaptureClient must be destroyed before the root window.
+  capture_client_.reset();
+
+  GetPrimaryHost()->window()->RemovePreTargetHandler(focus_controller_.get());
+  wm::SetActivationClient(GetPrimaryHost()->window(), nullptr);
+  root_window_controller_.reset();
+
+  focus_controller_.reset();
+  cursor_manager_.reset();
+#if defined(OS_CHROMEOS)
+  user_activity_notifier_.reset();
+#endif
+  user_activity_detector_.reset();
+  display::Screen::SetScreenInstance(nullptr);
+  screen_.reset();
+}
+
+gfx::Size ShellDesktopControllerAura::GetStartingWindowSize() {
   gfx::Size size;
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
   if (command_line->HasSwitch(switches::kAppShellHostWindowSize)) {
@@ -331,49 +319,7 @@
   }
   if (size.IsEmpty())
     size = gfx::Size(1920, 1080);
-
-  screen_.reset(new ShellScreen(size));
-  display::Screen::SetScreenInstance(screen_.get());
-
-  host_.reset(screen_->CreateHostForPrimaryDisplay());
-  aura::client::SetWindowParentingClient(host_->window(), this);
-  root_window_event_filter_.reset(new wm::CompoundEventFilter);
-  host_->window()->AddPreTargetHandler(root_window_event_filter_.get());
-
-  // Trigger creation of an input method and become its delegate.
-  ui::InputMethod* input_method = host_->GetInputMethod();
-  input_method->SetDelegate(this);
-
-  InitWindowManager();
-
-  host_->AddObserver(this);
-
-  // Ensure the X window gets mapped.
-  host_->Show();
-}
-
-void ShellDesktopControllerAura::DestroyRootWindow() {
-  host_->RemoveObserver(this);
-  wm::FocusController* focus_controller =
-      static_cast<wm::FocusController*>(focus_client_.get());
-  if (focus_controller) {
-    host_->window()->RemovePreTargetHandler(focus_controller);
-    wm::SetActivationClient(host_->window(), NULL);
-  }
-
-  host_->window()->RemovePreTargetHandler(root_window_event_filter_.get());
-  root_window_event_filter_.reset();
-
-  capture_client_.reset();
-  focus_client_.reset();
-  cursor_manager_.reset();
-#if defined(OS_CHROMEOS)
-  user_activity_notifier_.reset();
-#endif
-  user_activity_detector_.reset();
-  host_.reset();
-  display::Screen::SetScreenInstance(nullptr);
-  screen_.reset();
+  return size;
 }
 
 gfx::Size ShellDesktopControllerAura::GetPrimaryDisplaySize() {
diff --git a/extensions/shell/browser/shell_desktop_controller_aura.h b/extensions/shell/browser/shell_desktop_controller_aura.h
index 4dae572..d18a1b4 100644
--- a/extensions/shell/browser/shell_desktop_controller_aura.h
+++ b/extensions/shell/browser/shell_desktop_controller_aura.h
@@ -5,16 +5,13 @@
 #ifndef EXTENSIONS_SHELL_BROWSER_SHELL_DESKTOP_CONTROLLER_AURA_H_
 #define EXTENSIONS_SHELL_BROWSER_SHELL_DESKTOP_CONTROLLER_AURA_H_
 
-#include <list>
 #include <memory>
 
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "build/build_config.h"
-#include "extensions/browser/app_window/app_window_registry.h"
 #include "extensions/shell/browser/desktop_controller.h"
-#include "ui/aura/client/window_parenting_client.h"
-#include "ui/aura/window_tree_host_observer.h"
+#include "extensions/shell/browser/root_window_controller.h"
 #include "ui/base/ime/input_method_delegate.h"
 
 #if defined(OS_CHROMEOS)
@@ -23,57 +20,56 @@
 #endif
 
 namespace aura {
-class Window;
 class WindowTreeHost;
 namespace client {
 class DefaultCaptureClient;
-class FocusClient;
-}
-}
+}  // namespace client
+}  // namespace aura
 
 namespace base {
 class RunLoop;
-}
+}  // namespace base
+
+namespace content {
+class BrowserContext;
+}  // namespace content
 
 namespace gfx {
 class Size;
-}
+}  // namespace gfx
 
 namespace ui {
+class InputMethod;
 class UserActivityDetector;
 #if defined(OS_CHROMEOS)
 class UserActivityPowerManagerNotifier;
 #endif
-}
+}  // namespace ui
 
 namespace wm {
 class CompoundEventFilter;
 class CursorManager;
-}
+class FocusController;
+}  // namespace wm
 
 namespace extensions {
 class AppWindowClient;
-class Extension;
 class ShellScreen;
 
 // Simple desktop controller for app_shell. Sets up a root Aura window for the
 // primary display.
 class ShellDesktopControllerAura
     : public DesktopController,
-      public AppWindowRegistry::Observer,
-      public aura::client::WindowParentingClient,
+      public RootWindowController::DesktopDelegate,
 #if defined(OS_CHROMEOS)
       public chromeos::PowerManagerClient::Observer,
       public display::DisplayConfigurator::Observer,
 #endif
-      public aura::WindowTreeHostObserver,
       public ui::internal::InputMethodDelegate {
  public:
-  ShellDesktopControllerAura();
+  explicit ShellDesktopControllerAura(content::BrowserContext* browser_context);
   ~ShellDesktopControllerAura() override;
 
-  aura::WindowTreeHost* host() { return host_.get(); }
-
   // DesktopController:
   void Run() override;
   AppWindow* CreateAppWindow(content::BrowserContext* context,
@@ -81,12 +77,9 @@
   void AddAppWindow(gfx::NativeWindow window) override;
   void CloseAppWindows() override;
 
-  // AppWindowRegistry::Observer overrides:
-  void OnAppWindowRemoved(AppWindow* app_window) override;
-
-  // aura::client::WindowParentingClient overrides:
-  aura::Window* GetDefaultParent(aura::Window* window,
-                                 const gfx::Rect& bounds) override;
+  // RootWindowController::DesktopDelegate:
+  void CloseRootWindowController(
+      RootWindowController* root_window_controller) override;
 
 #if defined(OS_CHROMEOS)
   // chromeos::PowerManagerClient::Observer overrides:
@@ -98,42 +91,58 @@
       const display::DisplayConfigurator::DisplayStateList& displays) override;
 #endif
 
-  // aura::WindowTreeHostObserver overrides:
-  void OnHostCloseRequested(aura::WindowTreeHost* host) override;
-
   // ui::internal::InputMethodDelegate overrides:
   ui::EventDispatchDetails DispatchKeyEventPostIME(
       ui::KeyEvent* key_event) override;
 
+  // Returns the RootWindowController's WindowTreeHost.
+  aura::WindowTreeHost* GetPrimaryHost();
+
+  RootWindowController* root_window_controller() {
+    return root_window_controller_.get();
+  }
+
  protected:
   // Creates and sets the aura clients and window manager stuff. Subclass may
   // initialize different sets of the clients.
   virtual void InitWindowManager();
 
- private:
-  // Creates the window that hosts the app.
-  void CreateRootWindow();
+  // Tears down the window manager stuff set up in InitWindowManager().
+  virtual void TearDownWindowManager();
 
-  // Closes and destroys the root window hosting the app.
-  void DestroyRootWindow();
+ private:
+  // Creates the RootWindowController that hosts the app.
+  void CreateRootWindowController();
+
+  // Finishes set-up using the RootWindowController.
+  void FinalizeWindowManager();
+
+  // Returns the desired dimensions of the RootWindowController from the command
+  // line, or falls back to a default size.
+  gfx::Size GetStartingWindowSize();
 
   // Returns the dimensions (in pixels) of the primary display, or an empty size
   // if the dimensions can't be determined or no display is connected.
   gfx::Size GetPrimaryDisplaySize();
 
+  content::BrowserContext* const browser_context_;
+
 #if defined(OS_CHROMEOS)
   std::unique_ptr<display::DisplayConfigurator> display_configurator_;
 #endif
 
   std::unique_ptr<ShellScreen> screen_;
 
-  std::unique_ptr<aura::WindowTreeHost> host_;
-
   std::unique_ptr<wm::CompoundEventFilter> root_window_event_filter_;
 
+  // TODO(michaelpg): Support one RootWindowController per display.
+  std::unique_ptr<RootWindowController> root_window_controller_;
+
+  std::unique_ptr<ui::InputMethod> input_method_;
+
   std::unique_ptr<aura::client::DefaultCaptureClient> capture_client_;
 
-  std::unique_ptr<aura::client::FocusClient> focus_client_;
+  std::unique_ptr<wm::FocusController> focus_controller_;
 
   std::unique_ptr<wm::CursorManager> cursor_manager_;
 
diff --git a/extensions/shell/browser/shell_desktop_controller_aura_unittest.cc b/extensions/shell/browser/shell_desktop_controller_aura_unittest.cc
index 4590aff8..af55714b 100644
--- a/extensions/shell/browser/shell_desktop_controller_aura_unittest.cc
+++ b/extensions/shell/browser/shell_desktop_controller_aura_unittest.cc
@@ -56,12 +56,7 @@
 #endif
 
     ShellTestBaseAura::SetUp();
-
-    // The input method will be used for the next CreateInputMethod call,
-    // causing the host to take ownership.
-    ui::SetUpInputMethodForTesting(new ui::InputMethodMinimal(nullptr));
-
-    controller_.reset(new ShellDesktopControllerAura());
+    controller_.reset(new ShellDesktopControllerAura(browser_context()));
   }
 
   void TearDown() override {
@@ -73,30 +68,6 @@
   }
 
  protected:
-  // Creates an AppWindow, which should delete itself when closed.
-  AppWindow* CreateAppWindow(Extension* extension) {
-    AppWindow* app_window =
-        controller_->CreateAppWindow(browser_context(), extension);
-
-    std::unique_ptr<content::WebContents> web_contents(
-        content::WebContents::Create(
-            content::WebContents::CreateParams(browser_context())));
-    std::unique_ptr<TestAppWindowContents> app_window_contents =
-        base::MakeUnique<TestAppWindowContents>(std::move(web_contents));
-
-    // Init the ShellExtensionsWebContentsObserver.
-    app_window->app_delegate()->InitWebContents(
-        app_window_contents->GetWebContents());
-
-    content::RenderFrameHost* main_frame =
-        app_window_contents->GetWebContents()->GetMainFrame();
-    EXPECT_TRUE(main_frame);
-
-    app_window->Init(GURL(std::string()), app_window_contents.release(),
-                     main_frame, AppWindow::CreateParams());
-    return app_window;
-  }
-
   std::unique_ptr<ShellDesktopControllerAura> controller_;
 
 #if defined(OS_CHROMEOS)
@@ -126,7 +97,8 @@
 // Tests that basic input events are handled and forwarded to the host.
 // TODO(michaelpg): Test other types of input.
 TEST_F(ShellDesktopControllerAuraTest, InputEvents) {
-  ui::InputMethod* input_method = controller_->host()->GetInputMethod();
+  ui::InputMethod* input_method =
+      controller_->GetPrimaryHost()->GetInputMethod();
   ASSERT_TRUE(input_method);
 
   // Set up a focused text input to receive the keypress event.
@@ -137,8 +109,8 @@
   // Dispatch a keypress on the window tree host to verify it is processed.
   ui::KeyEvent key_press(base::char16(97), ui::VKEY_A, ui::EF_NONE);
   ui::EventDispatchDetails details =
-      controller_->host()->dispatcher()->DispatchEvent(
-          controller_->host()->window(), &key_press);
+      controller_->GetPrimaryHost()->dispatcher()->DispatchEvent(
+          controller_->GetPrimaryHost()->window(), &key_press);
   EXPECT_FALSE(details.dispatcher_destroyed);
   EXPECT_FALSE(details.target_destroyed);
   EXPECT_TRUE(key_press.handled());
@@ -148,58 +120,35 @@
   input_method->DetachTextInputClient(&client);
 }
 
-// Tests the basic window layout.
-TEST_F(ShellDesktopControllerAuraTest, FillLayout) {
-  controller_->host()->SetBoundsInPixels(gfx::Rect(0, 0, 500, 700));
-
-  scoped_refptr<Extension> extension = test_util::CreateEmptyExtension();
-  CreateAppWindow(extension.get());
-
-  aura::Window* root_window = controller_->host()->window();
-  EXPECT_EQ(1u, root_window->children().size());
-
-  // Test that reshaping the host window also resizes the child window.
-  controller_->host()->SetBoundsInPixels(gfx::Rect(0, 0, 400, 300));
-
-  EXPECT_EQ(400, root_window->bounds().width());
-  EXPECT_EQ(400, root_window->children()[0]->bounds().width());
-
-  // The AppWindow will close on shutdown.
-}
-
-// Tests that the AppWindows are removed when closed.
-TEST_F(ShellDesktopControllerAuraTest, OnAppWindowClose) {
-  scoped_refptr<Extension> extension = test_util::CreateEmptyExtension();
-  AppWindow* app_window1 = CreateAppWindow(extension.get());
-
-  aura::Window* root_window = controller_->host()->window();
-  EXPECT_EQ(1u, root_window->children().size());
-
-  AppWindow* app_window2 = CreateAppWindow(extension.get());
-  EXPECT_EQ(2u, root_window->children().size());
-
-  app_window1->GetBaseWindow()->Close();
-  app_window1 = nullptr;  // Close() deletes the AppWindow.
-  // The second window is still open.
-  EXPECT_EQ(1u, root_window->children().size());
-
-  app_window2->GetBaseWindow()->Close();
-  app_window2 = nullptr;  // Close() deletes the AppWindow.
-  EXPECT_EQ(0u, root_window->children().size());
-}
-
 // Tests closing all AppWindows.
 TEST_F(ShellDesktopControllerAuraTest, CloseAppWindows) {
+  const AppWindowRegistry* app_window_registry =
+      AppWindowRegistry::Get(browser_context());
   scoped_refptr<Extension> extension = test_util::CreateEmptyExtension();
-  CreateAppWindow(extension.get());
-  CreateAppWindow(extension.get());
-  CreateAppWindow(extension.get());
-
-  aura::Window* root_window = controller_->host()->window();
-  EXPECT_EQ(3u, root_window->children().size());
+  for (int i = 0; i < 3; i++) {
+    InitAppWindow(
+        controller_->CreateAppWindow(browser_context(), extension.get()));
+  }
+  EXPECT_EQ(3u, app_window_registry->app_windows().size());
 
   controller_->CloseAppWindows();
-  EXPECT_EQ(0u, root_window->children().size());
+  EXPECT_EQ(0u, app_window_registry->app_windows().size());
+}
+
+// Tests that the AppWindows are removed when the desktop controller goes away.
+TEST_F(ShellDesktopControllerAuraTest, OnAppWindowClose) {
+  const AppWindowRegistry* app_window_registry =
+      AppWindowRegistry::Get(browser_context());
+  scoped_refptr<Extension> extension = test_util::CreateEmptyExtension();
+  for (int i = 0; i < 3; i++) {
+    InitAppWindow(
+        controller_->CreateAppWindow(browser_context(), extension.get()));
+  }
+  EXPECT_EQ(3u, app_window_registry->app_windows().size());
+
+  // Deleting the controller closes all app windows.
+  controller_.reset();
+  EXPECT_EQ(0u, app_window_registry->app_windows().size());
 }
 
 }  // namespace extensions
diff --git a/extensions/shell/browser/shell_extensions_api_client.cc b/extensions/shell/browser/shell_extensions_api_client.cc
index d1fa28e..2471ef4 100644
--- a/extensions/shell/browser/shell_extensions_api_client.cc
+++ b/extensions/shell/browser/shell_extensions_api_client.cc
@@ -51,4 +51,10 @@
   return messaging_delegate_.get();
 }
 
+FeedbackPrivateDelegate*
+ShellExtensionsAPIClient::GetFeedbackPrivateDelegate() {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
 }  // namespace extensions
diff --git a/extensions/shell/browser/shell_extensions_api_client.h b/extensions/shell/browser/shell_extensions_api_client.h
index 9db406fe..66154af 100644
--- a/extensions/shell/browser/shell_extensions_api_client.h
+++ b/extensions/shell/browser/shell_extensions_api_client.h
@@ -9,6 +9,7 @@
 
 #include "extensions/browser/api/extensions_api_client.h"
 
+#include "base/macros.h"
 #include "build/build_config.h"
 
 namespace extensions {
@@ -31,6 +32,7 @@
   FileSystemDelegate* GetFileSystemDelegate() override;
 #endif
   MessagingDelegate* GetMessagingDelegate() override;
+  FeedbackPrivateDelegate* GetFeedbackPrivateDelegate() override;
 
  private:
 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
diff --git a/extensions/shell/browser/shell_native_app_window.cc b/extensions/shell/browser/shell_native_app_window.cc
index 02c137d..676e20a 100644
--- a/extensions/shell/browser/shell_native_app_window.cc
+++ b/extensions/shell/browser/shell_native_app_window.cc
@@ -131,7 +131,7 @@
   return NULL;
 }
 
-void ShellNativeAppWindow::UpdateShape(std::unique_ptr<SkRegion> region) {
+void ShellNativeAppWindow::UpdateShape(std::unique_ptr<ShapeRects> rects) {
   NOTIMPLEMENTED();
 }
 
diff --git a/extensions/shell/browser/shell_native_app_window.h b/extensions/shell/browser/shell_native_app_window.h
index fcc3f6e..a282a41 100644
--- a/extensions/shell/browser/shell_native_app_window.h
+++ b/extensions/shell/browser/shell_native_app_window.h
@@ -52,7 +52,7 @@
   void UpdateDraggableRegions(
       const std::vector<DraggableRegion>& regions) override;
   SkRegion* GetDraggableRegion() override;
-  void UpdateShape(std::unique_ptr<SkRegion> region) override;
+  void UpdateShape(std::unique_ptr<ShapeRects> rects) override;
   void HandleKeyboardEvent(
       const content::NativeWebKeyboardEvent& event) override;
   bool IsFrameless() const override;
diff --git a/extensions/shell/browser/shell_screen.cc b/extensions/shell/browser/shell_screen.cc
index 3881f0d0..1be0067c 100644
--- a/extensions/shell/browser/shell_screen.cc
+++ b/extensions/shell/browser/shell_screen.cc
@@ -8,9 +8,12 @@
 #include <vector>
 
 #include "base/logging.h"
+#include "extensions/shell/browser/root_window_controller.h"
+#include "extensions/shell/browser/shell_desktop_controller_aura.h"
 #include "ui/aura/env.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_tree_host.h"
+#include "ui/display/display.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/native_widget_types.h"
@@ -22,8 +25,11 @@
 
 }  // namespace
 
-ShellScreen::ShellScreen(const gfx::Size& size) : host_(nullptr) {
+ShellScreen::ShellScreen(ShellDesktopControllerAura* desktop_controller,
+                         const gfx::Size& size)
+    : desktop_controller_(desktop_controller) {
   DCHECK(!size.IsEmpty());
+
   // Screen is positioned at (0,0).
   display::Display display(kDisplayId);
   gfx::Rect bounds(size);
@@ -32,38 +38,17 @@
 }
 
 ShellScreen::~ShellScreen() {
-  DCHECK(!host_) << "Window not closed before destroying ShellScreen";
+  DCHECK(!desktop_controller_ || !desktop_controller_->root_window_controller())
+      << "WindowTreeHost not closed before destroying ShellScreen";
 }
 
-aura::WindowTreeHost* ShellScreen::CreateHostForPrimaryDisplay() {
-  DCHECK(!host_);
-  host_ = aura::WindowTreeHost::Create(
-      gfx::Rect(GetPrimaryDisplay().GetSizeInPixel()));
-  host_->window()->AddObserver(this);
-  host_->InitHost();
-  host_->window()->Show();
-  return host_;
-}
-
-// aura::WindowObserver overrides:
-
-void ShellScreen::OnWindowBoundsChanged(aura::Window* window,
-                                        const gfx::Rect& old_bounds,
-                                        const gfx::Rect& new_bounds) {
-  DCHECK_EQ(host_->window(), window);
-  display::Display display(GetPrimaryDisplay());
-  display.SetSize(new_bounds.size());
+void ShellScreen::OnHostResized(aura::WindowTreeHost* host) {
+  // Based on ash::WindowTreeHostManager.
+  display::Display display = GetDisplayNearestWindow(host->window());
+  display.SetSize(host->GetBoundsInPixels().size());
   display_list().UpdateDisplay(display);
 }
 
-void ShellScreen::OnWindowDestroying(aura::Window* window) {
-  DCHECK_EQ(host_->window(), window);
-  host_->window()->RemoveObserver(this);
-  host_ = nullptr;
-}
-
-// display::Screen overrides:
-
 gfx::Point ShellScreen::GetCursorScreenPoint() {
   return aura::Env::GetInstance()->last_mouse_location();
 }
@@ -73,7 +58,9 @@
 }
 
 gfx::NativeWindow ShellScreen::GetWindowAtScreenPoint(const gfx::Point& point) {
-  return host_->window()->GetEventHandlerForPoint(point);
+  return desktop_controller_->GetPrimaryHost()
+      ->window()
+      ->GetEventHandlerForPoint(point);
 }
 
 display::Display ShellScreen::GetDisplayNearestWindow(
diff --git a/extensions/shell/browser/shell_screen.h b/extensions/shell/browser/shell_screen.h
index 9746212..6d4cb55 100644
--- a/extensions/shell/browser/shell_screen.h
+++ b/extensions/shell/browser/shell_screen.h
@@ -6,7 +6,7 @@
 #define EXTENSIONS_SHELL_BROWSER_SHELL_SCREEN_H_
 
 #include "base/macros.h"
-#include "ui/aura/window_observer.h"
+#include "ui/aura/window_tree_host_observer.h"
 #include "ui/display/display.h"
 #include "ui/display/screen_base.h"
 
@@ -19,23 +19,21 @@
 }
 
 namespace extensions {
+class ShellDesktopControllerAura;
 
 // A minimal Aura implementation of a screen. Scale factor is locked at 1.0.
 // When running on a Linux desktop resizing the main window resizes the screen.
-class ShellScreen : public display::ScreenBase, public aura::WindowObserver {
+class ShellScreen : public display::ScreenBase,
+                    public aura::WindowTreeHostObserver {
  public:
-  // Creates a screen occupying |size| physical pixels.
-  explicit ShellScreen(const gfx::Size& size);
+  // Creates a screen occupying |size| physical pixels. |desktop_controller|
+  // can be null in tests.
+  ShellScreen(ShellDesktopControllerAura* desktop_controller,
+              const gfx::Size& size);
   ~ShellScreen() override;
 
-  // Caller owns the returned object.
-  aura::WindowTreeHost* CreateHostForPrimaryDisplay();
-
-  // WindowObserver overrides:
-  void OnWindowBoundsChanged(aura::Window* window,
-                             const gfx::Rect& old_bounds,
-                             const gfx::Rect& new_bounds) override;
-  void OnWindowDestroying(aura::Window* window) override;
+  // aura::WindowTreeHostObserver overrides:
+  void OnHostResized(aura::WindowTreeHost* host) override;
 
   // display::Screen overrides:
   gfx::Point GetCursorScreenPoint() override;
@@ -45,7 +43,7 @@
       gfx::NativeWindow window) const override;
 
  private:
-  aura::WindowTreeHost* host_;  // Not owned.
+  ShellDesktopControllerAura* const desktop_controller_;
 
   DISALLOW_COPY_AND_ASSIGN(ShellScreen);
 };
diff --git a/extensions/shell/browser/shell_screen_unittest.cc b/extensions/shell/browser/shell_screen_unittest.cc
index 75a5cd16..b3f31bd 100644
--- a/extensions/shell/browser/shell_screen_unittest.cc
+++ b/extensions/shell/browser/shell_screen_unittest.cc
@@ -6,8 +6,8 @@
 
 #include <memory>
 
+#include "extensions/shell/test/shell_test_base_aura.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "ui/aura/test/aura_test_base.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/display/display.h"
@@ -16,11 +16,11 @@
 
 namespace extensions {
 
-using ShellScreenTest = aura::test::AuraTestBase;
+using ShellScreenTest = ShellTestBaseAura;
 
 // Basic sanity tests for ShellScreen.
 TEST_F(ShellScreenTest, ShellScreen) {
-  ShellScreen screen(gfx::Size(640, 480));
+  ShellScreen screen(nullptr, gfx::Size(640, 480));
 
   // There is only one display.
   EXPECT_EQ(1, screen.GetNumDisplays());
@@ -30,13 +30,16 @@
   EXPECT_EQ("640x480", screen.GetPrimaryDisplay().size().ToString());
 
   // Tests that reshaping the host window reshapes the display.
-  // NOTE: AuraTestBase already has its own WindowTreeHost. This is creating a
-  // second one.
-  std::unique_ptr<aura::WindowTreeHost> host(
-      screen.CreateHostForPrimaryDisplay());
+  std::unique_ptr<aura::WindowTreeHost> host(aura::WindowTreeHost::Create(
+      gfx::Rect(screen.GetPrimaryDisplay().GetSizeInPixel())));
+  host->AddObserver(&screen);
+  host->InitHost();
   EXPECT_TRUE(host->window());
-  host->window()->SetBounds(gfx::Rect(0, 0, 800, 600));
+
+  host->SetBoundsInPixels(gfx::Rect(0, 0, 800, 600));
   EXPECT_EQ("800x600", screen.GetPrimaryDisplay().size().ToString());
+
+  host->RemoveObserver(&screen);
 }
 
 }  // namespace extensions
diff --git a/extensions/shell/test/shell_test_base_aura.cc b/extensions/shell/test/shell_test_base_aura.cc
index 20912c5..74e033a 100644
--- a/extensions/shell/test/shell_test_base_aura.cc
+++ b/extensions/shell/test/shell_test_base_aura.cc
@@ -5,9 +5,14 @@
 #include "extensions/shell/test/shell_test_base_aura.h"
 
 #include "base/memory/ptr_util.h"
+#include "content/public/browser/web_contents.h"
 #include "content/public/test/test_browser_thread_bundle.h"
+#include "extensions/browser/app_window/app_window.h"
+#include "extensions/browser/app_window/test_app_window_contents.h"
+#include "extensions/shell/browser/shell_app_delegate.h"
 #include "extensions/shell/test/shell_test_extensions_browser_client.h"
 #include "extensions/shell/test/shell_test_helper_aura.h"
+#include "url/gurl.h"
 
 namespace extensions {
 
@@ -30,4 +35,25 @@
   helper_->TearDown();
 }
 
+void ShellTestBaseAura::InitAppWindow(AppWindow* app_window) {
+  // Create a TestAppWindowContents for the ShellAppDelegate to initialize the
+  // ShellExtensionWebContentsObserver with.
+  std::unique_ptr<content::WebContents> web_contents(
+      content::WebContents::Create(
+          content::WebContents::CreateParams(browser_context())));
+  std::unique_ptr<TestAppWindowContents> app_window_contents =
+      base::MakeUnique<TestAppWindowContents>(std::move(web_contents));
+
+  // Initialize the web contents and AppWindow.
+  app_window->app_delegate()->InitWebContents(
+      app_window_contents->GetWebContents());
+
+  content::RenderFrameHost* main_frame =
+      app_window_contents->GetWebContents()->GetMainFrame();
+  DCHECK(main_frame);
+
+  app_window->Init(GURL(), app_window_contents.release(), main_frame,
+                   AppWindow::CreateParams());
+}
+
 }  // namespace extensions
diff --git a/extensions/shell/test/shell_test_base_aura.h b/extensions/shell/test/shell_test_base_aura.h
index 65d7ef2f..5e9d8e6 100644
--- a/extensions/shell/test/shell_test_base_aura.h
+++ b/extensions/shell/test/shell_test_base_aura.h
@@ -12,6 +12,7 @@
 #include "extensions/browser/extensions_test.h"
 
 namespace extensions {
+class AppWindow;
 class ShellTestHelperAura;
 
 class ShellTestBaseAura : public ExtensionsTest {
@@ -23,6 +24,9 @@
   void SetUp() override;
   void TearDown() override;
 
+  // Initializes |app_window| for testing.
+  void InitAppWindow(AppWindow* app_window);
+
  private:
   std::unique_ptr<ShellTestHelperAura> helper_;
 
diff --git a/extensions/utility/utility_handler.cc b/extensions/utility/utility_handler.cc
index 250330f..320e1fba 100644
--- a/extensions/utility/utility_handler.cc
+++ b/extensions/utility/utility_handler.cc
@@ -4,8 +4,14 @@
 
 #include "extensions/utility/utility_handler.h"
 
+#include <memory>
+#include <string>
+#include <utility>
+
 #include "base/command_line.h"
 #include "base/files/file_path.h"
+#include "base/location.h"
+#include "base/task_scheduler/post_task.h"
 #include "content/public/utility/utility_thread.h"
 #include "extensions/common/constants.h"
 #include "extensions/common/extension_l10n_util.h"
@@ -27,6 +33,33 @@
 
 namespace {
 
+struct UnpackResult {
+  std::unique_ptr<base::DictionaryValue> parsed_manifest;
+  base::string16 error;
+};
+
+// Unpacks the extension on background task runner.
+// On success, returns UnpackResult with |parsed_manifest| set to the parsed
+// extension manifest.
+// On failure returns UnpackResult with |error| set to the encountered error
+// message.
+UnpackResult UnpackOnBackgroundTaskRunner(const base::FilePath& path,
+                                          const std::string& extension_id,
+                                          Manifest::Location location,
+                                          int32_t creation_flags) {
+  Unpacker unpacker(path.DirName(), path, extension_id, location,
+                    creation_flags);
+
+  UnpackResult result;
+  if (unpacker.Run()) {
+    result.parsed_manifest = unpacker.TakeParsedManifest();
+  } else {
+    result.error = unpacker.error_message();
+  }
+
+  return result;
+}
+
 class ExtensionUnpackerImpl : public extensions::mojom::ExtensionUnpacker {
  public:
   ExtensionUnpackerImpl() = default;
@@ -42,13 +75,19 @@
   void Unzip(const base::FilePath& file,
              const base::FilePath& path,
              UnzipCallback callback) override {
-    std::unique_ptr<base::DictionaryValue> manifest;
-    if (UnzipFileManifestIntoPath(file, path, &manifest)) {
-      std::move(callback).Run(
-          UnzipFileIntoPath(file, path, std::move(manifest)));
-    } else {
-      std::move(callback).Run(false);
-    }
+    // Move unzip operation to background thread to avoid blocking the main
+    // utility thread for extended amont of time. For example, this prevents
+    // extension unzipping block receipt of the connection complete
+    // notification for the utility process channel to the browser process,
+    // which could cause the utility process to terminate itself due to browser
+    // process being considered unreachable.
+    base::PostTaskWithTraitsAndReplyWithResult(
+        FROM_HERE,
+        {base::TaskPriority::USER_BLOCKING, base::MayBlock(),
+         base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
+        base::BindOnce(&ExtensionUnpackerImpl::UnzipOnBackgroundTaskRunner,
+                       file, path),
+        std::move(callback));
   }
 
   void Unpack(version_info::Channel channel,
@@ -68,13 +107,20 @@
     SetCurrentChannel(channel);
     SetCurrentFeatureSessionType(type);
 
-    Unpacker unpacker(path.DirName(), path, extension_id, location,
-                      creation_flags);
-    if (unpacker.Run()) {
-      std::move(callback).Run(base::string16(), unpacker.TakeParsedManifest());
-    } else {
-      std::move(callback).Run(unpacker.error_message(), nullptr);
-    }
+    // Move unpack operation to background thread to prevent it from blocking
+    // the utility process thread for extended amount of time.
+    base::PostTaskWithTraitsAndReplyWithResult(
+        FROM_HERE,
+        {base::TaskPriority::USER_BLOCKING, base::MayBlock(),
+         base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
+        base::BindOnce(&UnpackOnBackgroundTaskRunner, path, extension_id,
+                       location, creation_flags),
+        base::BindOnce(
+            [](UnpackCallback callback, UnpackResult result) {
+              std::move(callback).Run(result.error,
+                                      std::move(result.parsed_manifest));
+            },
+            std::move(callback)));
   }
 
   static bool UnzipFileManifestIntoPath(
@@ -104,6 +150,17 @@
         true /* log_skipped_files */);
   }
 
+  // Unzips the extension from |file| to |path|.
+  // Returns whether the unzip operation succeeded.
+  static bool UnzipOnBackgroundTaskRunner(const base::FilePath& file,
+                                          const base::FilePath& path) {
+    std::unique_ptr<base::DictionaryValue> manifest;
+    if (!UnzipFileManifestIntoPath(file, path, &manifest))
+      return false;
+
+    return UnzipFileIntoPath(file, path, std::move(manifest));
+  }
+
   DISALLOW_COPY_AND_ASSIGN(ExtensionUnpackerImpl);
 };
 
diff --git a/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc b/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc
index a87bd304..0f40e912 100644
--- a/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc
+++ b/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc
@@ -22,6 +22,7 @@
     case gfx::BufferUsage::GPU_READ:
     case gfx::BufferUsage::SCANOUT:
     case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
+    case gfx::BufferUsage::SCANOUT_VDA_WRITE:
     case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT:
       return 0;
   }
diff --git a/gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.cc b/gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.cc
index d138b1d..3deb043 100644
--- a/gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.cc
+++ b/gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.cc
@@ -102,6 +102,7 @@
     case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
       return true;
     case gfx::BufferUsage::SCANOUT:
+    case gfx::BufferUsage::SCANOUT_VDA_WRITE:
       return false;
   }
   NOTREACHED();
diff --git a/gpu/ipc/client/gpu_memory_buffer_impl_test_template.h b/gpu/ipc/client/gpu_memory_buffer_impl_test_template.h
index af67695c..fb7b8911 100644
--- a/gpu/ipc/client/gpu_memory_buffer_impl_test_template.h
+++ b/gpu/ipc/client/gpu_memory_buffer_impl_test_template.h
@@ -52,8 +52,10 @@
 
   for (auto format : gfx::GetBufferFormatsForTesting()) {
     gfx::BufferUsage usages[] = {
-        gfx::BufferUsage::GPU_READ, gfx::BufferUsage::SCANOUT,
+        gfx::BufferUsage::GPU_READ,
+        gfx::BufferUsage::SCANOUT,
         gfx::BufferUsage::SCANOUT_CPU_READ_WRITE,
+        gfx::BufferUsage::SCANOUT_VDA_WRITE,
         gfx::BufferUsage::GPU_READ_CPU_READ_WRITE,
         gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT};
     for (auto usage : usages) {
diff --git a/gpu/ipc/common/gpu_memory_buffer_support.cc b/gpu/ipc/common/gpu_memory_buffer_support.cc
index 77f98359..c673968 100644
--- a/gpu/ipc/common/gpu_memory_buffer_support.cc
+++ b/gpu/ipc/common/gpu_memory_buffer_support.cc
@@ -42,6 +42,8 @@
              format == gfx::BufferFormat::RGBA_F16 ||
              format == gfx::BufferFormat::UYVY_422 ||
              format == gfx::BufferFormat::YUV_420_BIPLANAR;
+    case gfx::BufferUsage::SCANOUT_VDA_WRITE:
+      return false;
   }
   NOTREACHED();
   return false;
diff --git a/gpu/ipc/host/gpu_memory_buffer_support.cc b/gpu/ipc/host/gpu_memory_buffer_support.cc
index 813f339..989f92f 100644
--- a/gpu/ipc/host/gpu_memory_buffer_support.cc
+++ b/gpu/ipc/host/gpu_memory_buffer_support.cc
@@ -74,7 +74,8 @@
         gfx::BufferFormat::YVU_420,   gfx::BufferFormat::YUV_420_BIPLANAR};
     const gfx::BufferUsage kGPUReadWriteUsages[] = {
         gfx::BufferUsage::GPU_READ, gfx::BufferUsage::SCANOUT,
-        gfx::BufferUsage::SCANOUT_CPU_READ_WRITE};
+        gfx::BufferUsage::SCANOUT_CPU_READ_WRITE,
+        gfx::BufferUsage::SCANOUT_VDA_WRITE};
     for (auto format : kGPUReadWriteFormats) {
       for (auto usage : kGPUReadWriteUsages) {
         if (IsNativeGpuMemoryBufferConfigurationSupported(format, usage))
diff --git a/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h b/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h
index 4d0ed2d..4e1095c 100644
--- a/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h
+++ b/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h
@@ -31,8 +31,10 @@
 
   for (auto format : gfx::GetBufferFormatsForTesting()) {
     gfx::BufferUsage usages[] = {
-        gfx::BufferUsage::GPU_READ, gfx::BufferUsage::SCANOUT,
+        gfx::BufferUsage::GPU_READ,
+        gfx::BufferUsage::SCANOUT,
         gfx::BufferUsage::SCANOUT_CPU_READ_WRITE,
+        gfx::BufferUsage::SCANOUT_VDA_WRITE,
         gfx::BufferUsage::GPU_READ_CPU_READ_WRITE,
         gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT};
     for (auto usage : usages) {
diff --git a/headless/BUILD.gn b/headless/BUILD.gn
index 91987a4..d2a644d 100644
--- a/headless/BUILD.gn
+++ b/headless/BUILD.gn
@@ -223,7 +223,7 @@
   extra_deps = [ ":gen_devtools_client_api" ]
 }
 
-if (headless_fontconfig_utils) {
+if (headless_fontconfig_utils && !is_fuchsia) {
   static_library("headless_fontconfig_utils") {
     sources = [
       "public/util/fontconfig.cc",
@@ -280,8 +280,6 @@
     "lib/browser/headless_window_tree_host.h",
     "lib/headless_content_client.cc",
     "lib/headless_content_client.h",
-    "lib/headless_crash_reporter_client.cc",
-    "lib/headless_crash_reporter_client.h",
     "public/headless_browser.cc",
     "public/headless_browser.h",
     "public/headless_browser_context.h",
@@ -323,6 +321,13 @@
     "public/util/user_agent.h",
   ]
 
+  if (!is_fuchsia) {
+    sources += [
+      "lib/headless_crash_reporter_client.cc",
+      "lib/headless_crash_reporter_client.h",
+    ]
+  }
+
   sources += generated_devtools_api
 
   if (use_aura) {
@@ -391,11 +396,14 @@
     ]
 
     deps += [
-      "//components/crash/content/browser",
       "//components/security_state/content",
       "//third_party/WebKit/public:blink_headers",
     ]
 
+    if (!is_fuchsia) {
+      deps += [ "//components/crash/content/browser" ]
+    }
+
     if (enable_basic_printing) {
       deps += [
         "//components/printing/browser",
@@ -404,13 +412,6 @@
     }
   }
 
-  if (is_fuchsia) {
-    sources -= [
-      "lib/headless_crash_reporter_client.cc",
-      "lib/headless_crash_reporter_client.h",
-    ]
-  }
-
   if (is_mac) {
     deps += [ ":mac_helpers" ]
   } else {
@@ -431,7 +432,7 @@
     deps += [ "//ui/ozone" ]
   }
 
-  if (headless_fontconfig_utils) {
+  if (headless_fontconfig_utils && !is_fuchsia) {
     deps += [ ":headless_fontconfig_utils" ]
   }
 
@@ -510,7 +511,6 @@
     ":headless_renderer",
     "//base/test:run_all_unittests",
     "//base/test:test_support",
-    "//components/crash/content/browser",
     "//components/security_state/content",
     "//content/public/app:both",
     "//content/public/child:child",
@@ -519,14 +519,14 @@
     "//testing/gtest",
   ]
 
+  if (!is_fuchsia) {
+    deps += [ "//components/crash/content/browser" ]
+  }
+
   if (enable_basic_printing) {
     sources += [ "lib/browser/headless_printing_unittest.cc" ]
     deps += [ "//components/printing/browser" ]
   }
-
-  if (is_fuchsia) {
-    deps -= [ "//components/crash/content/browser" ]
-  }
 }
 
 if (is_mac) {
@@ -655,13 +655,16 @@
   deps = [
     ":headless_renderer",
     "//base",
-    "//components/crash/content/browser",
     "//components/security_state/content",
     "//content/test:test_support",
     "//testing/gmock",
     "//testing/gtest",
   ]
 
+  if (!is_fuchsia) {
+    deps += [ "//components/crash/content/browser" ]
+  }
+
   # Only include this if we built the js_binary
   if (is_linux) {
     data += [ "$root_out_dir/headless_browser_tests.pak" ]
@@ -675,10 +678,6 @@
       "//pdf",
     ]
   }
-
-  if (is_fuchsia) {
-    deps -= [ "//components/crash/content/browser" ]
-  }
 }
 
 if (is_win) {
@@ -774,7 +773,6 @@
 
   deps = [
     ":headless_renderer",
-    "//components/crash/content/browser",
     "//components/security_state/content",
     "//content/public/app:both",
     "//content/public/browser",
@@ -782,6 +780,10 @@
     "//content/public/common",
   ]
 
+  if (!is_fuchsia) {
+    deps += [ "//components/crash/content/browser" ]
+  }
+
   if (enable_basic_printing) {
     deps += [
       "//components/printing/browser",
@@ -798,10 +800,6 @@
       "//sandbox",
     ]
   }
-
-  if (is_fuchsia) {
-    deps -= [ "//components/crash/content/browser" ]
-  }
 }
 
 if (is_fuchsia) {
diff --git a/infra/config/cq.cfg b/infra/config/cq.cfg
index eec7f9105..70f103d 100644
--- a/infra/config/cq.cfg
+++ b/infra/config/cq.cfg
@@ -50,7 +50,7 @@
       builders { name: "chromium_presubmit" }
       builders {
         name: "fuchsia_compile"
-        experiment_percentage: 10
+        experiment_percentage: 100
       }
       builders { name: "linux_chromium_asan_rel_ng" }
       builders { name: "linux_chromium_chromeos_rel_ng" }
diff --git a/ios/OWNERS b/ios/OWNERS
index a5fae73..839f864 100644
--- a/ios/OWNERS
+++ b/ios/OWNERS
@@ -11,3 +11,6 @@
 # These are for the common case of adding or renaming files. If you're doing
 # structural changes, please get a review from a reviewer in this file.
 per-file BUILD.gn=*
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/build/OWNERS b/ios/build/OWNERS
index ae82009..ba9c65db 100644
--- a/ios/build/OWNERS
+++ b/ios/build/OWNERS
@@ -1,2 +1,5 @@
 rohitrao@chromium.org
 sdefresne@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/build/bots/OWNERS b/ios/build/bots/OWNERS
index 7466a7b..bab986314 100644
--- a/ios/build/bots/OWNERS
+++ b/ios/build/bots/OWNERS
@@ -3,3 +3,6 @@
 rohitrao@chromium.org
 sdefresne@chromium.org
 smut@google.com
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/build/bots/chromium.fyi/ClangToTiOS.json b/ios/build/bots/chromium.fyi/ClangToTiOS.json
index 2b5ab01..d8b662f8 100644
--- a/ios/build/bots/chromium.fyi/ClangToTiOS.json
+++ b/ios/build/bots/chromium.fyi/ClangToTiOS.json
@@ -8,6 +8,7 @@
     "is_component_build=false",
     "is_debug=false",
     "llvm_force_head_revision=true",
+    "additional_target_cpus=[\"arm64\",\"x64\",\"x86\"]",
     "target_cpu=\"arm\"",
     "target_os=\"ios\""
   ],
diff --git a/ios/build/bots/scripts/OWNERS b/ios/build/bots/scripts/OWNERS
index 1faa6041..eacf766 100644
--- a/ios/build/bots/scripts/OWNERS
+++ b/ios/build/bots/scripts/OWNERS
@@ -2,3 +2,6 @@
 baxley@chromium.org
 sergeyberezin@chromium.org
 smut@google.com
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/OWNERS b/ios/chrome/OWNERS
index df13981..1a9f1a2 100644
--- a/ios/chrome/OWNERS
+++ b/ios/chrome/OWNERS
@@ -12,3 +12,6 @@
 per-file ios_share_extension_resources.gyp=*
 per-file ios_today_extension_resources.gyp=*
 per-file ios_today_extension_resources_bundle.gypi=*
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/app/BUILD.gn b/ios/chrome/app/BUILD.gn
index 567b08f..96ab0ee2 100644
--- a/ios/chrome/app/BUILD.gn
+++ b/ios/chrome/app/BUILD.gn
@@ -153,6 +153,7 @@
     "//components/keyed_service/ios",
     "//components/metrics",
     "//components/ntp_snippets",
+    "//components/payments/core",
     "//components/prefs",
     "//components/proxy_config",
     "//components/signin/core/browser",
@@ -189,6 +190,7 @@
     "//ios/chrome/browser/net",
     "//ios/chrome/browser/ntp_snippets",
     "//ios/chrome/browser/omaha",
+    "//ios/chrome/browser/payments",
     "//ios/chrome/browser/prefs",
     "//ios/chrome/browser/reading_list",
     "//ios/chrome/browser/search_engines",
diff --git a/ios/chrome/app/DEPS b/ios/chrome/app/DEPS
index 522a5e99..e52ccc7 100644
--- a/ios/chrome/app/DEPS
+++ b/ios/chrome/app/DEPS
@@ -14,6 +14,7 @@
   "+components/history/core/browser",
   "+components/metrics",
   "+components/ntp_snippets",
+  "+components/payments/core",
   "+components/prefs",
   "+components/reading_list/core",
   "+components/signin/core/browser",
diff --git a/ios/chrome/app/OWNERS b/ios/chrome/app/OWNERS
index 9e2503a..cb182dd 100644
--- a/ios/chrome/app/OWNERS
+++ b/ios/chrome/app/OWNERS
@@ -1,2 +1,5 @@
 marq@chromium.org
 rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/app/application_delegate/BUILD.gn b/ios/chrome/app/application_delegate/BUILD.gn
index d984b504..6f346ea 100644
--- a/ios/chrome/app/application_delegate/BUILD.gn
+++ b/ios/chrome/app/application_delegate/BUILD.gn
@@ -100,6 +100,7 @@
     "//components/feature_engagement",
     "//components/handoff",
     "//components/metrics",
+    "//components/payments/core",
     "//components/prefs",
     "//ios/chrome/app",
     "//ios/chrome/app/safe_mode",
@@ -114,6 +115,7 @@
     "//ios/chrome/browser/metrics",
     "//ios/chrome/browser/metrics:metrics_internal",
     "//ios/chrome/browser/net",
+    "//ios/chrome/browser/payments",
     "//ios/chrome/browser/tabs",
     "//ios/chrome/browser/u2f",
     "//ios/chrome/browser/ui",
diff --git a/ios/chrome/app/application_delegate/OWNERS b/ios/chrome/app/application_delegate/OWNERS
index f49ed38..01e8c98 100644
--- a/ios/chrome/app/application_delegate/OWNERS
+++ b/ios/chrome/app/application_delegate/OWNERS
@@ -1 +1,4 @@
 marq@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/app/application_delegate/app_state.mm b/ios/chrome/app/application_delegate/app_state.mm
index 17c365a6..2072d63 100644
--- a/ios/chrome/app/application_delegate/app_state.mm
+++ b/ios/chrome/app/application_delegate/app_state.mm
@@ -357,13 +357,18 @@
                           startupInformation:_startupInformation
                       browserViewInformation:[_browserLauncher
                                                  browserViewInformation]];
-  } else if (_shouldOpenNTPTabOnActive &&
-             ![tabSwitcher openNewTabFromTabSwitcher]) {
-    BrowserViewController* bvc =
-        [[_browserLauncher browserViewInformation] currentBVC];
-    BOOL incognito = bvc == [[_browserLauncher browserViewInformation] otrBVC];
-    [bvc.dispatcher
-        openNewTab:[OpenNewTabCommand commandWithIncognito:incognito]];
+  } else if (_shouldOpenNTPTabOnActive) {
+    if (![tabSwitcher openNewTabFromTabSwitcher]) {
+      BrowserViewController* bvc =
+          [[_browserLauncher browserViewInformation] currentBVC];
+      BOOL incognito =
+          bvc == [[_browserLauncher browserViewInformation] otrBVC];
+      [bvc.dispatcher
+          openNewTab:[OpenNewTabCommand commandWithIncognito:incognito]];
+    }
+  } else {
+    [[[_browserLauncher browserViewInformation] currentBVC]
+        presentBubblesIfEligible];
   }
   _shouldOpenNTPTabOnActive = NO;
 
diff --git a/ios/chrome/app/application_delegate/mock_tab_opener.mm b/ios/chrome/app/application_delegate/mock_tab_opener.mm
index e41a08d..ca19a67 100644
--- a/ios/chrome/app/application_delegate/mock_tab_opener.mm
+++ b/ios/chrome/app/application_delegate/mock_tab_opener.mm
@@ -50,4 +50,10 @@
   return nil;
 }
 
+- (BOOL)shouldCompletePaymentRequestOnCurrentTab:
+    (id<StartupInformation>)startupInformation {
+  // Stub.
+  return NO;
+}
+
 @end
diff --git a/ios/chrome/app/application_delegate/tab_opening.h b/ios/chrome/app/application_delegate/tab_opening.h
index ff5ae8d..2d83df9 100644
--- a/ios/chrome/app/application_delegate/tab_opening.h
+++ b/ios/chrome/app/application_delegate/tab_opening.h
@@ -41,6 +41,11 @@
 - (ProceduralBlock)completionBlockForTriggeringAction:
     (NTPTabOpeningPostOpeningAction)action;
 
+// Attempts to complete a Payment Request flow with a payment response from a
+// a third party app. Returns whether or not this operation was successful.
+- (BOOL)shouldCompletePaymentRequestOnCurrentTab:
+    (id<StartupInformation>)startupInformation;
+
 @end
 
 #endif  // IOS_CHROME_APP_APPLICATION_DELEGATE_TAB_OPENING_H_
diff --git a/ios/chrome/app/application_delegate/user_activity_handler.mm b/ios/chrome/app/application_delegate/user_activity_handler.mm
index 3dcee1f..784ee54 100644
--- a/ios/chrome/app/application_delegate/user_activity_handler.mm
+++ b/ios/chrome/app/application_delegate/user_activity_handler.mm
@@ -17,6 +17,7 @@
 #import "ios/chrome/app/application_delegate/startup_information.h"
 #import "ios/chrome/app/application_delegate/tab_opening.h"
 #include "ios/chrome/app/application_mode.h"
+#include "ios/chrome/app/chrome_app_startup_parameters.h"
 #import "ios/chrome/app/spotlight/actions_spotlight_manager.h"
 #import "ios/chrome/app/spotlight/spotlight_util.h"
 #include "ios/chrome/browser/app_startup_parameters.h"
@@ -42,6 +43,7 @@
 NSString* const kShortcutNewIncognitoTab = @"OpenIncognitoTab";
 NSString* const kShortcutVoiceSearch = @"OpenVoiceSearch";
 NSString* const kShortcutQRScanner = @"OpenQRScanner";
+
 }  // namespace
 
 @interface UserActivityHandler ()
@@ -73,15 +75,21 @@
                               handoff::ORIGIN_COUNT);
   } else if ([userActivity.activityType
                  isEqualToString:NSUserActivityTypeBrowsingWeb]) {
-    // App was launched as the result of a Universal Link navigation. The value
-    // of userActivity.webpageURL is not used. The only supported action
-    // at this time is opening a New Tab Page.
-    GURL newTabURL(kChromeUINewTabURL);
-    webpageURL = net::NSURLWithGURL(newTabURL);
+    // App was launched as the result of a Universal Link navigation.
+    GURL gurl = net::GURLWithNSURL(webpageURL);
     AppStartupParameters* startupParams =
-        [[AppStartupParameters alloc] initWithExternalURL:newTabURL];
+        [[AppStartupParameters alloc] initWithUniversalLink:gurl];
     [startupInformation setStartupParameters:startupParams];
     base::RecordAction(base::UserMetricsAction("IOSLaunchedByUniversalLink"));
+
+    if (startupParams)
+      webpageURL = net::NSURLWithGURL([startupParams externalURL]);
+
+    // Don't call continueUserActivityURL if the completePaymentRequest flag
+    // is set since the startup parameters need to be handled in
+    // -handleStartupParametersWithTabOpener:
+    if (startupParams && startupParams.completePaymentRequest)
+      return YES;
   } else if (spotlight::IsSpotlightAvailable() &&
              [userActivity.activityType
                  isEqualToString:CSSearchableItemActionType]) {
@@ -226,6 +234,13 @@
     // synchronously.
     [startupInformation setStartupParameters:nil];
   } else {
+    // Depending on the startup parameters the user may need to stay on the
+    // current tab rather than open a new one in order to complete a Payment
+    // Request. This attempts to complete any Payment Request instances on
+    // the current tab, and returns if successful.
+    if ([tabOpener shouldCompletePaymentRequestOnCurrentTab:startupInformation])
+      return;
+
     // The app is already active so the applicationDidBecomeActive: method
     // will never be called. Open the requested URL after all modal UIs have
     // been dismissed. |_startupParameters| must be retained until all deferred
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm
index 546e267..5c080ae2 100644
--- a/ios/chrome/app/main_controller.mm
+++ b/ios/chrome/app/main_controller.mm
@@ -13,6 +13,7 @@
 
 #include "base/bind.h"
 #include "base/callback_helpers.h"
+#include "base/feature_list.h"
 #include "base/files/file_path.h"
 #include "base/ios/block_types.h"
 #import "base/mac/bind_objc_block.h"
@@ -29,6 +30,7 @@
 #include "components/feature_engagement/public/tracker.h"
 #include "components/metrics/metrics_pref_names.h"
 #include "components/metrics/metrics_service.h"
+#include "components/payments/core/features.h"
 #include "components/prefs/pref_change_registrar.h"
 #include "components/signin/core/browser/signin_manager.h"
 #include "components/url_formatter/url_formatter.h"
@@ -83,6 +85,8 @@
 #import "ios/chrome/browser/metrics/previous_session_info.h"
 #import "ios/chrome/browser/net/cookie_util.h"
 #include "ios/chrome/browser/net/crl_set_fetcher.h"
+#include "ios/chrome/browser/payments/ios_payment_instrument_launcher.h"
+#include "ios/chrome/browser/payments/ios_payment_instrument_launcher_factory.h"
 #include "ios/chrome/browser/pref_names.h"
 #include "ios/chrome/browser/prefs/pref_observer_bridge.h"
 #import "ios/chrome/browser/reading_list/reading_list_download_service.h"
@@ -141,6 +145,7 @@
 #include "ios/web/net/request_tracker_impl.h"
 #include "ios/web/net/web_http_protocol_handler_delegate.h"
 #import "ios/web/public/navigation_manager.h"
+#include "ios/web/public/payments/payment_request.h"
 #include "ios/web/public/web_capabilities.h"
 #include "ios/web/public/web_state/web_state.h"
 #import "ios/web/public/web_view_creation_util.h"
@@ -2375,6 +2380,40 @@
   }
 }
 
+- (BOOL)shouldCompletePaymentRequestOnCurrentTab:
+    (id<StartupInformation>)startupInformation {
+  if (!startupInformation.startupParameters)
+    return NO;
+
+  if (!startupInformation.startupParameters.completePaymentRequest)
+    return NO;
+
+  if (!base::FeatureList::IsEnabled(payments::features::kWebPaymentsNativeApps))
+    return NO;
+
+  payments::IOSPaymentInstrumentLauncher* paymentAppLauncher =
+      payments::IOSPaymentInstrumentLauncherFactory::GetInstance()
+          ->GetForBrowserState(_mainBrowserState);
+
+  if (!paymentAppLauncher->delegate())
+    return NO;
+
+  std::string payment_id =
+      startupInformation.startupParameters.externalURLParams
+          .find(web::kPaymentRequestIDExternal)
+          ->second;
+  if (paymentAppLauncher->payment_request_id() != payment_id)
+    return NO;
+
+  std::string payment_response =
+      startupInformation.startupParameters.externalURLParams
+          .find(web::kPaymentRequestDataExternal)
+          ->second;
+  paymentAppLauncher->ReceiveResponseFromIOSPaymentInstrument(payment_response);
+  [startupInformation setStartupParameters:nil];
+  return YES;
+}
+
 #pragma mark - SettingsNavigationControllerDelegate
 
 - (void)closeSettings {
diff --git a/ios/chrome/app/spotlight/OWNERS b/ios/chrome/app/spotlight/OWNERS
index 3ebff38d..56360bb 100644
--- a/ios/chrome/app/spotlight/OWNERS
+++ b/ios/chrome/app/spotlight/OWNERS
@@ -1 +1,4 @@
 olivierrobin@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/app/strings/OWNERS b/ios/chrome/app/strings/OWNERS
index 69a98a6..8c38e91 100644
--- a/ios/chrome/app/strings/OWNERS
+++ b/ios/chrome/app/strings/OWNERS
@@ -1,2 +1,5 @@
 per-file *.grd=*
 per-file *.xtb=*
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index eb48d60..439ffa0 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -737,6 +737,9 @@
       <message name="IDS_IOS_NET_EXPORT_NO_EMAIL_ACCOUNTS_ALERT_TITLE" desc="The title of the alert informing a user with no email accounts that they need to configure an email account to send net-export data. [Length: 20em]">
         No Email Accounts
       </message>
+      <message name="IDS_IOS_NEW_INCOGNITO_TAB_IPH_PROMOTION_TEXT" desc="Text for the New Incognito Tab Tip in-product help promotion, explaining that incognito tabs can be used to browse privately. [iOS only]" meaning="The user has never created an incognito tab before. A bubble is displayed pointing to the tools menu button and informing users about how to use incognito mode.">
+        To browse privately, open an incognito tab
+      </message>
       <message name="IDS_IOS_NEW_TAB_BOOKMARKS_PAGE_TITLE_MOBILE" desc="The 'Bookmarks' title on the new tab page [Length: 10em]">
         Bookmarks
       </message>
diff --git a/ios/chrome/app/theme/OWNERS b/ios/chrome/app/theme/OWNERS
index 40a68c7..b127701 100644
--- a/ios/chrome/app/theme/OWNERS
+++ b/ios/chrome/app/theme/OWNERS
@@ -1 +1,4 @@
 rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/BUILD.gn b/ios/chrome/browser/BUILD.gn
index 6fefea52..397f9e28 100644
--- a/ios/chrome/browser/BUILD.gn
+++ b/ios/chrome/browser/BUILD.gn
@@ -217,6 +217,7 @@
   configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
   sources = [
+    "app_startup_parameters_unittest.mm",
     "callback_counter_unittest.mm",
     "chrome_browser_provider_observer_bridge_unittest.mm",
     "chrome_url_util_unittest.mm",
diff --git a/ios/chrome/browser/OWNERS b/ios/chrome/browser/OWNERS
index def1e2a..0adc841 100644
--- a/ios/chrome/browser/OWNERS
+++ b/ios/chrome/browser/OWNERS
@@ -4,3 +4,6 @@
 per-file ios_chrome_io_thread*=rsleevi@chromium.org
 
 per-file ios_chrome_flag_descriptions.*=*
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/app_startup_parameters.h b/ios/chrome/browser/app_startup_parameters.h
index 547a79ea..165fdef4 100644
--- a/ios/chrome/browser/app_startup_parameters.h
+++ b/ios/chrome/browser/app_startup_parameters.h
@@ -7,6 +7,8 @@
 
 #import <Foundation/Foundation.h>
 
+#include <map>
+
 enum NTPTabOpeningPostOpeningAction {
   // No action should be done
   NO_ACTION = 0,
@@ -22,9 +24,18 @@
 // of launch from another app.
 @interface AppStartupParameters : NSObject
 
-// The URL received that should be opened.
+// The URL that should be opened. This may not always be the same URL as the one
+// that was receieved. The reason for this is in the case of Universal Link
+// navigation where we may want to open up a fallback URL e.g., the New Tab
+// Page instead of the actual universal link.
 @property(nonatomic, readonly, assign) const GURL& externalURL;
 
+// The URL query string parameters in the case that the app was launched as a
+// result of Universal Link navigation. The map associates query string
+// parameters with their corresponding value.
+@property(nonatomic, assign) std::map<std::string, std::string>
+    externalURLParams;
+
 //// Boolean to track if a voice search is requested at startup.
 //@property(nonatomic, readwrite, assign) BOOL launchVoiceSearch;
 // Boolean to track if the app should launch in incognito mode.
@@ -35,12 +46,16 @@
 //@property(nonatomic, readwrite, assign) BOOL launchQRScanner;
 @property(nonatomic, readwrite, assign)
     NTPTabOpeningPostOpeningAction postOpeningAction;
+// Boolean to track if a Payment Request response is requested at startup.
+@property(nonatomic, readwrite, assign) BOOL completePaymentRequest;
 
 - (instancetype)init NS_UNAVAILABLE;
 
 - (instancetype)initWithExternalURL:(const GURL&)externalURL
     NS_DESIGNATED_INITIALIZER;
 
+- (instancetype)initWithUniversalLink:(const GURL&)universalLink;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_APP_STARTUP_PARAMETERS_H_
diff --git a/ios/chrome/browser/app_startup_parameters.mm b/ios/chrome/browser/app_startup_parameters.mm
index 742ca53..1e20047 100644
--- a/ios/chrome/browser/app_startup_parameters.mm
+++ b/ios/chrome/browser/app_startup_parameters.mm
@@ -4,6 +4,11 @@
 
 #import "ios/chrome/browser/app_startup_parameters.h"
 
+#include "base/stl_util.h"
+#include "ios/chrome/browser/chrome_url_constants.h"
+#include "ios/web/public/payments/payment_request.h"
+#import "net/base/mac/url_conversions.h"
+#include "net/base/url_util.h"
 #include "url/gurl.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -14,8 +19,10 @@
   GURL _externalURL;
 }
 
+@synthesize externalURLParams = _externalURLParams;
 @synthesize postOpeningAction = _postOpeningAction;
 @synthesize launchInIncognito = _launchInIncognito;
+@synthesize completePaymentRequest = _completePaymentRequest;
 
 - (const GURL&)externalURL {
   return _externalURL;
@@ -29,6 +36,32 @@
   return self;
 }
 
+- (instancetype)initWithUniversalLink:(const GURL&)universalLink {
+  // If a new tab with |_externalURL| needs to be opened after the App
+  // was launched as the result of a Universal Link navigation, the only
+  // supported possibility at this time is the New Tab Page.
+  self = [self initWithExternalURL:GURL(kChromeUINewTabURL)];
+
+  if (self) {
+    std::map<std::string, std::string> parameters;
+    net::QueryIterator query_iterator(universalLink);
+    while (!query_iterator.IsAtEnd()) {
+      parameters.insert(std::make_pair(query_iterator.GetKey(),
+                                       query_iterator.GetUnescapedValue()));
+      query_iterator.Advance();
+    }
+
+    // Currently only Payment Request parameters are supported.
+    if (base::ContainsKey(parameters, web::kPaymentRequestIDExternal) &&
+        base::ContainsKey(parameters, web::kPaymentRequestDataExternal)) {
+      _externalURLParams = parameters;
+      _completePaymentRequest = YES;
+    }
+  }
+
+  return self;
+}
+
 - (NSString*)description {
   NSMutableString* description =
       [NSMutableString stringWithFormat:@"AppStartupParameters: %s",
@@ -51,6 +84,10 @@
       break;
   }
 
+  if (self.completePaymentRequest) {
+    [description appendString:@", should complete payment request"];
+  }
+
   return description;
 }
 
diff --git a/ios/chrome/browser/app_startup_parameters_unittest.mm b/ios/chrome/browser/app_startup_parameters_unittest.mm
new file mode 100644
index 0000000..953fe04
--- /dev/null
+++ b/ios/chrome/browser/app_startup_parameters_unittest.mm
@@ -0,0 +1,61 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ios/chrome/browser/app_startup_parameters.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+namespace {
+
+struct UniversalLinkDecodeTestCase {
+  GURL universal_link;
+  std::map<std::string, std::string> expected_external_url_params;
+  bool expected_complete_payment_request;
+};
+
+TEST(AppStartupParameters, QueryParametersPaymentRequest) {
+  const UniversalLinkDecodeTestCase test_cases[] = {
+      {
+          GURL("https://goo.gl/ioschrome/"), {}, false,
+      },
+      {
+          GURL("https://goo.gl/ioschrome?payment-request-id"), {}, false,
+      },
+      {
+          GURL("https://goo.gl/ioschrome?payment-request-id=092831-af18l-324"
+               "&payment-request-data="),
+          {{"payment-request-id", "092831-af18l-324"},
+           {"payment-request-data", ""}},
+          true,
+      },
+      {
+          GURL("https://goo.gl/ioschrome?payment-request-id=092831-af18l-324"
+               "&payment-request-data=JNLSKFknrlwe80dkzrnLEWR"),
+          {{"payment-request-id", "092831-af18l-324"},
+           {"payment-request-data", "JNLSKFknrlwe80dkzrnLEWR"}},
+          true,
+      },
+      {
+          GURL("https://goo.gl/ioschrome?payment-request-id=092831-af18l-324"
+               "&payment-request-data=JNLSKFknrlwe80dkzrnLEWR"
+               "&unecessary-parameter=0"),
+          {{"payment-request-id", "092831-af18l-324"},
+           {"payment-request-data", "JNLSKFknrlwe80dkzrnLEWR"},
+           {"unecessary-parameter", "0"}},
+          true,
+      },
+  };
+
+  for (size_t i = 0; i < arraysize(test_cases); ++i) {
+    const UniversalLinkDecodeTestCase& test_case = test_cases[i];
+    AppStartupParameters* params = [[AppStartupParameters alloc]
+        initWithUniversalLink:test_case.universal_link];
+    EXPECT_EQ(test_case.expected_external_url_params, params.externalURLParams);
+    EXPECT_EQ(test_case.expected_complete_payment_request,
+              params.completePaymentRequest);
+  }
+}
+
+}  // namespace
diff --git a/ios/chrome/browser/autofill/OWNERS b/ios/chrome/browser/autofill/OWNERS
index 6a806bd..adccd5d 100644
--- a/ios/chrome/browser/autofill/OWNERS
+++ b/ios/chrome/browser/autofill/OWNERS
@@ -1 +1,4 @@
 mahmadi@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/browser_state/BUILD.gn b/ios/chrome/browser/browser_state/BUILD.gn
index 677e58d..a5b7139e 100644
--- a/ios/chrome/browser/browser_state/BUILD.gn
+++ b/ios/chrome/browser/browser_state/BUILD.gn
@@ -105,11 +105,11 @@
     "//ios/chrome/browser/sync",
     "//ios/chrome/browser/sync/glue",
     "//ios/chrome/browser/translate",
+    "//ios/chrome/browser/ui/browser_list",
     "//ios/chrome/browser/undo",
     "//ios/net",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/signin",
-    "//ios/shared/chrome/browser/ui/browser_list",
     "//ios/web",
     "//net",
     "//net:extras",
diff --git a/ios/chrome/browser/browser_state/OWNERS b/ios/chrome/browser/browser_state/OWNERS
index c5cd5cb..39066e1 100644
--- a/ios/chrome/browser/browser_state/OWNERS
+++ b/ios/chrome/browser/browser_state/OWNERS
@@ -1 +1,4 @@
 sdefresne@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm b/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm
index 4f472d4..c91071c 100644
--- a/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm
+++ b/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm
@@ -47,9 +47,9 @@
 #include "ios/chrome/browser/sync/ios_user_event_service_factory.h"
 #include "ios/chrome/browser/sync/sync_setup_service_factory.h"
 #include "ios/chrome/browser/translate/translate_accept_languages_factory.h"
+#include "ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.h"
 #include "ios/chrome/browser/undo/bookmark_undo_service_factory.h"
 #include "ios/chrome/browser/web_data_service_factory.h"
-#include "ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/browser_state_metrics/OWNERS b/ios/chrome/browser/browser_state_metrics/OWNERS
index eccc04a..62cd9921 100644
--- a/ios/chrome/browser/browser_state_metrics/OWNERS
+++ b/ios/chrome/browser/browser_state_metrics/OWNERS
@@ -2,3 +2,6 @@
 erg@chromium.org
 
 # COMPONENT: UI>Browser>Profiles
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/content_suggestions/OWNERS b/ios/chrome/browser/content_suggestions/OWNERS
index 2d35f0a5..f192143 100644
--- a/ios/chrome/browser/content_suggestions/OWNERS
+++ b/ios/chrome/browser/content_suggestions/OWNERS
@@ -1 +1,4 @@
 gambard@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm b/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm
index 9391c7d..80e518b 100644
--- a/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm
+++ b/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm
@@ -196,11 +196,7 @@
     if (!self.sectionInformationByCategory[categoryWrapper]) {
       [self addSectionInformationForCategory:category];
     }
-    if (IsCategoryStatusAvailable(
-            self.contentService->GetCategoryStatus(category))) {
-      [sectionsInfo
-          addObject:self.sectionInformationByCategory[categoryWrapper]];
-    }
+    [sectionsInfo addObject:self.sectionInformationByCategory[categoryWrapper]];
   }
 
   [sectionsInfo addObject:self.learnMoreSectionInfo];
@@ -344,21 +340,15 @@
             (ntp_snippets::ContentSuggestionsService*)suggestionsService
                          category:(ntp_snippets::Category)category
                   statusChangedTo:(ntp_snippets::CategoryStatus)status {
-  ContentSuggestionsCategoryWrapper* wrapper =
-      [[ContentSuggestionsCategoryWrapper alloc] initWithCategory:category];
   if (!ntp_snippets::IsCategoryStatusInitOrAvailable(status)) {
     // Remove the category from the UI if it is not available.
+    ContentSuggestionsCategoryWrapper* wrapper =
+        [[ContentSuggestionsCategoryWrapper alloc] initWithCategory:category];
     ContentSuggestionsSectionInformation* sectionInfo =
         self.sectionInformationByCategory[wrapper];
 
     [self.dataSink clearSection:sectionInfo];
     [self.sectionInformationByCategory removeObjectForKey:wrapper];
-  } else {
-    if (!self.sectionInformationByCategory[wrapper]) {
-      [self addSectionInformationForCategory:category];
-    }
-    [self.dataSink
-        dataAvailableForSection:self.sectionInformationByCategory[wrapper]];
   }
 }
 
diff --git a/ios/chrome/browser/context_menu/OWNERS b/ios/chrome/browser/context_menu/OWNERS
index bf1620f..ab525656 100644
--- a/ios/chrome/browser/context_menu/OWNERS
+++ b/ios/chrome/browser/context_menu/OWNERS
@@ -1 +1,4 @@
 noyau@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/device_sharing/OWNERS b/ios/chrome/browser/device_sharing/OWNERS
index 987c0c88..7030015a3 100644
--- a/ios/chrome/browser/device_sharing/OWNERS
+++ b/ios/chrome/browser/device_sharing/OWNERS
@@ -1 +1,4 @@
 erikchen@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/dom_distiller/OWNERS b/ios/chrome/browser/dom_distiller/OWNERS
index bf1620f..ab525656 100644
--- a/ios/chrome/browser/dom_distiller/OWNERS
+++ b/ios/chrome/browser/dom_distiller/OWNERS
@@ -1 +1,4 @@
 noyau@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/feature_engagement/OWNERS b/ios/chrome/browser/feature_engagement/OWNERS
index b5a2453..782b0c3 100644
--- a/ios/chrome/browser/feature_engagement/OWNERS
+++ b/ios/chrome/browser/feature_engagement/OWNERS
@@ -1,2 +1,5 @@
 edchin@chromium.org
 gchatz@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/find_in_page/OWNERS b/ios/chrome/browser/find_in_page/OWNERS
index 40a68c7..b127701 100644
--- a/ios/chrome/browser/find_in_page/OWNERS
+++ b/ios/chrome/browser/find_in_page/OWNERS
@@ -1 +1,4 @@
 rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/first_run/OWNERS b/ios/chrome/browser/first_run/OWNERS
index 4905815..169936c8 100644
--- a/ios/chrome/browser/first_run/OWNERS
+++ b/ios/chrome/browser/first_run/OWNERS
@@ -2,3 +2,6 @@
 msarda@chromium.org
 
 # COMPONENT: UI>Browser>FirstRun
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/history/OWNERS b/ios/chrome/browser/history/OWNERS
index 1085212..1c26985 100644
--- a/ios/chrome/browser/history/OWNERS
+++ b/ios/chrome/browser/history/OWNERS
@@ -1,2 +1,5 @@
 lpromero@chromium.org
 sczs@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/infobars/OWNERS b/ios/chrome/browser/infobars/OWNERS
index d2e1add..c85e66a 100644
--- a/ios/chrome/browser/infobars/OWNERS
+++ b/ios/chrome/browser/infobars/OWNERS
@@ -1 +1,4 @@
 jif@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/invalidation/OWNERS b/ios/chrome/browser/invalidation/OWNERS
index 7f08e5f..2cdcafd2 100644
--- a/ios/chrome/browser/invalidation/OWNERS
+++ b/ios/chrome/browser/invalidation/OWNERS
@@ -3,3 +3,6 @@
 pavely@chromium.org
 
 # COMPONENT: Services>Invalidation
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/itunes_links/OWNERS b/ios/chrome/browser/itunes_links/OWNERS
index d2e1add..c85e66a 100644
--- a/ios/chrome/browser/itunes_links/OWNERS
+++ b/ios/chrome/browser/itunes_links/OWNERS
@@ -1 +1,4 @@
 jif@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/language/OWNERS b/ios/chrome/browser/language/OWNERS
index f1e82d5..bc263cd 100644
--- a/ios/chrome/browser/language/OWNERS
+++ b/ios/chrome/browser/language/OWNERS
@@ -1 +1,4 @@
 file://components/language/OWNERS
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/metrics/OWNERS b/ios/chrome/browser/metrics/OWNERS
index 17a1cc1..e2a5d55 100644
--- a/ios/chrome/browser/metrics/OWNERS
+++ b/ios/chrome/browser/metrics/OWNERS
@@ -1,2 +1,5 @@
 lpromero@chromium.org
 olivierrobin@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/net/OWNERS b/ios/chrome/browser/net/OWNERS
index ed94051..22d5a1c 100644
--- a/ios/chrome/browser/net/OWNERS
+++ b/ios/chrome/browser/net/OWNERS
@@ -1 +1,4 @@
 droger@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ntp_snippets/OWNERS b/ios/chrome/browser/ntp_snippets/OWNERS
index 7f58514..94af0b0 100644
--- a/ios/chrome/browser/ntp_snippets/OWNERS
+++ b/ios/chrome/browser/ntp_snippets/OWNERS
@@ -1,2 +1,5 @@
 noyau@chromium.org
 gambard@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ntp_tiles/OWNERS b/ios/chrome/browser/ntp_tiles/OWNERS
index b622730..96f8a26 100644
--- a/ios/chrome/browser/ntp_tiles/OWNERS
+++ b/ios/chrome/browser/ntp_tiles/OWNERS
@@ -1,2 +1,5 @@
 sfiera@chromium.org
 file://components/ntp_tiles/OWNERS
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/omaha/OWNERS b/ios/chrome/browser/omaha/OWNERS
index 40a68c7..b127701 100644
--- a/ios/chrome/browser/omaha/OWNERS
+++ b/ios/chrome/browser/omaha/OWNERS
@@ -1 +1,4 @@
 rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/passwords/OWNERS b/ios/chrome/browser/passwords/OWNERS
index adc8d4b..83fe1582 100644
--- a/ios/chrome/browser/passwords/OWNERS
+++ b/ios/chrome/browser/passwords/OWNERS
@@ -1,3 +1,6 @@
 melandory@chromium.org
 vabr@chromium.org
 vasilii@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/payments/BUILD.gn b/ios/chrome/browser/payments/BUILD.gn
index 5463f9a..84f2e85 100644
--- a/ios/chrome/browser/payments/BUILD.gn
+++ b/ios/chrome/browser/payments/BUILD.gn
@@ -13,6 +13,10 @@
     "ios_payment_instrument.mm",
     "ios_payment_instrument_finder.h",
     "ios_payment_instrument_finder.mm",
+    "ios_payment_instrument_launcher.h",
+    "ios_payment_instrument_launcher.mm",
+    "ios_payment_instrument_launcher_factory.h",
+    "ios_payment_instrument_launcher_factory.mm",
     "ios_payment_request_cache_factory.h",
     "ios_payment_request_cache_factory.mm",
     "origin_security_checker.h",
@@ -53,6 +57,7 @@
   testonly = true
   sources = [
     "ios_payment_instrument_finder_unittest.mm",
+    "ios_payment_instrument_launcher_unittest.mm",
     "payment_request_unittest.mm",
     "payment_response_helper_unittest.mm",
   ]
diff --git a/ios/chrome/browser/payments/OWNERS b/ios/chrome/browser/payments/OWNERS
index 4cfb56d..2a262cc2 100644
--- a/ios/chrome/browser/payments/OWNERS
+++ b/ios/chrome/browser/payments/OWNERS
@@ -1,2 +1,5 @@
 lpromero@chromium.org
 mahmadi@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/payments/ios_payment_instrument.h b/ios/chrome/browser/payments/ios_payment_instrument.h
index 417e49d0..7adde13 100644
--- a/ios/chrome/browser/payments/ios_payment_instrument.h
+++ b/ios/chrome/browser/payments/ios_payment_instrument.h
@@ -15,6 +15,7 @@
 #include "base/strings/string16.h"
 #include "components/payments/core/payment_instrument.h"
 #include "ios/chrome/browser/payments/payment_request.h"
+#include "url/gurl.h"
 
 @class PaymentRequestUIDelegate;
 
@@ -40,7 +41,7 @@
   // the native payment app from Chrome.
   IOSPaymentInstrument(
       const std::string& method_name,
-      const std::string& universal_link,
+      const GURL& universal_link,
       const std::string& app_name,
       UIImage* icon_image,
       id<PaymentRequestUIDelegate> payment_request_ui_delegate);
@@ -69,7 +70,7 @@
 
  private:
   std::string method_name_;
-  std::string universal_link_;
+  GURL universal_link_;
   std::string app_name_;
   base::scoped_nsobject<UIImage> icon_image_;
 
diff --git a/ios/chrome/browser/payments/ios_payment_instrument.mm b/ios/chrome/browser/payments/ios_payment_instrument.mm
index 29522f6..fa19e48 100644
--- a/ios/chrome/browser/payments/ios_payment_instrument.mm
+++ b/ios/chrome/browser/payments/ios_payment_instrument.mm
@@ -5,7 +5,6 @@
 #include "ios/chrome/browser/payments/ios_payment_instrument.h"
 
 #include "base/strings/utf_string_conversions.h"
-#include "url/gurl.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -32,7 +31,7 @@
 
 IOSPaymentInstrument::IOSPaymentInstrument(
     const std::string& method_name,
-    const std::string& universal_link,
+    const GURL& universal_link,
     const std::string& app_name,
     UIImage* icon_image,
     id<PaymentRequestUIDelegate> payment_request_ui_delegate)
diff --git a/ios/chrome/browser/payments/ios_payment_instrument_finder.mm b/ios/chrome/browser/payments/ios_payment_instrument_finder.mm
index ad9cf41..6578fba67 100644
--- a/ios/chrome/browser/payments/ios_payment_instrument_finder.mm
+++ b/ios/chrome/browser/payments/ios_payment_instrument_finder.mm
@@ -343,8 +343,8 @@
           UIImage* icon =
               [UIImage imageWithData:data scale:[UIScreen mainScreen].scale];
           instruments_found_.push_back(base::MakeUnique<IOSPaymentInstrument>(
-              local_method_name.spec(), local_universal_link.spec(),
-              local_app_name, icon, payment_request_ui_delegate_));
+              local_method_name.spec(), local_universal_link, local_app_name,
+              icon, payment_request_ui_delegate_));
         }
         OnPaymentInstrumentProcessed();
       };
diff --git a/ios/chrome/browser/payments/ios_payment_instrument_launcher.h b/ios/chrome/browser/payments/ios_payment_instrument_launcher.h
new file mode 100644
index 0000000..bab3a95a
--- /dev/null
+++ b/ios/chrome/browser/payments/ios_payment_instrument_launcher.h
@@ -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.
+
+#ifndef IOS_CHROME_BROWSER_PAYMENTS_IOS_PAYMENT_INSTRUMENT_LAUNCHER_H_
+#define IOS_CHROME_BROWSER_PAYMENTS_IOS_PAYMENT_INSTRUMENT_LAUNCHER_H_
+
+#include "components/keyed_service/core/keyed_service.h"
+#include "ios/chrome/browser/payments/payment_request.h"
+
+namespace base {
+class DictionaryValue;
+}  // namespace base
+
+namespace web {
+class NavigationItem;
+}  // namespace web
+
+namespace payments {
+
+// Launches a native iOS third party payment app and handles the response
+// returned from that payment app. Only one instance of this object can exist
+// per browser state. This launcher can only handle one request at a time,
+// so any calls this class while another request is processing will fail and
+// will cause the in-flight request to fail.
+class IOSPaymentInstrumentLauncher : public KeyedService {
+ public:
+  IOSPaymentInstrumentLauncher();
+  ~IOSPaymentInstrumentLauncher() override;
+
+  // Attempts to launch a third party iOS payment app. Uses |payment_request|
+  // and |acitive_web_state| to build numerous parameters that get seraliazed
+  // into a JSON string and then encoded into base-64. |universal_link| is then
+  // invoked with the built parameters passed in as a query string. If the class
+  // fails to open the universal link the error callback of |delegate| will
+  // be invoked. If the class is successful in opening the universal link
+  // the success callback will be invoked when the payment app calls back into
+  // Chrome with a payment response. Finally, the class returns a boolean
+  // indicating if it made an attempt to launch the IOSPaymentInstrument. The
+  // only instance when the launcher will not attempt a launch is when there is
+  // another in-flight request already happening.
+  bool LaunchIOSPaymentInstrument(
+      payments::PaymentRequest* payment_request,
+      web::WebState* active_web_state,
+      GURL& universal_link,
+      payments::PaymentInstrument::Delegate* delegate);
+
+  // Callback for when an iOS payment app sends a response back to Chrome.
+  // |response| is a base-64 encodeded string. When decoded, |response| is
+  // is expected to contain the method name of the payment instrument used,
+  // whether or not the payment app was able to successfully complete its part
+  // of the transaction, and details that contain information for the merchant
+  // website to complete the transaction. The details are only parsed if
+  // the payment app claims to have successfully completed its part of the
+  // transaction.
+  void ReceiveResponseFromIOSPaymentInstrument(
+      const std::string& base_64_response);
+
+  // Before invoking ReceieveResponseFromIOSPaymentInstrument, callers can
+  // use delegate() to ensure that the delegate property is valid.
+  payments::PaymentInstrument::Delegate* delegate() { return delegate_; }
+
+  // Sets the delegate for the current IOSPaymentInstrumentLauncher request.
+  void set_delegate(payments::PaymentInstrument::Delegate* delegate) {
+    delegate_ = delegate;
+  }
+
+  // The payment request ID is exposed in order validate responses from
+  // third party payment apps.
+  std::string payment_request_id() { return payment_request_id_; }
+
+ private:
+  friend class IOSPaymentInstrumentLauncherTest;
+
+  // Returns the JSON-serialized dictionary from each method name the merchant
+  // requested to the corresponding method data. |stringified_method_data| is
+  // a mapping of the payment method names to the corresponding JSON-stringified
+  // payment method specific data. This function converts that map into a JSON
+  // readable object.
+  std::unique_ptr<base::DictionaryValue> SerializeMethodData(
+      const std::map<std::string, std::set<std::string>>&
+          stringified_method_data);
+
+  // Returns the JSON-serialized top-level certificate chain of the browsing
+  // context. |item| has information on the browsing state, including the
+  // SSL certificate needed to build the certificate chain.
+  std::unique_ptr<base::ListValue> SerializeCertificateChain(
+      web::NavigationItem* item);
+
+  // Returns the JSON-serialized array of web::PaymentDetailsModifier objects.
+  // |details| is the object that represents the details of a PaymentRequest
+  // object and contains the vector of web::PaymentDetailsModifier objects to
+  // serialize.
+  std::unique_ptr<base::ListValue> SerializeModifiers(
+      web::PaymentDetails details);
+
+  // Invokes the payment instrument delegate with the appropriate function.
+  // If |method_name| or |details| are empty then |delegate_| calls
+  // OnInstrumentDetailsError, otherwise |delegate_| calls
+  // OnInstrumentDetailsReady. After invoking the delegate function this method
+  // will also reset |delegate_| and |payment_request_id_|.
+  void CompleteLaunchRequest(const std::string& method_name,
+                             const std::string& details);
+
+  payments::PaymentInstrument::Delegate* delegate_;
+  std::string payment_request_id_;
+};
+
+}  // namespace payments
+
+#endif  // IOS_CHROME_BROWSER_PAYMENTS_IOS_PAYMENT_INSTRUMENT_LAUNCHER_H_
diff --git a/ios/chrome/browser/payments/ios_payment_instrument_launcher.mm b/ios/chrome/browser/payments/ios_payment_instrument_launcher.mm
new file mode 100644
index 0000000..ea3bd41
--- /dev/null
+++ b/ios/chrome/browser/payments/ios_payment_instrument_launcher.mm
@@ -0,0 +1,268 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/payments/ios_payment_instrument_launcher.h"
+
+#include <map>
+
+#include "base/base64.h"
+#include "base/ios/ios_util.h"
+#include "base/json/json_reader.h"
+#include "base/json/json_writer.h"
+#include "base/memory/ptr_util.h"
+#include "base/strings/sys_string_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/values.h"
+#include "components/payments/core/payment_instrument.h"
+#include "ios/web/public/navigation_item.h"
+#include "ios/web/public/navigation_manager.h"
+#include "ios/web/public/payments/payment_request.h"
+#include "ios/web/public/ssl_status.h"
+#include "ios/web/public/web_state/web_state.h"
+#include "net/base/mac/url_conversions.mm"
+#include "net/base/url_util.h"
+#include "net/cert/x509_certificate.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+
+// Parameters sent to a payment app.
+static const char kMethodNames[] = "methodNames";
+static const char kMethodData[] = "methodData";
+static const char kMerchantName[] = "merchantName";
+static const char kTopLevelOrigin[] = "topLevelOrigin";
+static const char kTopLevelCertificateChain[] = "topLevelCertificateChain";
+static const char kCertificate[] = "cert";
+static const char kTotal[] = "total";
+static const char kModifiers[] = "modifiers";
+
+// Parameters received from a payment app.
+static const char kSuccess[] = "success";
+static const char kMethodName[] = "methodName";
+static const char kDetails[] = "details";
+
+}  // namespace
+
+namespace payments {
+
+IOSPaymentInstrumentLauncher::IOSPaymentInstrumentLauncher()
+    : delegate_(nullptr), payment_request_id_("") {}
+
+IOSPaymentInstrumentLauncher::~IOSPaymentInstrumentLauncher() {}
+
+bool IOSPaymentInstrumentLauncher::LaunchIOSPaymentInstrument(
+    payments::PaymentRequest* payment_request,
+    web::WebState* active_web_state,
+    GURL& universal_link,
+    payments::PaymentInstrument::Delegate* delegate) {
+  DCHECK(delegate);
+
+  // Only one request can be handled at a time.
+  if (delegate_ || !payment_request_id_.empty()) {
+    return false;
+  }
+
+  delegate_ = delegate;
+
+  std::unique_ptr<base::DictionaryValue> params_to_payment_app =
+      base::MakeUnique<base::DictionaryValue>();
+
+  // TODO(crbug.com/748556): Filter the following list to only show method names
+  // that we know the payment app supports. For now, sending all the requested
+  // method names i.e., 'basic-card' and 'https://alice-pay.com" to the payment
+  // app works as the payment app provider can then decide what to do with that
+  // information, but this is not ideal nor is this consistent with Android
+  // implementation.
+  std::unique_ptr<base::ListValue> method_names =
+      base::MakeUnique<base::ListValue>();
+  for (auto const& it : payment_request->stringified_method_data())
+    method_names->GetList().emplace_back(it.first);
+  params_to_payment_app->SetList(kMethodNames, std::move(method_names));
+
+  params_to_payment_app->SetDictionary(
+      kMethodData,
+      SerializeMethodData(payment_request->stringified_method_data()));
+
+  params_to_payment_app->SetString(
+      kMerchantName, base::UTF16ToASCII(active_web_state->GetTitle()));
+
+  params_to_payment_app->SetKey(
+      kTopLevelOrigin,
+      base::Value(active_web_state->GetLastCommittedURL().host()));
+
+  params_to_payment_app->SetList(
+      kTopLevelCertificateChain,
+      SerializeCertificateChain(
+          active_web_state->GetNavigationManager()->GetVisibleItem()));
+
+  params_to_payment_app->SetDictionary(
+      kTotal, payment_request->web_payment_request()
+                  .details.total.amount.ToDictionaryValue());
+
+  params_to_payment_app->SetList(
+      kModifiers,
+      SerializeModifiers(payment_request->web_payment_request().details));
+
+  // JSON stringify the object so that it can be encoded in base-64.
+  std::string stringified_parameters;
+  base::JSONWriter::Write(*params_to_payment_app, &stringified_parameters);
+  std::string base_64_params;
+  base::Base64Encode(stringified_parameters, &base_64_params);
+
+  payment_request_id_ =
+      payment_request->web_payment_request().payment_request_id;
+
+  universal_link = net::AppendQueryParameter(
+      universal_link, web::kPaymentRequestIDExternal, payment_request_id_);
+  universal_link = net::AppendQueryParameter(
+      universal_link, web::kPaymentRequestDataExternal, base_64_params);
+  NSURL* url = net::NSURLWithGURL(universal_link);
+  [[UIApplication sharedApplication]
+      openURL:url
+      options:(base::ios::IsRunningOnIOS10OrLater()
+                   ? @{ UIApplicationOpenURLOptionUniversalLinksOnly : @YES }
+                   : nil)completionHandler:^(BOOL success) {
+        if (!success) {
+          CompleteLaunchRequest("", "");
+        }
+      }];
+
+  return true;
+}
+
+void IOSPaymentInstrumentLauncher::ReceiveResponseFromIOSPaymentInstrument(
+    const std::string& base_64_response) {
+  DCHECK(delegate_);
+
+  std::string stringified_parameters;
+  base::Base64Decode(base_64_response, &stringified_parameters);
+
+  std::unique_ptr<base::Value> value =
+      base::JSONReader::Read(stringified_parameters);
+  if (!value) {
+    CompleteLaunchRequest("", "");
+    return;
+  }
+
+  std::unique_ptr<base::DictionaryValue> dict =
+      base::DictionaryValue::From(std::move(value));
+  if (!dict) {
+    CompleteLaunchRequest("", "");
+    return;
+  }
+
+  int success;
+  if (!dict->GetInteger(kSuccess, &success) || success == 0) {
+    CompleteLaunchRequest("", "");
+    return;
+  }
+
+  std::string method_name;
+  if (!dict->GetString(kMethodName, &method_name) || method_name.empty()) {
+    CompleteLaunchRequest("", "");
+    return;
+  }
+
+  std::string stringified_details;
+  if (!dict->GetString(kDetails, &stringified_details) ||
+      stringified_details.empty()) {
+    CompleteLaunchRequest("", "");
+    return;
+  }
+
+  CompleteLaunchRequest(method_name, stringified_details);
+}
+
+std::unique_ptr<base::DictionaryValue>
+IOSPaymentInstrumentLauncher::SerializeMethodData(
+    const std::map<std::string, std::set<std::string>>&
+        stringified_method_data) {
+  std::unique_ptr<base::DictionaryValue> method_data =
+      base::MakeUnique<base::DictionaryValue>();
+
+  std::unique_ptr<base::ListValue> data_list;
+  std::unique_ptr<base::Value> data;
+  for (auto const& map_it : stringified_method_data) {
+    data_list = base::MakeUnique<base::ListValue>();
+    for (auto const& data_it : map_it.second) {
+      data = base::JSONReader().ReadToValue(data_it);
+      // We insert the stringified data, not the JSON object and only if the
+      // corresponding JSON object is valid.
+      if (data)
+        data_list->GetList().emplace_back(data_it);
+    }
+
+    method_data->SetKey(map_it.first, *data_list);
+  }
+
+  return method_data;
+}
+
+std::unique_ptr<base::ListValue>
+IOSPaymentInstrumentLauncher::SerializeCertificateChain(
+    web::NavigationItem* item) {
+  std::unique_ptr<base::ListValue> cert_chain_list =
+      base::MakeUnique<base::ListValue>();
+
+  if (!item)
+    return cert_chain_list;
+
+  scoped_refptr<net::X509Certificate> cert = item->GetSSL().certificate;
+  std::vector<std::vector<const char>> cert_chain;
+  net::X509Certificate::OSCertHandles cert_handles =
+      cert->GetIntermediateCertificates();
+  if (cert_handles.empty() || cert_handles[0] != cert->os_cert_handle())
+    cert_handles.insert(cert_handles.begin(), cert->os_cert_handle());
+
+  cert_chain.reserve(cert_handles.size());
+  for (auto* handle : cert_handles) {
+    std::string cert_bytes;
+    net::X509Certificate::GetDEREncoded(handle, &cert_bytes);
+    cert_chain.push_back(
+        std::vector<const char>(cert_bytes.begin(), cert_bytes.end()));
+  }
+
+  std::unique_ptr<base::DictionaryValue> cert_chain_dict;
+  std::unique_ptr<base::ListValue> byte_array;
+  for (std::vector<const char> cert_string : cert_chain) {
+    byte_array = base::MakeUnique<base::ListValue>();
+    cert_chain_dict = base::MakeUnique<base::DictionaryValue>();
+    for (const char byte : cert_string)
+      byte_array->GetList().emplace_back(byte);
+    cert_chain_dict->Set(kCertificate, std::move(byte_array));
+    cert_chain_list->GetList().push_back(*cert_chain_dict);
+  }
+
+  return cert_chain_list;
+}
+
+std::unique_ptr<base::ListValue>
+IOSPaymentInstrumentLauncher::SerializeModifiers(web::PaymentDetails details) {
+  std::unique_ptr<base::ListValue> modifiers =
+      base::MakeUnique<base::ListValue>();
+  size_t numModifiers = details.modifiers.size();
+  for (size_t i = 0; i < numModifiers; ++i) {
+    const std::unique_ptr<base::DictionaryValue> modifier =
+        details.modifiers[i].ToDictionaryValue();
+    modifiers->GetList().push_back(*modifier.get());
+  }
+
+  return modifiers;
+}
+
+void IOSPaymentInstrumentLauncher::CompleteLaunchRequest(
+    const std::string& method_name,
+    const std::string& details) {
+  if (!method_name.empty() && !details.empty())
+    delegate_->OnInstrumentDetailsReady(method_name, details);
+  else
+    delegate_->OnInstrumentDetailsError();
+  delegate_ = nullptr;
+  payment_request_id_ = "";
+}
+
+}  // namespace payments
diff --git a/ios/chrome/browser/payments/ios_payment_instrument_launcher_factory.h b/ios/chrome/browser/payments/ios_payment_instrument_launcher_factory.h
new file mode 100644
index 0000000..401a6ce6
--- /dev/null
+++ b/ios/chrome/browser/payments/ios_payment_instrument_launcher_factory.h
@@ -0,0 +1,50 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_PAYMENTS_IOS_PAYMENT_INSTRUMENT_LAUNCHER_FACTORY_H_
+#define IOS_CHROME_BROWSER_PAYMENTS_IOS_PAYMENT_INSTRUMENT_LAUNCHER_FACTORY_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "components/keyed_service/ios/browser_state_keyed_service_factory.h"
+
+namespace base {
+template <typename T>
+struct DefaultSingletonTraits;
+}  // namespace base
+
+namespace ios {
+class ChromeBrowserState;
+}  // namespace ios
+
+namespace payments {
+class IOSPaymentInstrumentLauncher;
+
+// Ensures that there's only one instance of
+// payments::IOSPaymentInstrumentLauncher per browser state.
+class IOSPaymentInstrumentLauncherFactory
+    : public BrowserStateKeyedServiceFactory {
+ public:
+  static IOSPaymentInstrumentLauncher* GetForBrowserState(
+      ios::ChromeBrowserState* browser_state);
+  static IOSPaymentInstrumentLauncherFactory* GetInstance();
+
+ private:
+  friend struct base::DefaultSingletonTraits<
+      IOSPaymentInstrumentLauncherFactory>;
+
+  IOSPaymentInstrumentLauncherFactory();
+  ~IOSPaymentInstrumentLauncherFactory() override;
+
+  // BrowserStateKeyedServiceFactory implementation.
+  std::unique_ptr<KeyedService> BuildServiceInstanceFor(
+      web::BrowserState* context) const override;
+
+  DISALLOW_COPY_AND_ASSIGN(IOSPaymentInstrumentLauncherFactory);
+};
+
+}  // namespace payments
+
+#endif  // IOS_CHROME_BROWSER_PAYMENTS_IOS_PAYMENT_INSTRUMENT_LAUNCHER_FACTORY_H_
diff --git a/ios/chrome/browser/payments/ios_payment_instrument_launcher_factory.mm b/ios/chrome/browser/payments/ios_payment_instrument_launcher_factory.mm
new file mode 100644
index 0000000..a4e4ff38
--- /dev/null
+++ b/ios/chrome/browser/payments/ios_payment_instrument_launcher_factory.mm
@@ -0,0 +1,43 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ios/chrome/browser/payments/ios_payment_instrument_launcher_factory.h"
+
+#include "base/memory/ptr_util.h"
+#include "base/memory/singleton.h"
+#include "components/keyed_service/ios/browser_state_dependency_manager.h"
+#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#include "ios/chrome/browser/payments/ios_payment_instrument_launcher.h"
+#include "ios/web/public/browser_state.h"
+
+namespace payments {
+
+// static
+payments::IOSPaymentInstrumentLauncher*
+IOSPaymentInstrumentLauncherFactory::GetForBrowserState(
+    ios::ChromeBrowserState* browser_state) {
+  return static_cast<payments::IOSPaymentInstrumentLauncher*>(
+      GetInstance()->GetServiceForBrowserState(browser_state, true));
+}
+
+// static
+IOSPaymentInstrumentLauncherFactory*
+IOSPaymentInstrumentLauncherFactory::GetInstance() {
+  return base::Singleton<IOSPaymentInstrumentLauncherFactory>::get();
+}
+
+IOSPaymentInstrumentLauncherFactory::IOSPaymentInstrumentLauncherFactory()
+    : BrowserStateKeyedServiceFactory(
+          "IOSPaymentInstrumentLauncher",
+          BrowserStateDependencyManager::GetInstance()) {}
+
+IOSPaymentInstrumentLauncherFactory::~IOSPaymentInstrumentLauncherFactory() {}
+
+std::unique_ptr<KeyedService>
+IOSPaymentInstrumentLauncherFactory::BuildServiceInstanceFor(
+    web::BrowserState* context) const {
+  return base::WrapUnique(new payments::IOSPaymentInstrumentLauncher);
+}
+
+}  // namespace payments
diff --git a/ios/chrome/browser/payments/ios_payment_instrument_launcher_unittest.mm b/ios/chrome/browser/payments/ios_payment_instrument_launcher_unittest.mm
new file mode 100644
index 0000000..26a33eb4
--- /dev/null
+++ b/ios/chrome/browser/payments/ios_payment_instrument_launcher_unittest.mm
@@ -0,0 +1,330 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ios/chrome/browser/payments/ios_payment_instrument_launcher.h"
+
+#include <map>
+#include <memory>
+
+#include "base/base64.h"
+#include "base/ios/ios_util.h"
+#include "base/json/json_writer.h"
+#include "base/run_loop.h"
+#include "base/test/scoped_task_environment.h"
+#include "base/values.h"
+#include "components/autofill/core/browser/test_personal_data_manager.h"
+#include "components/payments/core/payment_instrument.h"
+#include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
+#include "ios/chrome/browser/payments/test_payment_request.h"
+#include "ios/web/public/payments/payment_request.h"
+#include "ios/web/public/test/fakes/test_navigation_manager.h"
+#import "ios/web/public/test/fakes/test_web_state.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace payments {
+
+namespace {
+
+class FakePaymentInstrumentDelegate : public PaymentInstrument::Delegate {
+ public:
+  FakePaymentInstrumentDelegate() {}
+
+  void OnInstrumentDetailsReady(
+      const std::string& method_name,
+      const std::string& stringified_details) override {
+    if (run_loop_)
+      run_loop_->Quit();
+    on_instrument_details_ready_called_ = true;
+  }
+
+  void OnInstrumentDetailsError() override {
+    if (run_loop_)
+      run_loop_->Quit();
+    on_instrument_details_error_called_ = true;
+  }
+
+  bool WasOnInstrumentDetailsReadyCalled() {
+    return on_instrument_details_ready_called_;
+  }
+
+  bool WasOnInstrumentDetailsErrorCalled() {
+    return on_instrument_details_error_called_;
+  }
+
+  void RunLoop() {
+    run_loop_.reset(new base::RunLoop());
+    run_loop_->Run();
+  }
+
+ private:
+  bool on_instrument_details_ready_called_ = false;
+  bool on_instrument_details_error_called_ = false;
+
+  std::unique_ptr<base::RunLoop> run_loop_;
+};
+
+}  // namespace
+
+class IOSPaymentInstrumentLauncherTest : public testing::Test {
+ protected:
+  IOSPaymentInstrumentLauncherTest()
+      : chrome_browser_state_(TestChromeBrowserState::Builder().Build()) {}
+
+  std::unique_ptr<base::DictionaryValue> SerializeMethodDataWrapper(
+      const std::map<std::string, std::set<std::string>>&
+          stringified_method_data) {
+    IOSPaymentInstrumentLauncher launcher;
+    return launcher.SerializeMethodData(stringified_method_data);
+  }
+
+  void SetPaymentRequestID(IOSPaymentInstrumentLauncher& launcher) {
+    launcher.payment_request_id_ = "some-payment-request-id";
+  }
+
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
+
+  web::TestWebState web_state_;
+  std::unique_ptr<TestChromeBrowserState> chrome_browser_state_;
+};
+
+// Tests that serializing empty stringified method data yields the expected
+// result.
+TEST_F(IOSPaymentInstrumentLauncherTest, EmptyStringifiedMethodDataDictionary) {
+  web::PaymentRequest web_payment_request;
+  autofill::TestPersonalDataManager personal_data_manager;
+  TestPaymentRequest payment_request(web_payment_request,
+                                     chrome_browser_state_.get(), &web_state_,
+                                     &personal_data_manager);
+
+  base::DictionaryValue expected_dict;
+
+  EXPECT_TRUE(expected_dict.Equals(
+      SerializeMethodDataWrapper(payment_request.stringified_method_data())
+          .get()));
+}
+
+// Tests that serializing populated stringified method data yields the expected
+// result.
+TEST_F(IOSPaymentInstrumentLauncherTest,
+       PopulatedStringifiedMethodDataDictionary) {
+  web::PaymentRequest web_payment_request;
+  PaymentMethodData method_datum1;
+  method_datum1.supported_methods.push_back("https://jefpay.com");
+  method_datum1.supported_methods.push_back("https://bobpay.com");
+  std::unique_ptr<base::DictionaryValue> data =
+      base::MakeUnique<base::DictionaryValue>();
+  data->SetString("Some data", "Some stringified data");
+  std::string stringified_data;
+  base::JSONWriter::Write(*data, &stringified_data);
+  method_datum1.data = stringified_data;
+  web_payment_request.method_data.push_back(method_datum1);
+  PaymentMethodData method_datum2;
+  method_datum2.supported_methods.push_back("https://alicepay.com");
+  web_payment_request.method_data.push_back(method_datum2);
+  PaymentMethodData method_datum3;
+  method_datum3.supported_methods.push_back("https://jefpay.com");
+  web_payment_request.method_data.push_back(method_datum3);
+  PaymentMethodData method_datum4;
+  method_datum4.supported_methods.push_back("https://alicepay.com");
+  method_datum4.supported_methods.push_back("https://bobpay.com");
+  web_payment_request.method_data.push_back(method_datum4);
+
+  autofill::TestPersonalDataManager personal_data_manager;
+  TestPaymentRequest payment_request(web_payment_request,
+                                     chrome_browser_state_.get(), &web_state_,
+                                     &personal_data_manager);
+
+  base::DictionaryValue expected_dict;
+  std::unique_ptr<base::ListValue> jef_data_list =
+      base::MakeUnique<base::ListValue>();
+  std::unique_ptr<base::DictionaryValue> jef_data =
+      base::MakeUnique<base::DictionaryValue>();
+  jef_data->SetString("Some data", "Some stringified data");
+  std::string jef_stringified_data;
+  base::JSONWriter::Write(*jef_data, &jef_stringified_data);
+  jef_data_list->GetList().emplace_back(jef_stringified_data);
+  expected_dict.SetKey("https://jefpay.com", *jef_data_list);
+  std::unique_ptr<base::ListValue> bob_data_list =
+      base::MakeUnique<base::ListValue>();
+  std::unique_ptr<base::DictionaryValue> bob_data =
+      base::MakeUnique<base::DictionaryValue>();
+  bob_data->SetString("Some data", "Some stringified data");
+  std::string bob_stringified_data;
+  base::JSONWriter::Write(*bob_data, &bob_stringified_data);
+  bob_data_list->GetList().emplace_back(bob_stringified_data);
+  expected_dict.SetListWithoutPathExpansion("https://bobpay.com",
+                                            std::move(bob_data_list));
+  std::unique_ptr<base::ListValue> alice_data_list =
+      base::MakeUnique<base::ListValue>();
+  expected_dict.SetKey("https://alicepay.com", *alice_data_list);
+
+  EXPECT_TRUE(expected_dict.Equals(
+      SerializeMethodDataWrapper(payment_request.stringified_method_data())
+          .get()));
+}
+
+// Tests that attempting to open an invalid universal link calls the
+// OnInstrumentDetailsError() function of the delegate.
+TEST_F(IOSPaymentInstrumentLauncherTest,
+       LaunchIOSPaymentInstrument_MalformedUniversalLink) {
+  if (base::ios::IsRunningOnIOS10OrLater()) {
+    std::unique_ptr<web::TestNavigationManager> navigation_manager =
+        base::MakeUnique<web::TestNavigationManager>();
+    web_state_.SetNavigationManager(std::move(navigation_manager));
+
+    web::PaymentRequest web_payment_request;
+    autofill::TestPersonalDataManager personal_data_manager;
+    TestPaymentRequest payment_request(web_payment_request,
+                                       chrome_browser_state_.get(), &web_state_,
+                                       &personal_data_manager);
+
+    FakePaymentInstrumentDelegate instrument_delegate;
+    IOSPaymentInstrumentLauncher launcher;
+
+    EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled());
+    EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsErrorCalled());
+
+    GURL malformed_link = GURL("http://bad-link.com");
+    launcher.LaunchIOSPaymentInstrument(&payment_request, &web_state_,
+                                        malformed_link, &instrument_delegate);
+    instrument_delegate.RunLoop();
+
+    EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled());
+    EXPECT_TRUE(instrument_delegate.WasOnInstrumentDetailsErrorCalled());
+  }
+}
+
+// Tests that if the response from the payment app is not a valid JSON
+// dictionary then the OnInstrumentDetailsError() function of the delegate
+// is called.
+TEST_F(IOSPaymentInstrumentLauncherTest,
+       ReceiveResponseFromIOSPaymentInstrument_ResponseNotDictionary) {
+  FakePaymentInstrumentDelegate instrument_delegate;
+  IOSPaymentInstrumentLauncher launcher;
+
+  EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled());
+  EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsErrorCalled());
+
+  std::string stringified_response = "\"JSON\"";
+  std::string base_64_params;
+  base::Base64Encode(stringified_response, &base_64_params);
+
+  launcher.set_delegate(&instrument_delegate);
+  launcher.ReceiveResponseFromIOSPaymentInstrument(base_64_params);
+
+  EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled());
+  EXPECT_TRUE(instrument_delegate.WasOnInstrumentDetailsErrorCalled());
+}
+
+// Tests that if a payment app claims to have not been successful in
+// fulfilling its side of the transaction then OnInstrumentDetailsError()
+// is called.
+TEST_F(IOSPaymentInstrumentLauncherTest,
+       ReceiveResponseFromIOSPaymentInstrument_PaymentAppFailed) {
+  FakePaymentInstrumentDelegate instrument_delegate;
+  IOSPaymentInstrumentLauncher launcher;
+
+  EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled());
+  EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsErrorCalled());
+
+  base::DictionaryValue response;
+  response.SetInteger("success", 0);
+  response.SetString("methodName", "visa");
+  response.SetString("details", "Some details");
+  std::string stringified_response;
+  base::JSONWriter::Write(response, &stringified_response);
+  std::string base_64_params;
+  base::Base64Encode(stringified_response, &base_64_params);
+
+  launcher.set_delegate(&instrument_delegate);
+  launcher.ReceiveResponseFromIOSPaymentInstrument(base_64_params);
+
+  EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled());
+  EXPECT_TRUE(instrument_delegate.WasOnInstrumentDetailsErrorCalled());
+}
+
+// Tests that if the response from the payment app does not contain a
+// method name then OnInstrumentDetailsError() of the delegate is
+// called.
+TEST_F(IOSPaymentInstrumentLauncherTest,
+       ReceiveResponseFromIOSPaymentInstrument_NoMethodName) {
+  FakePaymentInstrumentDelegate instrument_delegate;
+  IOSPaymentInstrumentLauncher launcher;
+
+  EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled());
+  EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsErrorCalled());
+
+  base::DictionaryValue response;
+  response.SetInteger("success", 1);
+  response.SetString("details", "Some details");
+  std::string stringified_response;
+  base::JSONWriter::Write(response, &stringified_response);
+  std::string base_64_params;
+  base::Base64Encode(stringified_response, &base_64_params);
+
+  launcher.set_delegate(&instrument_delegate);
+  launcher.ReceiveResponseFromIOSPaymentInstrument(base_64_params);
+
+  EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled());
+  EXPECT_TRUE(instrument_delegate.WasOnInstrumentDetailsErrorCalled());
+}
+
+// Tests that if the response from the payment app does not contain any
+// stringified details then OnInstrumentDetailsError() of the delegate is
+// called.
+TEST_F(IOSPaymentInstrumentLauncherTest,
+       ReceiveResponseFromIOSPaymentInstrument_NoDetails) {
+  FakePaymentInstrumentDelegate instrument_delegate;
+  IOSPaymentInstrumentLauncher launcher;
+
+  EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled());
+  EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsErrorCalled());
+
+  base::DictionaryValue response;
+  response.SetInteger("success", 1);
+  response.SetString("methodName", "visa");
+  std::string stringified_response;
+  base::JSONWriter::Write(response, &stringified_response);
+  std::string base_64_params;
+  base::Base64Encode(stringified_response, &base_64_params);
+
+  launcher.set_delegate(&instrument_delegate);
+  launcher.ReceiveResponseFromIOSPaymentInstrument(base_64_params);
+
+  EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled());
+  EXPECT_TRUE(instrument_delegate.WasOnInstrumentDetailsErrorCalled());
+}
+
+// Tests that if the response from the payment app has all necessary
+// parameters with valid values then OnInstrumentDetailsReady() of the
+// delegate is called.
+TEST_F(IOSPaymentInstrumentLauncherTest,
+       ReceiveResponseFromIOSPaymentInstrument_WellFormedResponse) {
+  FakePaymentInstrumentDelegate instrument_delegate;
+  IOSPaymentInstrumentLauncher launcher;
+
+  EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsReadyCalled());
+  EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsErrorCalled());
+
+  base::DictionaryValue response;
+  response.SetInteger("success", 1);
+  response.SetString("methodName", "visa");
+  response.SetString("details", "Some details");
+  std::string stringified_response;
+  base::JSONWriter::Write(response, &stringified_response);
+  std::string base_64_params;
+  base::Base64Encode(stringified_response, &base_64_params);
+
+  launcher.set_delegate(&instrument_delegate);
+  launcher.ReceiveResponseFromIOSPaymentInstrument(base_64_params);
+
+  EXPECT_TRUE(instrument_delegate.WasOnInstrumentDetailsReadyCalled());
+  EXPECT_FALSE(instrument_delegate.WasOnInstrumentDetailsErrorCalled());
+}
+
+}  // namespace payments
diff --git a/ios/chrome/browser/payments/payment_request.h b/ios/chrome/browser/payments/payment_request.h
index 75215f9..42323eac 100644
--- a/ios/chrome/browser/payments/payment_request.h
+++ b/ios/chrome/browser/payments/payment_request.h
@@ -63,7 +63,7 @@
 
 // Called when a native iOS payment app should be launched.
 - (void)paymentInstrument:(payments::IOSPaymentInstrument*)paymentInstrument
-    launchAppWithUniversalLink:(std::string)universalLink
+    launchAppWithUniversalLink:(GURL)universalLink
             instrumentDelegate:(payments::PaymentInstrument::Delegate*)delegate;
 
 @end
diff --git a/ios/chrome/browser/payments/payment_response_helper.h b/ios/chrome/browser/payments/payment_response_helper.h
index 42d87b4..5434272 100644
--- a/ios/chrome/browser/payments/payment_response_helper.h
+++ b/ios/chrome/browser/payments/payment_response_helper.h
@@ -20,6 +20,9 @@
 // Called when the payment method details have been successfully received.
 - (void)paymentResponseHelperDidReceivePaymentMethodDetails;
 
+// Called if an error occured when attempting to receive payment method details.
+- (void)paymentResponseHelperDidFailToReceivePaymentMethodDetails;
+
 // Called when the payment method details have been successfully received and
 // the shipping address and the contact info are normalized, if applicable.
 - (void)paymentResponseHelperDidCompleteWithPaymentResponse:
@@ -44,7 +47,7 @@
   void OnInstrumentDetailsReady(
       const std::string& method_name,
       const std::string& stringified_details) override;
-  void OnInstrumentDetailsError() override {}
+  void OnInstrumentDetailsError() override;
 
  private:
   // Called when the AddressNormalizationManager is done, whether any autofill
diff --git a/ios/chrome/browser/payments/payment_response_helper.mm b/ios/chrome/browser/payments/payment_response_helper.mm
index 9535010..4801802 100644
--- a/ios/chrome/browser/payments/payment_response_helper.mm
+++ b/ios/chrome/browser/payments/payment_response_helper.mm
@@ -59,6 +59,10 @@
           &PaymentResponseHelper::AddressNormalizationCompleted, AsWeakPtr()));
 }
 
+void PaymentResponseHelper::OnInstrumentDetailsError() {
+  [consumer_ paymentResponseHelperDidFailToReceivePaymentMethodDetails];
+}
+
 void PaymentResponseHelper::AddressNormalizationCompleted() {
   web::PaymentResponse response;
 
diff --git a/ios/chrome/browser/payments/payment_response_helper_unittest.mm b/ios/chrome/browser/payments/payment_response_helper_unittest.mm
index 1cc2d814..41eeac4f 100644
--- a/ios/chrome/browser/payments/payment_response_helper_unittest.mm
+++ b/ios/chrome/browser/payments/payment_response_helper_unittest.mm
@@ -46,6 +46,9 @@
 - (void)paymentResponseHelperDidReceivePaymentMethodDetails {
 }
 
+- (void)paymentResponseHelperDidFailToReceivePaymentMethodDetails {
+}
+
 - (void)paymentResponseHelperDidCompleteWithPaymentResponse:
     (const web::PaymentResponse&)paymentResponse {
   return static_cast<
diff --git a/ios/chrome/browser/reading_list/OWNERS b/ios/chrome/browser/reading_list/OWNERS
index c6815f7..ccd8b4f 100644
--- a/ios/chrome/browser/reading_list/OWNERS
+++ b/ios/chrome/browser/reading_list/OWNERS
@@ -1,2 +1,5 @@
 noyau@chromium.org
 olivierrobin@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/services/OWNERS b/ios/chrome/browser/services/OWNERS
index b380428a..f0db296d 100644
--- a/ios/chrome/browser/services/OWNERS
+++ b/ios/chrome/browser/services/OWNERS
@@ -1,3 +1,6 @@
 zea@chromium.org
 
 # COMPONENT: Services>CloudMessaging
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/services/gcm/OWNERS b/ios/chrome/browser/services/gcm/OWNERS
index 295d996..2271273 100644
--- a/ios/chrome/browser/services/gcm/OWNERS
+++ b/ios/chrome/browser/services/gcm/OWNERS
@@ -4,3 +4,6 @@
 zea@chromium.org
 
 # COMPONENT: Services>CloudMessaging
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/sessions/OWNERS b/ios/chrome/browser/sessions/OWNERS
index 40a68c7..b127701 100644
--- a/ios/chrome/browser/sessions/OWNERS
+++ b/ios/chrome/browser/sessions/OWNERS
@@ -1 +1,4 @@
 rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/share_extension/OWNERS b/ios/chrome/browser/share_extension/OWNERS
index 4a03091..6a63c2b3 100644
--- a/ios/chrome/browser/share_extension/OWNERS
+++ b/ios/chrome/browser/share_extension/OWNERS
@@ -1,2 +1,5 @@
 gambard@chromium.org
 olivierrobin@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/signin/OWNERS b/ios/chrome/browser/signin/OWNERS
index bdb69b2..a8f0801c 100644
--- a/ios/chrome/browser/signin/OWNERS
+++ b/ios/chrome/browser/signin/OWNERS
@@ -3,3 +3,6 @@
 msarda@chromium.org
 
 # COMPONENT: Services>SignIn
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/snapshots/OWNERS b/ios/chrome/browser/snapshots/OWNERS
index d13827d..f4823b16 100644
--- a/ios/chrome/browser/snapshots/OWNERS
+++ b/ios/chrome/browser/snapshots/OWNERS
@@ -1,2 +1,5 @@
 jif@chromium.org
 justincohen@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ssl/OWNERS b/ios/chrome/browser/ssl/OWNERS
index 115e3a7..b9da33cc 100644
--- a/ios/chrome/browser/ssl/OWNERS
+++ b/ios/chrome/browser/ssl/OWNERS
@@ -2,3 +2,6 @@
 felt@chromium.org
 
 # COMPONENT: Security>UX
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/store_kit/OWNERS b/ios/chrome/browser/store_kit/OWNERS
index d2e1add..c85e66a 100644
--- a/ios/chrome/browser/store_kit/OWNERS
+++ b/ios/chrome/browser/store_kit/OWNERS
@@ -1 +1,4 @@
 jif@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/suggestions/OWNERS b/ios/chrome/browser/suggestions/OWNERS
index 1986f2f0..2c6e9e7 100644
--- a/ios/chrome/browser/suggestions/OWNERS
+++ b/ios/chrome/browser/suggestions/OWNERS
@@ -4,3 +4,4 @@
 
 # TEAM: ntp-dev@chromium.org
 # COMPONENT: UI>Browser>NewTabPage
+# OS: iOS
diff --git a/ios/chrome/browser/sync/OWNERS b/ios/chrome/browser/sync/OWNERS
index 261ab18..c1575f5 100644
--- a/ios/chrome/browser/sync/OWNERS
+++ b/ios/chrome/browser/sync/OWNERS
@@ -1 +1,4 @@
 file://components/sync/OWNERS
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/tabs/OWNERS b/ios/chrome/browser/tabs/OWNERS
index 40a68c7..b127701 100644
--- a/ios/chrome/browser/tabs/OWNERS
+++ b/ios/chrome/browser/tabs/OWNERS
@@ -1 +1,4 @@
 rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/tabs/tab.mm b/ios/chrome/browser/tabs/tab.mm
index 044b7bd..6c12045 100644
--- a/ios/chrome/browser/tabs/tab.mm
+++ b/ios/chrome/browser/tabs/tab.mm
@@ -102,6 +102,7 @@
 #import "ios/chrome/browser/web/auto_reload_bridge.h"
 #import "ios/chrome/browser/web/external_app_launcher.h"
 #import "ios/chrome/browser/web/navigation_manager_util.h"
+#import "ios/chrome/browser/web/page_placeholder_tab_helper.h"
 #import "ios/chrome/browser/web/passkit_dialog_provider.h"
 #include "ios/chrome/browser/web/print_observer.h"
 #import "ios/chrome/browser/web/tab_id_tab_helper.h"
@@ -231,6 +232,9 @@
   // YES if the Tab needs to be reloaded after the app becomes active.
   BOOL _requireReloadAfterBecomingActive;
 
+  // YES if the Tab needs to be reloaded after displaying.
+  BOOL _requireReloadOnDisplay;
+
   // Last visited timestamp.
   double _lastVisitedTimestamp;
 
@@ -1227,7 +1231,7 @@
     self.navigationManager->Reload(web::ReloadType::NORMAL,
                                    false /* check_for_repost */);
   } else {
-    [self.webController requirePageReload];
+    _requireReloadOnDisplay = YES;
   }
   _requireReloadAfterBecomingActive = NO;
 }
@@ -1719,13 +1723,10 @@
     if (!applicationIsNotActive)
       [_fullScreenController disableFullScreen];
   } else {
-    [self.webController requirePageReload];
+    _requireReloadOnDisplay = YES;
   }
   // Returning to the app (after the renderer crashed in the background) and
   // having the page reload is much less confusing for the user.
-  // Note: Given that the tab is visible, calling |requirePageReload| will not
-  // work when the app becomes active because there is nothing to trigger
-  // a view redisplay in that scenario.
   _requireReloadAfterBecomingActive = _visible && applicationIsNotActive;
   [self.dialogDelegate cancelDialogForTab:self];
 }
@@ -1813,6 +1814,13 @@
   if (self.webState)
     self.webState->WasShown();
   [_inputAccessoryViewController wasShown];
+
+  if (_requireReloadOnDisplay) {
+    PagePlaceholderTabHelper::FromWebState(self.webState)
+        ->AddPlaceholderForNextNavigation();
+    [self.webController loadCurrentURL];
+    _requireReloadOnDisplay = NO;
+  }
 }
 
 - (void)wasHidden {
diff --git a/ios/chrome/browser/translate/OWNERS b/ios/chrome/browser/translate/OWNERS
index ca1bcb6a..51f79e89 100644
--- a/ios/chrome/browser/translate/OWNERS
+++ b/ios/chrome/browser/translate/OWNERS
@@ -1,2 +1,5 @@
 file://components/translate/OWNERS
 droger@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/u2f/OWNERS b/ios/chrome/browser/u2f/OWNERS
index ea2dcf4..bd6fe7d6 100644
--- a/ios/chrome/browser/u2f/OWNERS
+++ b/ios/chrome/browser/u2f/OWNERS
@@ -1 +1,4 @@
 eugenebut@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/OWNERS b/ios/chrome/browser/ui/OWNERS
index 7e77d32..1ccf6c3c 100644
--- a/ios/chrome/browser/ui/OWNERS
+++ b/ios/chrome/browser/ui/OWNERS
@@ -3,3 +3,6 @@
 # like it needs extra review, or is related to the Omnibox.
 marq@chromium.org
 rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/activity_services/OWNERS b/ios/chrome/browser/ui/activity_services/OWNERS
index d2e1add..c85e66a 100644
--- a/ios/chrome/browser/ui/activity_services/OWNERS
+++ b/ios/chrome/browser/ui/activity_services/OWNERS
@@ -1 +1,4 @@
 jif@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/alert_coordinator/OWNERS b/ios/chrome/browser/ui/alert_coordinator/OWNERS
index 0f2892e..8b593c3 100644
--- a/ios/chrome/browser/ui/alert_coordinator/OWNERS
+++ b/ios/chrome/browser/ui/alert_coordinator/OWNERS
@@ -1,2 +1,5 @@
 gambard@chromium.org
 michaeldo@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/authentication/BUILD.gn b/ios/chrome/browser/ui/authentication/BUILD.gn
index b0e8632..5d7f181 100644
--- a/ios/chrome/browser/ui/authentication/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/BUILD.gn
@@ -188,7 +188,6 @@
     "//ios/chrome/browser",
     "//ios/chrome/browser/signin",
     "//ios/chrome/browser/ui",
-    "//ios/chrome/browser/ui/authentication:authentication_ui",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/ntp:ntp_controller",
     "//ios/chrome/browser/ui/settings",
diff --git a/ios/chrome/browser/ui/authentication/OWNERS b/ios/chrome/browser/ui/authentication/OWNERS
index bdb69b2..a8f0801c 100644
--- a/ios/chrome/browser/ui/authentication/OWNERS
+++ b/ios/chrome/browser/ui/authentication/OWNERS
@@ -3,3 +3,6 @@
 msarda@chromium.org
 
 # COMPONENT: Services>SignIn
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/authentication/signin_interaction_controller_egtest.mm b/ios/chrome/browser/ui/authentication/signin_interaction_controller_egtest.mm
index a4470ba..64a0a75 100644
--- a/ios/chrome/browser/ui/authentication/signin_interaction_controller_egtest.mm
+++ b/ios/chrome/browser/ui/authentication/signin_interaction_controller_egtest.mm
@@ -10,14 +10,9 @@
 #include "components/signin/core/browser/signin_manager.h"
 #include "ios/chrome/browser/experimental_flags.h"
 #include "ios/chrome/browser/signin/signin_manager_factory.h"
-#import "ios/chrome/browser/ui/authentication/signin_promo_view.h"
 #import "ios/chrome/browser/ui/commands/open_url_command.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_controller.h"
-#import "ios/chrome/browser/ui/settings/accounts_collection_view_controller.h"
-#import "ios/chrome/browser/ui/settings/import_data_collection_view_controller.h"
-#import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h"
 #include "ios/chrome/browser/ui/tools_menu/tools_menu_constants.h"
-#import "ios/chrome/browser/ui/tools_menu/tools_popup_controller.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
@@ -63,21 +58,6 @@
       forConfigKey:kGREYConfigKeySynchronizationEnabled];
 }
 
-// Taps the view with accessibility matcher |accessibility_matcher|.
-void TapViewWithMatcher(id<GREYMatcher> accessibility_matcher) {
-  // grey_sufficientlyVisible() is necessary because reloading a cell in a
-  // collection view might duplicate it (with the old one being hidden but
-  // EarlGrey can find it).
-  id<GREYMatcher> matcher =
-      grey_allOf(accessibility_matcher, grey_sufficientlyVisible(), nil);
-  [[EarlGrey selectElementWithMatcher:matcher] performAction:grey_tap()];
-}
-
-// Taps the view with acessibility identifier |accessibility_id|.
-void TapViewWithAccessibilityId(NSString* accessiblity_id) {
-  TapViewWithMatcher(grey_accessibilityID(accessiblity_id));
-}
-
 // Taps the button with accessibility label |label|.
 void TapButtonWithAccessibilityLabel(NSString* label) {
   id<GREYMatcher> matcher =
@@ -164,13 +144,16 @@
   AssertAuthenticatedIdentityInActiveProfile(identity1);
 
   // Open accounts settings, then sync settings.
-  TapViewWithAccessibilityId(kSettingsAccountCellId);
-  TapViewWithAccessibilityId(kSettingsAccountsSyncCellId);
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()]
+      performAction:grey_tap()];
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::AccountsSyncButton()]
+      performAction:grey_tap()];
 
   // Switch Sync account to |identity2|.
   TapButtonWithAccessibilityLabel(identity2.userEmail);
-
-  TapViewWithAccessibilityId(kImportDataKeepSeparateCellId);
+  [[EarlGrey selectElementWithMatcher:
+                 chrome_test_util::SettingsImportDataKeepSeparateButton()]
+      performAction:grey_tap()];
   TapButtonWithLabelId(IDS_IOS_OPTIONS_IMPORT_DATA_CONTINUE_BUTTON);
 
   // Check the signed-in user did change.
@@ -199,13 +182,16 @@
   AssertAuthenticatedIdentityInActiveProfile(identity1);
 
   // Open accounts settings, then sync settings.
-  TapViewWithAccessibilityId(kSettingsAccountCellId);
-  TapViewWithAccessibilityId(kSettingsAccountsSyncCellId);
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()]
+      performAction:grey_tap()];
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::AccountsSyncButton()]
+      performAction:grey_tap()];
 
   // Switch Sync account to |identity2|.
   TapButtonWithAccessibilityLabel(identity2.userEmail);
-
-  TapViewWithAccessibilityId(kImportDataImportCellId);
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::
+                                          SettingsImportDataImportButton()]
+      performAction:grey_tap()];
   TapButtonWithLabelId(IDS_IOS_OPTIONS_IMPORT_DATA_CONTINUE_BUTTON);
 
   // Check the signed-in user did change.
@@ -246,8 +232,11 @@
   AssertAuthenticatedIdentityInActiveProfile(managed_identity);
 
   // Switch Sync account to |identity|.
-  TapViewWithAccessibilityId(kSettingsAccountCellId);
-  TapViewWithAccessibilityId(kSettingsAccountsSyncCellId);
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()]
+      performAction:grey_tap()];
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::AccountsSyncButton()]
+      performAction:grey_tap()];
+
   TapButtonWithAccessibilityLabel(identity.userEmail);
 
   SetEarlGreySynchronizationEnabled(NO);
@@ -276,16 +265,19 @@
   AssertAuthenticatedIdentityInActiveProfile(identity);
 
   // Go to Accounts Settings and tap the sign out button.
-  TapViewWithAccessibilityId(kSettingsAccountCellId);
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()]
+      performAction:grey_tap()];
+
   const CGFloat scroll_displacement = 100.0;
-  [[[EarlGrey selectElementWithMatcher:grey_accessibilityID(
-                                           kSettingsAccountsSignoutCellId)]
+  [[[EarlGrey
+      selectElementWithMatcher:grey_allOf(
+                                   chrome_test_util::SignOutAccountsButton(),
+                                   grey_interactable(), nil)]
          usingSearchAction:grey_scrollInDirection(kGREYDirectionDown,
                                                   scroll_displacement)
-      onElementWithMatcher:grey_accessibilityID(kSettingsAccountsId)]
+      onElementWithMatcher:chrome_test_util::SettingsAccountsCollectionView()]
       performAction:grey_tap()];
   TapButtonWithLabelId(IDS_IOS_DISCONNECT_DIALOG_CONTINUE_BUTTON_MOBILE);
-
   [[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()]
       performAction:grey_tap()];
 
@@ -319,16 +311,19 @@
   AssertAuthenticatedIdentityInActiveProfile(identity);
 
   // Go to Accounts Settings and tap the sign out button.
-  TapViewWithAccessibilityId(kSettingsAccountCellId);
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()]
+      performAction:grey_tap()];
+
   const CGFloat scroll_displacement = 100.0;
-  [[[EarlGrey selectElementWithMatcher:grey_accessibilityID(
-                                           kSettingsAccountsSignoutCellId)]
+  [[[EarlGrey
+      selectElementWithMatcher:grey_allOf(
+                                   chrome_test_util::SignOutAccountsButton(),
+                                   grey_interactable(), nil)]
          usingSearchAction:grey_scrollInDirection(kGREYDirectionDown,
                                                   scroll_displacement)
-      onElementWithMatcher:grey_accessibilityID(kSettingsAccountsId)]
+      onElementWithMatcher:chrome_test_util::SettingsAccountsCollectionView()]
       performAction:grey_tap()];
   TapButtonWithLabelId(IDS_IOS_MANAGED_DISCONNECT_DIALOG_ACCEPT);
-
   [[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()]
       performAction:grey_tap()];
 
@@ -463,18 +458,22 @@
   AssertAuthenticatedIdentityInActiveProfile(identity2);
 
   // Go to Accounts Settings and tap the sign out button.
-  TapViewWithAccessibilityId(kSettingsAccountCellId);
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsAccountButton()]
+      performAction:grey_tap()];
+
   const CGFloat scroll_displacement = 100.0;
-  [[[EarlGrey selectElementWithMatcher:grey_accessibilityID(
-                                           kSettingsAccountsSignoutCellId)]
+  [[[EarlGrey
+      selectElementWithMatcher:grey_allOf(
+                                   chrome_test_util::SignOutAccountsButton(),
+                                   grey_interactable(), nil)]
          usingSearchAction:grey_scrollInDirection(kGREYDirectionDown,
                                                   scroll_displacement)
-      onElementWithMatcher:grey_accessibilityID(kSettingsAccountsId)]
+      onElementWithMatcher:chrome_test_util::SettingsAccountsCollectionView()]
       performAction:grey_tap()];
   TapButtonWithLabelId(IDS_IOS_DISCONNECT_DIALOG_CONTINUE_BUTTON_MOBILE);
   AssertAuthenticatedIdentityInActiveProfile(nil);
-
-  TapViewWithMatcher(chrome_test_util::SignInMenuButton());
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::SignInMenuButton()]
+      performAction:grey_tap()];
   [ChromeEarlGreyUI signInToIdentityByEmail:identity1.userEmail];
 
   // Open new tab to cancel sign-in.
@@ -514,7 +513,7 @@
       selectElementWithMatcher:grey_accessibilityID(kToolsMenuBookmarksId)]
          usingSearchAction:grey_scrollInDirection(kGREYDirectionDown,
                                                   scroll_displacement)
-      onElementWithMatcher:grey_accessibilityID(kToolsMenuTableViewId)]
+      onElementWithMatcher:chrome_test_util::ToolsMenuView()]
       performAction:grey_tap()];
 
   if (!IsIPadIdiom()) {
@@ -530,8 +529,7 @@
                  grey_descendant(grey_text(topLevelFolderTitle)), nil);
   [[EarlGrey selectElementWithMatcher:all_bookmarks_matcher]
       performAction:grey_tap()];
-
-  TapViewWithAccessibilityId(kSigninPromoSecondaryButtonId);
+  TapButtonWithLabelId(IDS_IOS_BOOKMARK_PROMO_SIGN_IN_BUTTON);
 
   // Assert sign-in screen was shown.
   id<GREYMatcher> signin_matcher =
@@ -552,7 +550,7 @@
       selectElementWithMatcher:grey_accessibilityID(kToolsMenuBookmarksId)]
          usingSearchAction:grey_scrollInDirection(kGREYDirectionDown,
                                                   scroll_displacement)
-      onElementWithMatcher:grey_accessibilityID(kToolsMenuTableViewId)]
+      onElementWithMatcher:chrome_test_util::ToolsMenuView()]
       performAction:grey_tap()];
   if (!IsIPadIdiom()) {
     [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Menu")]
@@ -560,7 +558,7 @@
   }
   [[EarlGrey selectElementWithMatcher:all_bookmarks_matcher]
       performAction:grey_tap()];
-  TapViewWithAccessibilityId(kSigninPromoSecondaryButtonId);
+  TapButtonWithLabelId(IDS_IOS_BOOKMARK_PROMO_SIGN_IN_BUTTON);
   [[EarlGrey selectElementWithMatcher:signin_matcher]
       assertWithMatcher:grey_sufficientlyVisible()];
 
diff --git a/ios/chrome/browser/ui/authentication/signin_promo_view.h b/ios/chrome/browser/ui/authentication/signin_promo_view.h
index fda056f..d9eaa275 100644
--- a/ios/chrome/browser/ui/authentication/signin_promo_view.h
+++ b/ios/chrome/browser/ui/authentication/signin_promo_view.h
@@ -20,11 +20,6 @@
   SigninPromoViewModeWarmState,
 };
 
-extern NSString* const kSigninPromoViewId;
-extern NSString* const kSigninPromoPrimaryButtonId;
-extern NSString* const kSigninPromoSecondaryButtonId;
-extern NSString* const kSigninPromoCloseButtonId;
-
 // This class creates an image view, a label and 2 buttons. This view can be
 // configured with 2 modes : "Cold State" and "Warm State".
 // + "Cold State" mode displays the chomium icon in the image view, and only
diff --git a/ios/chrome/browser/ui/authentication/signin_promo_view.mm b/ios/chrome/browser/ui/authentication/signin_promo_view.mm
index b67421d..31bb7b38 100644
--- a/ios/chrome/browser/ui/authentication/signin_promo_view.mm
+++ b/ios/chrome/browser/ui/authentication/signin_promo_view.mm
@@ -32,12 +32,6 @@
 const CGFloat kButtonHeight = 36;
 }
 
-NSString* const kSigninPromoViewId = @"kSigninPromoViewId";
-NSString* const kSigninPromoPrimaryButtonId = @"kSigninPromoPrimaryButtonId";
-NSString* const kSigninPromoSecondaryButtonId =
-    @"kSigninPromoSecondaryButtonId";
-NSString* const kSigninPromoCloseButtonId = @"kSigninPromoCloseButtonId";
-
 @implementation SigninPromoView {
   NSArray<NSLayoutConstraint*>* _coldStateConstraints;
   NSArray<NSLayoutConstraint*>* _warmStateConstraints;
@@ -56,7 +50,6 @@
   self = [super initWithFrame:frame];
   if (self) {
     self.isAccessibilityElement = YES;
-    self.accessibilityIdentifier = kSigninPromoViewId;
 
     // Adding subviews.
     self.clipsToBounds = YES;
@@ -70,7 +63,7 @@
 
     _primaryButton = [[MDCFlatButton alloc] init];
     _primaryButton.translatesAutoresizingMaskIntoConstraints = NO;
-    _primaryButton.accessibilityIdentifier = kSigninPromoPrimaryButtonId;
+    _primaryButton.accessibilityIdentifier = @"signin_promo_primary_button";
     _primaryButton.titleLabel.lineBreakMode = NSLineBreakByTruncatingTail;
     [_primaryButton addTarget:self
                        action:@selector(onPrimaryButtonAction:)
@@ -79,7 +72,7 @@
 
     _secondaryButton = [[MDCFlatButton alloc] init];
     _secondaryButton.translatesAutoresizingMaskIntoConstraints = NO;
-    _secondaryButton.accessibilityIdentifier = kSigninPromoSecondaryButtonId;
+    _secondaryButton.accessibilityIdentifier = @"signin_promo_secondary_button";
     [_secondaryButton addTarget:self
                          action:@selector(onSecondaryButtonAction:)
                forControlEvents:UIControlEventTouchUpInside];
@@ -87,7 +80,7 @@
 
     _closeButton = [[UIButton alloc] init];
     _closeButton.translatesAutoresizingMaskIntoConstraints = NO;
-    _closeButton.accessibilityIdentifier = kSigninPromoCloseButtonId;
+    _closeButton.accessibilityIdentifier = @"signin_promo_close_button";
     [self addSubview:_closeButton];
 
     // Adding style.
diff --git a/ios/chrome/browser/ui/autofill/OWNERS b/ios/chrome/browser/ui/autofill/OWNERS
index 6a806bd..adccd5d 100644
--- a/ios/chrome/browser/ui/autofill/OWNERS
+++ b/ios/chrome/browser/ui/autofill/OWNERS
@@ -1 +1,4 @@
 mahmadi@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm b/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm
index 5ee028e..daf24718 100644
--- a/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm
+++ b/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm
@@ -100,9 +100,9 @@
   } else {
     if (allow_retry) {
       [view_controller_
-          showCVCInputFormWithError:SysUTF16ToNSString(error_message)];
+          showCVCInputFormWithError:base::SysUTF16ToNSString(error_message)];
     } else {
-      [view_controller_ showError:SysUTF16ToNSString(error_message)];
+      [view_controller_ showError:base::SysUTF16ToNSString(error_message)];
     }
   }
 }
@@ -151,7 +151,8 @@
       [super initWithLayout:layout style:CollectionViewControllerStyleAppBar];
   if (self) {
     _bridge = bridge;
-    self.title = SysUTF16ToNSString(_bridge->GetController()->GetWindowTitle());
+    self.title =
+        base::SysUTF16ToNSString(_bridge->GetController()->GetWindowTitle());
   }
   return self;
 }
@@ -175,7 +176,7 @@
   self.navigationItem.leftBarButtonItem = _cancelButton;
 
   NSString* verifyButtonText =
-      SysUTF16ToNSString(_bridge->GetController()->GetOkButtonLabel());
+      base::SysUTF16ToNSString(_bridge->GetController()->GetOkButtonLabel());
   _verifyButton =
       [[UIBarButtonItem alloc] initWithTitle:verifyButtonText
                                        style:UIBarButtonItemStylePlain
@@ -215,7 +216,7 @@
 
   autofill::CardUnmaskPromptController* controller = _bridge->GetController();
   NSString* instructions =
-      SysUTF16ToNSString(controller->GetInstructionsMessage());
+      base::SysUTF16ToNSString(controller->GetInstructionsMessage());
   int CVCImageResourceID = controller->GetCvcImageRid();
   _CVCItem = [[CVCItem alloc] initWithType:ItemTypeCVC];
   _CVCItem.instructionsText = instructions;
@@ -473,8 +474,8 @@
 
 - (void)onNewCardLinkTapped:(UIButton*)button {
   _bridge->GetController()->NewCardLinkClicked();
-  _CVCItem.instructionsText =
-      SysUTF16ToNSString(_bridge->GetController()->GetInstructionsMessage());
+  _CVCItem.instructionsText = base::SysUTF16ToNSString(
+      _bridge->GetController()->GetInstructionsMessage());
   _CVCItem.monthText = @"";
   _CVCItem.yearText = @"";
   _CVCItem.CVCText = @"";
diff --git a/ios/chrome/browser/ui/bookmarks/BUILD.gn b/ios/chrome/browser/ui/bookmarks/BUILD.gn
index 8d4f289..91ce5d6 100644
--- a/ios/chrome/browser/ui/bookmarks/BUILD.gn
+++ b/ios/chrome/browser/ui/bookmarks/BUILD.gn
@@ -187,7 +187,6 @@
     "//ios/chrome/browser/bookmarks:bookmarks_utils",
     "//ios/chrome/browser/browser_state",
     "//ios/chrome/browser/ui",
-    "//ios/chrome/browser/ui/authentication:authentication_ui",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/toolbar",
     "//ios/chrome/browser/ui/tools_menu",
diff --git a/ios/chrome/browser/ui/bookmarks/OWNERS b/ios/chrome/browser/ui/bookmarks/OWNERS
index 3b99155..f6480c4 100644
--- a/ios/chrome/browser/ui/bookmarks/OWNERS
+++ b/ios/chrome/browser/ui/bookmarks/OWNERS
@@ -1,3 +1,6 @@
 noyau@chromium.org
 lpromero@chromium.org
 ramyasharma@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
index 785d4e4..bb64711 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
@@ -18,7 +18,6 @@
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/experimental_flags.h"
 #include "ios/chrome/browser/pref_names.h"
-#import "ios/chrome/browser/ui/authentication/signin_promo_view.h"
 #import "ios/chrome/browser/ui/commands/generic_chrome_command.h"
 #include "ios/chrome/browser/ui/commands/ios_command_ids.h"
 #import "ios/chrome/browser/ui/toolbar/toolbar_controller.h"
@@ -637,28 +636,12 @@
   // Tap the edit action.
   [[EarlGrey selectElementWithMatcher:ActionSheet(ActionEdit)]
       performAction:grey_tap()];
-
-  // Replace the title field with new text.
-  // TODO(crbug.com/644730): Use grey_replaceText instead of
-  // grey_clearText/grey_typeText when EarlGrey's issue is fixed:
-  // https://github.com/google/EarlGrey/issues/253
   [[EarlGrey
       selectElementWithMatcher:grey_accessibilityID(@"Title Field_textField")]
-      performAction:grey_clearText()];
-  [[EarlGrey
-      selectElementWithMatcher:grey_accessibilityID(@"Title Field_textField")]
-      performAction:grey_typeText(@"n5")];
-
-  // Replace the url field with new text.
-  // TODO(crbug.com/644730): Use grey_replaceText instead of
-  // grey_clearText/grey_typeText when EarlGrey's issue is fixed:
-  // https://github.com/google/EarlGrey/issues/253
+      performAction:grey_replaceText(@"n5")];
   [[EarlGrey
       selectElementWithMatcher:grey_accessibilityID(@"URL Field_textField")]
-      performAction:grey_clearText()];
-  [[EarlGrey
-      selectElementWithMatcher:grey_accessibilityID(@"URL Field_textField")]
-      performAction:grey_typeText(@"www.a.fr")];
+      performAction:grey_replaceText(@"www.a.fr")];
 
   // Dismiss editor.
   [[EarlGrey selectElementWithMatcher:BookmarksDoneButton()]
@@ -687,28 +670,12 @@
   // Tap the edit action.
   [[EarlGrey selectElementWithMatcher:ActionSheet(ActionEdit)]
       performAction:grey_tap()];
-
-  // Replace the title field with new text.
-  // TODO(crbug.com/644730): Use grey_replaceText instead of
-  // grey_clearText/grey_typeText when EarlGrey's issue is fixed:
-  // https://github.com/google/EarlGrey/issues/253
   [[EarlGrey
       selectElementWithMatcher:grey_accessibilityID(@"Title Field_textField")]
-      performAction:grey_clearText()];
-  [[EarlGrey
-      selectElementWithMatcher:grey_accessibilityID(@"Title Field_textField")]
-      performAction:grey_typeText(@"n5")];
-
-  // Replace the url field with new text.
-  // TODO(crbug.com/644730): Use grey_replaceText instead of
-  // grey_clearText/grey_typeText when EarlGrey's issue is fixed:
-  // https://github.com/google/EarlGrey/issues/253
+      performAction:grey_replaceText(@"n5")];
   [[EarlGrey
       selectElementWithMatcher:grey_accessibilityID(@"URL Field_textField")]
-      performAction:grey_clearText()];
-  [[EarlGrey
-      selectElementWithMatcher:grey_accessibilityID(@"URL Field_textField")]
-      performAction:grey_typeText(@"www.a.fr")];
+      performAction:grey_replaceText(@"www.a.fr")];
 
   // Dismiss editor with Cancel button.
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Cancel")]
@@ -763,15 +730,8 @@
   [[EarlGrey
       selectElementWithMatcher:grey_accessibilityID(@"Edit_navigation_bar")]
       performAction:grey_tap()];
-
-  // Change the title.
-  // TODO(crbug.com/644730): Use grey_replaceText instead of
-  // grey_clearText/grey_typeText when EarlGrey's issue is fixed:
-  // https://github.com/google/EarlGrey/issues/253
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Title_textField")]
-      performAction:grey_clearText()];
-  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Title_textField")]
-      performAction:grey_typeText(@"Renamed Folder")];
+      performAction:grey_replaceText(@"Renamed Folder")];
 
   // Cancel without saving.
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Cancel")]
@@ -785,15 +745,8 @@
   [[EarlGrey
       selectElementWithMatcher:grey_accessibilityID(@"Edit_navigation_bar")]
       performAction:grey_tap()];
-
-  // Change the title.
-  // TODO(crbug.com/644730): Use grey_replaceText instead of
-  // grey_clearText/grey_typeText when EarlGrey's issue is fixed:
-  // https://github.com/google/EarlGrey/issues/253
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Title_textField")]
-      performAction:grey_clearText()];
-  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Title_textField")]
-      performAction:grey_typeText(@"Renamed Folder")];
+      performAction:grey_replaceText(@"Renamed Folder")];
 
   // Save.
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Save")]
@@ -1096,16 +1049,16 @@
   }];
   // Check that promo is visible.
   [BookmarksTestCase verifyPromoAlreadySeen:NO];
-  [[EarlGrey selectElementWithMatcher:chrome_test_util::SignInPromoView()]
-      assertWithMatcher:grey_sufficientlyVisible()];
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"promo_view")]
+      assertWithMatcher:grey_notNil()];
 
   // Tap the dismiss button.
   [[EarlGrey
-      selectElementWithMatcher:grey_accessibilityID(kSigninPromoCloseButtonId)]
+      selectElementWithMatcher:grey_accessibilityID(@"promo_no_thanks_button")]
       performAction:grey_tap()];
 
   // Wait until promo is gone.
-  [[EarlGrey selectElementWithMatcher:chrome_test_util::SignInPromoView()]
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"promo_view")]
       assertWithMatcher:grey_notVisible()];
 
   // Check that the promo already seen state is updated.
@@ -1127,16 +1080,12 @@
 
   // Check that promo is visible.
   [BookmarksTestCase verifyPromoAlreadySeen:NO];
-  [[EarlGrey
-      selectElementWithMatcher:grey_allOf(chrome_test_util::SignInPromoView(),
-                                          grey_sufficientlyVisible(), nil)]
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"promo_view")]
       assertWithMatcher:grey_notNil()];
 
   // Tap the Sign in button.
   [[EarlGrey
-      selectElementWithMatcher:grey_allOf(grey_accessibilityID(
-                                              kSigninPromoSecondaryButtonId),
-                                          grey_sufficientlyVisible(), nil)]
+      selectElementWithMatcher:grey_accessibilityID(@"promo_sign_in_button")]
       performAction:grey_tap()];
 
   // Tap the CANCEL button.
@@ -1146,9 +1095,7 @@
                      uppercaseString])] performAction:grey_tap()];
 
   // Check that the bookmarks UI reappeared and the cell is still here.
-  [[EarlGrey
-      selectElementWithMatcher:grey_allOf(chrome_test_util::SignInPromoView(),
-                                          grey_sufficientlyVisible(), nil)]
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"promo_view")]
       assertWithMatcher:grey_notNil()];
 
   [BookmarksTestCase verifyPromoAlreadySeen:NO];
@@ -1351,25 +1298,8 @@
 // Rename folder title to |folderTitle|. Must be in edit folder UI.
 + (void)renameBookmarkFolderWithFolderTitle:(NSString*)folderTitle {
   NSString* titleIdentifier = @"Title_textField";
-
-  // Edit the title field.
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(titleIdentifier)]
-      performAction:grey_tap()];
-  // TODO(crbug.com/748748): Getting the clear button from the text field since
-  // the clear button has no accessibility label on iOS11/XCode9 betas thus we
-  // can't access it directly. EarlGray team believes that this could be a bug
-  // and might be fixed later on.
-  id<GREYMatcher> clearTextButton =
-      grey_allOf(grey_ancestor(grey_accessibilityID(titleIdentifier)),
-                 grey_kindOfClass([UIButton class]), nil);
-  [[EarlGrey selectElementWithMatcher:clearTextButton]
-      performAction:grey_tap()];
-
-  // Type in the new title and use '\n' to dismiss the keyboard.
-  NSString* folderTitleWithNewLine =
-      [NSString stringWithFormat:@"%@\n", folderTitle];
-  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(titleIdentifier)]
-      performAction:grey_typeText(folderTitleWithNewLine)];
+      performAction:grey_replaceText(folderTitle)];
 }
 
 // Tap on the star to bookmark a page, then edit the bookmark to change the
@@ -1384,21 +1314,7 @@
       performAction:grey_tap()];
   NSString* titleIdentifier = @"Title Field_textField";
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(titleIdentifier)]
-      performAction:grey_tap()];
-  // TODO(crbug.com/748748): Getting the clear button from the text field since
-  // the clear button has no accessibility label on iOS11/XCode9 betas thus we
-  // can't access it directly. EarlGray team believes that this could be a bug
-  // and might be fixed later on.
-  id<GREYMatcher> clearTextButton =
-      grey_allOf(grey_ancestor(grey_accessibilityID(titleIdentifier)),
-                 grey_kindOfClass([UIButton class]), nil);
-  [[EarlGrey selectElementWithMatcher:clearTextButton]
-      performAction:grey_tap()];
-
-  // Use '\n' to tap Done and dismiss the keyboard.
-  NSString* bookmarkTitle = [NSString stringWithFormat:@"%@\n", title];
-  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(titleIdentifier)]
-      performAction:grey_typeText(bookmarkTitle)];
+      performAction:grey_replaceText(title)];
 
   // Dismiss the window.
   [[EarlGrey selectElementWithMatcher:BookmarksDoneButton()]
@@ -1525,15 +1441,9 @@
 
   // Change the name of the folder.
   if (name.length > 0) {
-    // TODO(crbug.com/644730): Use grey_replaceText instead of
-    // grey_clearText/grey_typeText when EarlGrey's issue is fixed:
-    // https://github.com/google/EarlGrey/issues/253
     [[EarlGrey
         selectElementWithMatcher:grey_accessibilityID(@"Title_textField")]
-        performAction:grey_clearText()];
-    [[EarlGrey
-        selectElementWithMatcher:grey_accessibilityID(@"Title_textField")]
-        performAction:grey_typeText(name)];
+        performAction:grey_replaceText(name)];
   }
 
   // Tap the Save button.
diff --git a/ios/shared/chrome/browser/ui/browser_list/BUILD.gn b/ios/chrome/browser/ui/browser_list/BUILD.gn
similarity index 100%
rename from ios/shared/chrome/browser/ui/browser_list/BUILD.gn
rename to ios/chrome/browser/ui/browser_list/BUILD.gn
diff --git a/ios/shared/chrome/browser/ui/browser_list/DEPS b/ios/chrome/browser/ui/browser_list/DEPS
similarity index 100%
rename from ios/shared/chrome/browser/ui/browser_list/DEPS
rename to ios/chrome/browser/ui/browser_list/DEPS
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser.h b/ios/chrome/browser/ui/browser_list/browser.h
similarity index 87%
rename from ios/shared/chrome/browser/ui/browser_list/browser.h
rename to ios/chrome/browser/ui/browser_list/browser.h
index 213f8d1..665e031 100644
--- a/ios/shared/chrome/browser/ui/browser_list/browser.h
+++ b/ios/chrome/browser/ui/browser_list/browser.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 IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_H_
-#define IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_H_
+#ifndef IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_H_
+#define IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_H_
 
 #include <memory>
 
@@ -46,4 +46,4 @@
   DISALLOW_COPY_AND_ASSIGN(Browser);
 };
 
-#endif  // IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_H_
+#endif  // IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_H_
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser.mm b/ios/chrome/browser/ui/browser_list/browser.mm
similarity index 86%
rename from ios/shared/chrome/browser/ui/browser_list/browser.mm
rename to ios/chrome/browser/ui/browser_list/browser.mm
index b80b383..c4f8b380 100644
--- a/ios/shared/chrome/browser/ui/browser_list/browser.mm
+++ b/ios/chrome/browser/ui/browser_list/browser.mm
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 
+#import "ios/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/shared/chrome/browser/ui/broadcaster/chrome_broadcaster.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h"
 #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list.h b/ios/chrome/browser/ui/browser_list/browser_list.h
similarity index 86%
rename from ios/shared/chrome/browser/ui/browser_list/browser_list.h
rename to ios/chrome/browser/ui/browser_list/browser_list.h
index 11edf98f..a2a71e5 100644
--- a/ios/shared/chrome/browser/ui/browser_list/browser_list.h
+++ b/ios/chrome/browser/ui/browser_list/browser_list.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 IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_H_
-#define IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_H_
+#ifndef IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_H_
+#define IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_H_
 
 #include <memory>
 #include <vector>
@@ -11,7 +11,7 @@
 #include "base/macros.h"
 #include "base/observer_list.h"
 #include "base/supports_user_data.h"
-#include "ios/shared/chrome/browser/ui/browser_list/browser.h"
+#include "ios/chrome/browser/ui/browser_list/browser.h"
 
 class BrowserListObserver;
 
@@ -60,4 +60,4 @@
   DISALLOW_COPY_AND_ASSIGN(BrowserList);
 };
 
-#endif  // IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_H_
+#endif  // IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_H_
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list.mm b/ios/chrome/browser/ui/browser_list/browser_list.mm
similarity index 93%
rename from ios/shared/chrome/browser/ui/browser_list/browser_list.mm
rename to ios/chrome/browser/ui/browser_list/browser_list.mm
index 94a039f4..1bac1c2b 100644
--- a/ios/shared/chrome/browser/ui/browser_list/browser_list.mm
+++ b/ios/chrome/browser/ui/browser_list/browser_list.mm
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/shared/chrome/browser/ui/browser_list/browser_list.h"
+#import "ios/chrome/browser/ui/browser_list/browser_list.h"
 
 #include <stdint.h>
 
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser_list_observer.h"
+#import "ios/chrome/browser/ui/browser_list/browser_list_observer.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list_observer.h b/ios/chrome/browser/ui/browser_list/browser_list_observer.h
similarity index 76%
rename from ios/shared/chrome/browser/ui/browser_list/browser_list_observer.h
rename to ios/chrome/browser/ui/browser_list/browser_list_observer.h
index 6afc61e..dc13323 100644
--- a/ios/shared/chrome/browser/ui/browser_list/browser_list_observer.h
+++ b/ios/chrome/browser/ui/browser_list/browser_list_observer.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 IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_OBSERVER_H_
-#define IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_OBSERVER_H_
+#ifndef IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_OBSERVER_H_
+#define IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_OBSERVER_H_
 
 #include "base/macros.h"
 
@@ -26,4 +26,4 @@
   DISALLOW_COPY_AND_ASSIGN(BrowserListObserver);
 };
 
-#endif  // IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_OBSERVER_H_
+#endif  // IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_OBSERVER_H_
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list_observer.mm b/ios/chrome/browser/ui/browser_list/browser_list_observer.mm
similarity index 89%
rename from ios/shared/chrome/browser/ui/browser_list/browser_list_observer.mm
rename to ios/chrome/browser/ui/browser_list/browser_list_observer.mm
index ac6a9e4..f9a80a2 100644
--- a/ios/shared/chrome/browser/ui/browser_list/browser_list_observer.mm
+++ b/ios/chrome/browser/ui/browser_list/browser_list_observer.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/shared/chrome/browser/ui/browser_list/browser_list_observer.h"
+#import "ios/chrome/browser/ui/browser_list/browser_list_observer.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service.h b/ios/chrome/browser/ui/browser_list/browser_list_session_service.h
similarity index 81%
rename from ios/shared/chrome/browser/ui/browser_list/browser_list_session_service.h
rename to ios/chrome/browser/ui/browser_list/browser_list_session_service.h
index c4803b2..061e05f 100644
--- a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service.h
+++ b/ios/chrome/browser/ui/browser_list/browser_list_session_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 IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_H_
-#define IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_H_
+#ifndef IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_H_
+#define IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_H_
 
 #include "base/macros.h"
 #include "components/keyed_service/core/keyed_service.h"
@@ -31,4 +31,4 @@
   DISALLOW_COPY_AND_ASSIGN(BrowserListSessionService);
 };
 
-#endif  // IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_H_
+#endif  // IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_H_
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.h b/ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.h
similarity index 82%
rename from ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.h
rename to ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.h
index f2d20de..3e8f058 100644
--- a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.h
+++ b/ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.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 IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_FACTORY_H_
-#define IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_FACTORY_H_
+#ifndef IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_FACTORY_H_
+#define IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_FACTORY_H_
 
 #include "base/macros.h"
 #include "components/keyed_service/ios/browser_state_keyed_service_factory.h"
@@ -44,4 +44,4 @@
   DISALLOW_COPY_AND_ASSIGN(BrowserListSessionServiceFactory);
 };
 
-#endif  // IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_FACTORY_H_
+#endif  // IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_FACTORY_H_
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.mm b/ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.mm
similarity index 93%
rename from ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.mm
rename to ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.mm
index 32768142..877c95a 100644
--- a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.mm
+++ b/ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.h"
+#import "ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.h"
 
 #include <memory>
 
@@ -16,8 +16,8 @@
 #include "ios/chrome/browser/browser_state/browser_state_otr_helper.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #import "ios/chrome/browser/sessions/session_service_ios.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser_list.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_impl.h"
+#import "ios/chrome/browser/ui/browser_list/browser_list.h"
+#import "ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.h"
 #import "ios/web/public/certificate_policy_cache.h"
 #import "ios/web/public/web_state/session_certificate_policy_cache.h"
 
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_impl.h b/ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.h
similarity index 85%
rename from ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_impl.h
rename to ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.h
index 6a0cb29..cf32fae4 100644
--- a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_impl.h
+++ b/ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.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 IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_IMPL_H_
-#define IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_IMPL_H_
+#ifndef IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_IMPL_H_
+#define IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_IMPL_H_
 
 #import <Foundation/Foundation.h>
 
@@ -12,7 +12,7 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser_list_session_service.h"
+#import "ios/chrome/browser/ui/browser_list/browser_list_session_service.h"
 #import "ios/web/public/web_state/web_state.h"
 
 class BrowserList;
@@ -62,4 +62,4 @@
   DISALLOW_COPY_AND_ASSIGN(BrowserListSessionServiceImpl);
 };
 
-#endif  // IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_IMPL_H_
+#endif  // IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_SESSION_SERVICE_IMPL_H_
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_impl.mm b/ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.mm
similarity index 97%
rename from ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_impl.mm
rename to ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.mm
index b1e164d..f6841c1 100644
--- a/ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_impl.mm
+++ b/ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_impl.h"
+#import "ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.h"
 
 #include <map>
 
@@ -14,12 +14,12 @@
 #import "ios/chrome/browser/sessions/session_ios.h"
 #import "ios/chrome/browser/sessions/session_service_ios.h"
 #import "ios/chrome/browser/sessions/session_window_ios.h"
+#import "ios/chrome/browser/ui/browser_list/browser.h"
+#import "ios/chrome/browser/ui/browser_list/browser_list.h"
+#import "ios/chrome/browser/ui/browser_list/browser_list_observer.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/chrome/browser/web_state_list/web_state_list_observer.h"
 #import "ios/chrome/browser/web_state_list/web_state_list_serialization.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser_list.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser_list_observer.h"
 #import "ios/web/public/navigation_item.h"
 #import "ios/web/public/navigation_manager.h"
 #import "ios/web/public/web_state/web_state.h"
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_list_unittest.mm b/ios/chrome/browser/ui/browser_list/browser_list_unittest.mm
similarity index 96%
rename from ios/shared/chrome/browser/ui/browser_list/browser_list_unittest.mm
rename to ios/chrome/browser/ui/browser_list/browser_list_unittest.mm
index ece8ca1..fc1e633 100644
--- a/ios/shared/chrome/browser/ui/browser_list/browser_list_unittest.mm
+++ b/ios/chrome/browser/ui/browser_list/browser_list_unittest.mm
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/shared/chrome/browser/ui/browser_list/browser_list.h"
+#import "ios/chrome/browser/ui/browser_list/browser_list.h"
 
 #include <memory>
 
 #include "base/macros.h"
 #include "base/scoped_observer.h"
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser_list_observer.h"
+#import "ios/chrome/browser/ui/browser_list/browser_list_observer.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/platform_test.h"
 
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_user_data.h b/ios/chrome/browser/ui/browser_list/browser_user_data.h
similarity index 89%
rename from ios/shared/chrome/browser/ui/browser_list/browser_user_data.h
rename to ios/chrome/browser/ui/browser_list/browser_user_data.h
index 15562a3..337956be 100644
--- a/ios/shared/chrome/browser/ui/browser_list/browser_user_data.h
+++ b/ios/chrome/browser/ui/browser_list/browser_user_data.h
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_USER_DATA_H_
-#define IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_USER_DATA_H_
+#ifndef IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_USER_DATA_H_
+#define IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_USER_DATA_H_
 
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/supports_user_data.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 
 // A base class for classes attached to, and scoped to, the lifetime of a
 // Browser. For example:
@@ -71,4 +71,4 @@
   template <>                              \
   int BrowserUserData<TYPE>::kLocatorKey = 0
 
-#endif  // IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_USER_DATA_H_
+#endif  // IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_USER_DATA_H_
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h b/ios/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h
similarity index 74%
rename from ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h
rename to ios/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h
index e09ba1d7..355468d 100644
--- a/ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h
+++ b/ios/chrome/browser/ui/browser_list/browser_web_state_list_delegate.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 IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_WEB_STATE_LIST_DELEGATE_H_
-#define IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_WEB_STATE_LIST_DELEGATE_H_
+#ifndef IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_WEB_STATE_LIST_DELEGATE_H_
+#define IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_WEB_STATE_LIST_DELEGATE_H_
 
 #include "base/macros.h"
 #import "ios/chrome/browser/web_state_list/web_state_list_delegate.h"
@@ -26,4 +26,4 @@
   DISALLOW_COPY_AND_ASSIGN(BrowserWebStateListDelegate);
 };
 
-#endif  // IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_WEB_STATE_LIST_DELEGATE_H_
+#endif  // IOS_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_WEB_STATE_LIST_DELEGATE_H_
diff --git a/ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.mm b/ios/chrome/browser/ui/browser_list/browser_web_state_list_delegate.mm
similarity index 92%
rename from ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.mm
rename to ios/chrome/browser/ui/browser_list/browser_web_state_list_delegate.mm
index b8c92f3..5ebff4d 100644
--- a/ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.mm
+++ b/ios/chrome/browser/ui/browser_list/browser_web_state_list_delegate.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h"
+#import "ios/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h"
 
 #include "base/logging.h"
 #import "ios/chrome/browser/find_in_page/find_tab_helper.h"
diff --git a/ios/chrome/browser/ui/browser_view_controller.h b/ios/chrome/browser/ui/browser_view_controller.h
index 6d87b4a..88a7947 100644
--- a/ios/chrome/browser/ui/browser_view_controller.h
+++ b/ios/chrome/browser/ui/browser_view_controller.h
@@ -107,6 +107,12 @@
 // Called when the user explicitly opens the tab switcher.
 - (void)userEnteredTabSwitcher;
 
+// Presents either the new tab tip or incognito tab tip in-product help bubbles
+// if the the user is in a valid state to see one of them. At most one bubble
+// will be shown. If the feature engagement tracker determines it is not valid
+// to see one of the bubbles, that bubble will not be shown.
+- (void)presentBubblesIfEligible;
+
 // Called when the browser state provided to this instance is being destroyed.
 // At this point the browser will no longer ever be active, and will likely be
 // deallocated soon.
diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm
index 0a40ac3..87a25ba 100644
--- a/ios/chrome/browser/ui/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view_controller.mm
@@ -581,6 +581,10 @@
 @property(nonatomic, strong)
     BubbleViewControllerPresenter* tabTipBubblePresenter;
 
+// Used to display the new incognito tab tip in-product help promotion bubble.
+@property(nonatomic, strong)
+    BubbleViewControllerPresenter* incognitoTabTipBubblePresenter;
+
 // BVC initialization:
 // If the BVC is initialized with a valid browser state & tab model immediately,
 // the path is straightforward: functionality is enabled, and the UI is built
@@ -694,10 +698,22 @@
 // promotion until the feature engagement tracker database is fully initialized.
 // Does not present the bubble if |tabTipBubblePresenter.userEngaged| is |YES|
 // to prevent resetting |tabTipBubblePresenter| and affecting the value of
-// |userEngaged|.
+// |userEngaged|. Does not present the bubble if the feature engagement tracker
+// determines it is not valid to present it.
 - (void)presentNewTabTipBubbleOnInitialized;
-// Presents a bubble associated with the new tab tip in-product help promotion.
+// Optionally presents a bubble associated with the new tab tip in-product help
+// promotion. If the feature engagement tracker determines it is valid to show
+// the new tab tip, then it initializes |tabTipBubblePresenter| and presents
+// the bubble. If it is not valid to show the new tab tip,
+// |tabTipBubblePresenter| is set to |nil| and no bubble is shown.
 - (void)presentNewTabTipBubble;
+// Waits to present a bubble associated with the new incognito tab tip
+// in-product help promotion until the feature engagement tracker database is
+// fully initialized.
+- (void)presentNewIncognitoTabTipBubbleOnInitialized;
+// Presents a bubble associated with the new incognito tab tip in-product help
+// promotion.
+- (void)presentNewIncognitoTabTipBubble;
 
 // Create and show the find bar.
 - (void)initFindBarForTab;
@@ -947,7 +963,8 @@
 @synthesize presenting = _presenting;
 @synthesize foregroundTabWasAddedCompletionBlock =
     _foregroundTabWasAddedCompletionBlock;
-@synthesize tabTipBubblePresenter = tabTipBubblePresenter;
+@synthesize tabTipBubblePresenter = _tabTipBubblePresenter;
+@synthesize incognitoTabTipBubblePresenter = _incognitoTabTipBubblePresenter;
 
 #pragma mark - Object lifecycle
 
@@ -1217,6 +1234,11 @@
   }
 }
 
+- (void)presentBubblesIfEligible {
+  [self presentNewTabTipBubbleOnInitialized];
+  [self presentNewIncognitoTabTipBubble];
+}
+
 #pragma mark - UIViewController methods
 
 // Perform additional set up after loading the view, typically from a nib.
@@ -1263,7 +1285,7 @@
   [super viewDidAppear:animated];
   self.viewVisible = YES;
   [self updateDialogPresenterActiveState];
-  [self presentNewTabTipBubbleOnInitialized];
+  [self presentBubblesIfEligible];
 }
 
 - (void)viewWillAppear:(BOOL)animated {
@@ -2073,6 +2095,9 @@
     tabSwitcherAnchor = [self.toolbarController
         anchorPointForTabSwitcherButton:BubbleArrowDirectionUp];
   }
+  // If the feature engagement tracker does not consider it valid to display
+  // the new tab tip, then |bubblePresenterForFeature| returns |nil| and the
+  // call to |presentInViewController| is a no-op.
   self.tabTipBubblePresenter =
       [self bubblePresenterForFeature:feature_engagement::kIPHNewTabTipFeature
                             direction:BubbleArrowDirectionUp
@@ -2083,6 +2108,46 @@
                                           anchorPoint:tabSwitcherAnchor];
 }
 
+- (void)presentNewIncognitoTabTipBubbleOnInitialized {
+  // Do not override |incognitoTabtipBubblePresenter| or set it to nil if the
+  // user is still considered engaged.
+  if (!self.incognitoTabTipBubblePresenter.isUserEngaged) {
+    __weak BrowserViewController* weakSelf = self;
+    void (^onInitializedBlock)(bool) = ^(bool successfullyLoaded) {
+      [weakSelf presentNewIncognitoTabTipBubble];
+    };
+
+    // Use a callback in case the new incognito tab tip should be shown on
+    // startup. This ensures that the tracker's database will be fully loaded
+    // before checking if the promotion should be displayed.
+    feature_engagement::TrackerFactory::GetForBrowserState(self.browserState)
+        ->AddOnInitializedCallback(base::BindBlockArc(onInitializedBlock));
+  }
+}
+
+- (void)presentNewIncognitoTabTipBubble {
+  DCHECK([self.toolbarController
+      respondsToSelector:@selector(anchorPointForToolsMenuButton:)]);
+  NSString* text = l10n_util::GetNSStringWithFixup(
+      IDS_IOS_NEW_INCOGNITO_TAB_IPH_PROMOTION_TEXT);
+  CGPoint toolsButtonAnchor = [self.toolbarController
+      anchorPointForToolsMenuButton:BubbleArrowDirectionUp];
+  self.incognitoTabTipBubblePresenter =
+      [self bubblePresenterForFeature:feature_engagement::
+                                          kIPHNewIncognitoTabTipFeature
+                            direction:BubbleArrowDirectionUp
+                            alignment:BubbleAlignmentTrailing
+                                 text:text];
+  [self.incognitoTabTipBubblePresenter
+      presentInViewController:self
+                         view:self.view
+                  anchorPoint:toolsButtonAnchor];
+  // Only trigger the tools menu button animation if the bubble is shown.
+  if (self.incognitoTabTipBubblePresenter) {
+    [self.toolbarController triggerToolsMenuButtonAnimation];
+  }
+}
+
 #pragma mark - Tap handling
 
 - (void)setLastTapPoint:(OpenNewTabCommand*)command {
@@ -3166,7 +3231,12 @@
         url, ReadingListModelFactory::GetForBrowserState(_browserState));
   }
 
-  return host == kChromeUINewTabHost || host == kChromeUIBookmarksHost;
+  if (host == kChromeUIBookmarksHost) {
+    // Only allow bookmark URL on iPad.
+    return IsIPadIdiom();
+  }
+
+  return host == kChromeUINewTabHost;
 }
 
 - (id<CRWNativeContent>)controllerForURL:(const GURL&)url
@@ -4097,6 +4167,15 @@
 
   [configuration setUserAgentType:self.userAgentType];
 
+  if (self.incognitoTabTipBubblePresenter.triggerFollowUpAction) {
+    [configuration setHighlightNewIncognitoTabCell:YES];
+    [self.incognitoTabTipBubblePresenter setTriggerFollowUpAction:NO];
+  }
+
+  if (self.incognitoTabTipBubblePresenter.isUserEngaged) {
+    base::RecordAction(UserMetricsAction("NewIncognitoTabTipTargetSelected"));
+  }
+
   [_toolbarController showToolsMenuPopupWithConfiguration:configuration];
 
   ToolsPopupController* toolsPopupController =
diff --git a/ios/chrome/browser/ui/bubble/OWNERS b/ios/chrome/browser/ui/bubble/OWNERS
index d122690d..2c40cf4 100644
--- a/ios/chrome/browser/ui/bubble/OWNERS
+++ b/ios/chrome/browser/ui/bubble/OWNERS
@@ -1,2 +1,4 @@
 edchin@chromium.org
-gchatz@chromium.org
\ No newline at end of file
+gchatz@chromium.org
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/bubble/bubble_util_unittest.mm b/ios/chrome/browser/ui/bubble/bubble_util_unittest.mm
index bed713c..2cb7c9b 100644
--- a/ios/chrome/browser/ui/bubble/bubble_util_unittest.mm
+++ b/ios/chrome/browser/ui/bubble/bubble_util_unittest.mm
@@ -14,7 +14,7 @@
 #endif
 
 namespace {
-const CGFloat kTestBubbleAlignmentOffset = 40.0f;
+const CGFloat kTestBubbleAlignmentOffset = 25.0f;
 }  // namespace
 
 namespace bubble_util {
diff --git a/ios/chrome/browser/ui/bubble/bubble_view.mm b/ios/chrome/browser/ui/bubble/bubble_view.mm
index 5c4f211..b2b8b3c2 100644
--- a/ios/chrome/browser/ui/bubble/bubble_view.mm
+++ b/ios/chrome/browser/ui/bubble/bubble_view.mm
@@ -12,7 +12,7 @@
 #error "This file requires ARC support."
 #endif
 
-const CGFloat kBubbleAlignmentOffset = 40.0f;
+const CGFloat kBubbleAlignmentOffset = 25.0f;
 
 namespace {
 // The color of the bubble (both circular background and arrow).
diff --git a/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.h b/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.h
index 4db25936..911f1c6 100644
--- a/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.h
+++ b/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.h
@@ -30,6 +30,13 @@
 // the bubble had an effect on the user's action.
 @property(nonatomic, assign, readonly, getter=isUserEngaged) BOOL userEngaged;
 
+// Determines whether a follow-up action, such as highlighting a UI element,
+// should be triggered. This depends on |userEngaged|, since a follow-up action
+// should only occur if the user is engaged with the bubble. Defaults to |YES|,
+// and is set to |NO| once |userEngaged| is set to |NO| or after the user has
+// triggered the follow-up action.
+@property(nonatomic, assign) BOOL triggerFollowUpAction;
+
 // Initializes the presenter. |text| is the text displayed by the bubble.
 // |arrowDirection| is the direction the bubble's arrow is pointing. |alignment|
 // is the position of the arrow on the bubble. |dismissalCallback| is a block
diff --git a/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.mm b/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.mm
index cb298b0..21dd759f 100644
--- a/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.mm
+++ b/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.mm
@@ -71,6 +71,7 @@
 @synthesize bubbleDismissalTimer = _bubbleDismissalTimer;
 @synthesize engagementTimer = _engagementTimer;
 @synthesize userEngaged = _userEngaged;
+@synthesize triggerFollowUpAction = _triggerFollowUpAction;
 @synthesize arrowDirection = _arrowDirection;
 @synthesize alignment = _alignment;
 @synthesize dismissalCallback = _dismissalCallback;
@@ -96,6 +97,7 @@
     _insideBubbleTapRecognizer.delegate = self;
     _insideBubbleTapRecognizer.cancelsTouchesInView = NO;
     _userEngaged = NO;
+    _triggerFollowUpAction = NO;
     _arrowDirection = arrowDirection;
     _alignment = alignment;
     _dismissalCallback = dismissalCallback;
@@ -132,6 +134,7 @@
                              repeats:NO];
 
   self.userEngaged = YES;
+  self.triggerFollowUpAction = YES;
   self.engagementTimer =
       [NSTimer scheduledTimerWithTimeInterval:kBubbleEngagementDuration
                                        target:self
@@ -206,6 +209,7 @@
 // Marks the user as not engaged when |engagementTimer| fires.
 - (void)engagementTimerFired:(id)sender {
   self.userEngaged = NO;
+  self.triggerFollowUpAction = NO;
   self.engagementTimer = nil;
 }
 
diff --git a/ios/chrome/browser/ui/bubble/bubble_view_unittest.mm b/ios/chrome/browser/ui/bubble/bubble_view_unittest.mm
index c9c64d71..6842465 100644
--- a/ios/chrome/browser/ui/bubble/bubble_view_unittest.mm
+++ b/ios/chrome/browser/ui/bubble/bubble_view_unittest.mm
@@ -46,7 +46,7 @@
   CGSize bubbleSize = [bubble sizeThatFits:maxSize_];
   // Since the label is shorter than the minimum line width, expect the bubble
   // to be the minimum width and accommodate one line of text.
-  EXPECT_NEAR(80.0f, bubbleSize.width, 1.0f);
+  EXPECT_NEAR(56.0f, bubbleSize.width, 1.0f);
   EXPECT_NEAR(61.5f, bubbleSize.height, 1.0f);
 }
 
diff --git a/ios/chrome/browser/ui/collection_view/OWNERS b/ios/chrome/browser/ui/collection_view/OWNERS
index 077a06e..c984591 100644
--- a/ios/chrome/browser/ui/collection_view/OWNERS
+++ b/ios/chrome/browser/ui/collection_view/OWNERS
@@ -1,2 +1,5 @@
 lpromero@chromium.org
 rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/colors/OWNERS b/ios/chrome/browser/ui/colors/OWNERS
index 4bb62eb..a188a478 100644
--- a/ios/chrome/browser/ui/colors/OWNERS
+++ b/ios/chrome/browser/ui/colors/OWNERS
@@ -1 +1,4 @@
 lpromero@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/content_suggestions/OWNERS b/ios/chrome/browser/ui/content_suggestions/OWNERS
index 2d35f0a5..f192143 100644
--- a/ios/chrome/browser/ui/content_suggestions/OWNERS
+++ b/ios/chrome/browser/ui/content_suggestions/OWNERS
@@ -1 +1,4 @@
 gambard@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm
index 5aa5a63..967abb0 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm
@@ -343,8 +343,6 @@
   NSInteger sectionIdentifier = SectionIdentifierForInfo(sectionInfo);
 
   if (suggestions.count == 0) {
-    // No suggestions for this section. Add the item signaling this section is
-    // empty if there is currently no item in it.
     if ([model hasSectionForSectionIdentifier:sectionIdentifier] &&
         [model numberOfItemsInSection:[model sectionForSectionIdentifier:
                                                  sectionIdentifier]] == 0) {
@@ -358,35 +356,6 @@
     return indexPaths;
   }
 
-  if (sectionIdentifier == SectionIdentifierLearnMore) {
-    // The "Learn more" items should only be displayed if there is at least one
-    // ContentSuggestions section.
-    if ((![model hasSectionForSectionIdentifier:SectionIdentifierArticles] &&
-         !
-         [model hasSectionForSectionIdentifier:SectionIdentifierReadingList]) ||
-        [model itemsInSectionWithIdentifier:sectionIdentifier].count > 0) {
-      return @[];
-    }
-  } else if (IsFromContentSuggestions(sectionIdentifier)) {
-    // If the section is a ContentSuggestions section, add the "Learn more"
-    // items if they are not already present.
-    if ([model hasSectionForSectionIdentifier:SectionIdentifierLearnMore] &&
-        [model itemsInSectionWithIdentifier:SectionIdentifierLearnMore].count ==
-            0) {
-      ContentSuggestionsSectionInformation* learnMoreSectionInfo =
-          self.sectionInfoBySectionIdentifier[@(SectionIdentifierLearnMore)];
-      for (CSCollectionViewItem* item in
-           [self.dataSource itemsForSectionInfo:learnMoreSectionInfo]) {
-        item.type = ItemTypeForInfo(learnMoreSectionInfo);
-        NSIndexPath* addedIndexPath = [self addItem:item
-                            toSectionWithIdentifier:SectionIdentifierLearnMore];
-
-        [indexPaths addObject:addedIndexPath];
-      }
-    }
-  }
-
-  // Add the items from this section.
   [suggestions enumerateObjectsUsingBlock:^(CSCollectionViewItem* item,
                                             NSUInteger index, BOOL* stop) {
     NSInteger section = [model sectionForSectionIdentifier:sectionIdentifier];
diff --git a/ios/chrome/browser/ui/context_menu/OWNERS b/ios/chrome/browser/ui/context_menu/OWNERS
index 49ba79e..07726cf 100644
--- a/ios/chrome/browser/ui/context_menu/OWNERS
+++ b/ios/chrome/browser/ui/context_menu/OWNERS
@@ -1 +1,4 @@
 michaeldo@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/contextual_search/OWNERS b/ios/chrome/browser/ui/contextual_search/OWNERS
index 3141303..17f2da6 100644
--- a/ios/chrome/browser/ui/contextual_search/OWNERS
+++ b/ios/chrome/browser/ui/contextual_search/OWNERS
@@ -1,2 +1,5 @@
 marq@chromium.org
 olivierrobin@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/contextual_search/contextual_search_delegate.cc b/ios/chrome/browser/ui/contextual_search/contextual_search_delegate.cc
index 624a048..c468bfa 100644
--- a/ios/chrome/browser/ui/contextual_search/contextual_search_delegate.cc
+++ b/ios/chrome/browser/ui/contextual_search/contextual_search_delegate.cc
@@ -317,8 +317,8 @@
   media->set_mime_type(context.encoding);
 
   discourse_context::Selection* selection = display->mutable_selection();
-  selection->set_content(
-      net::EscapeQueryParamValue(UTF16ToUTF8(context.surrounding_text), true));
+  selection->set_content(net::EscapeQueryParamValue(
+      base::UTF16ToUTF8(context.surrounding_text), true));
   selection->set_start(context.start_offset);
   selection->set_end(context.end_offset);
 
diff --git a/ios/chrome/browser/ui/dialogs/OWNERS b/ios/chrome/browser/ui/dialogs/OWNERS
index 48efb49e..bd85dcf2 100644
--- a/ios/chrome/browser/ui/dialogs/OWNERS
+++ b/ios/chrome/browser/ui/dialogs/OWNERS
@@ -1 +1,4 @@
 kkhorimoto@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/elements/OWNERS b/ios/chrome/browser/ui/elements/OWNERS
index f49ed38..01e8c98 100644
--- a/ios/chrome/browser/ui/elements/OWNERS
+++ b/ios/chrome/browser/ui/elements/OWNERS
@@ -1 +1,4 @@
 marq@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/fancy_ui/OWNERS b/ios/chrome/browser/ui/fancy_ui/OWNERS
index 40a68c7..b127701 100644
--- a/ios/chrome/browser/ui/fancy_ui/OWNERS
+++ b/ios/chrome/browser/ui/fancy_ui/OWNERS
@@ -1 +1,4 @@
 rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/favicon/OWNERS b/ios/chrome/browser/ui/favicon/OWNERS
index 2d35f0a5..f192143 100644
--- a/ios/chrome/browser/ui/favicon/OWNERS
+++ b/ios/chrome/browser/ui/favicon/OWNERS
@@ -1 +1,4 @@
 gambard@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/find_bar/BUILD.gn b/ios/chrome/browser/ui/find_bar/BUILD.gn
index ad487457..9ca15b2 100644
--- a/ios/chrome/browser/ui/find_bar/BUILD.gn
+++ b/ios/chrome/browser/ui/find_bar/BUILD.gn
@@ -55,7 +55,6 @@
     "//components/strings",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/find_in_page",
-    "//ios/chrome/browser/ui:ui",
     "//ios/chrome/browser/ui/tools_menu",
     "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/earl_grey:test_support",
diff --git a/ios/chrome/browser/ui/find_bar/OWNERS b/ios/chrome/browser/ui/find_bar/OWNERS
index 8298f43..479c250 100644
--- a/ios/chrome/browser/ui/find_bar/OWNERS
+++ b/ios/chrome/browser/ui/find_bar/OWNERS
@@ -1,2 +1,5 @@
 justincohen@chromium.org
 stkhapugin@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm b/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm
index 36bb7af..ef3dfcd 100644
--- a/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm
+++ b/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm
@@ -4,14 +4,12 @@
 
 #import <XCTest/XCTest.h>
 
-#include "base/ios/ios_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/find_in_page/find_in_page_controller.h"
 #import "ios/chrome/browser/ui/find_bar/find_bar_controller_ios.h"
 #import "ios/chrome/browser/ui/find_bar/find_bar_view.h"
 #include "ios/chrome/browser/ui/tools_menu/tools_menu_constants.h"
-#include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/accessibility_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
@@ -96,12 +94,6 @@
 // Tests that find in page allows iteration between search results and displays
 // correct number of results.
 - (void)testFindInPage {
-  // TODO(crbug.com/753098): Re-enable this test on iOS 11 iPad once
-  // grey_typeText works on iOS 11.
-  if (base::ios::IsRunningOnIOS11OrLater() && IsIPadIdiom()) {
-    EARL_GREY_TEST_DISABLED(@"Test disabled on iOS 11.");
-  }
-
   // Type "find".
   [self typeFindInPageText:@"find"];
   // Should be highlighting result 1 of 2.
@@ -184,7 +176,7 @@
 
 - (void)typeFindInPageText:(NSString*)text {
   [[EarlGrey selectElementWithMatcher:[self findInPageInputField]]
-      performAction:grey_typeText(text)];
+      performAction:grey_replaceText(text)];
 }
 
 - (id<GREYMatcher>)findInPageInputField {
diff --git a/ios/chrome/browser/ui/first_run/OWNERS b/ios/chrome/browser/ui/first_run/OWNERS
index 3281fe5b..e29ab3e 100644
--- a/ios/chrome/browser/ui/first_run/OWNERS
+++ b/ios/chrome/browser/ui/first_run/OWNERS
@@ -1,2 +1,5 @@
 bzanotti@chromium.org
 kkhorimoto@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/history/BUILD.gn b/ios/chrome/browser/ui/history/BUILD.gn
index 10674d96..ed52dc65c 100644
--- a/ios/chrome/browser/ui/history/BUILD.gn
+++ b/ios/chrome/browser/ui/history/BUILD.gn
@@ -207,7 +207,6 @@
     "//ios/chrome/app/strings",
     "//ios/chrome/browser",
     "//ios/chrome/browser/browser_state",
-    "//ios/chrome/browser/ui/authentication:authentication_ui",
     "//ios/chrome/browser/ui/settings",
     "//ios/chrome/browser/ui/tools_menu",
     "//ios/chrome/browser/ui/util",
diff --git a/ios/chrome/browser/ui/history/OWNERS b/ios/chrome/browser/ui/history/OWNERS
index 1085212..1c26985 100644
--- a/ios/chrome/browser/ui/history/OWNERS
+++ b/ios/chrome/browser/ui/history/OWNERS
@@ -1,2 +1,5 @@
 lpromero@chromium.org
 sczs@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/history/history_ui_egtest.mm b/ios/chrome/browser/ui/history/history_ui_egtest.mm
index 590f142f..51b4feed 100644
--- a/ios/chrome/browser/ui/history/history_ui_egtest.mm
+++ b/ios/chrome/browser/ui/history/history_ui_egtest.mm
@@ -14,7 +14,6 @@
 #include "components/strings/grit/components_strings.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/chrome_url_constants.h"
-#import "ios/chrome/browser/ui/authentication/signin_promo_view.h"
 #import "ios/chrome/browser/ui/history/history_entry_item.h"
 #import "ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.h"
 #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h"
diff --git a/ios/chrome/browser/ui/infobars/OWNERS b/ios/chrome/browser/ui/infobars/OWNERS
index d2e1add..c85e66a 100644
--- a/ios/chrome/browser/ui/infobars/OWNERS
+++ b/ios/chrome/browser/ui/infobars/OWNERS
@@ -1 +1,4 @@
 jif@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/keyboard/OWNERS b/ios/chrome/browser/ui/keyboard/OWNERS
index 4bb62eb..a188a478 100644
--- a/ios/chrome/browser/ui/keyboard/OWNERS
+++ b/ios/chrome/browser/ui/keyboard/OWNERS
@@ -1 +1,4 @@
 lpromero@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/keyboard_commands_egtest.mm b/ios/chrome/browser/ui/keyboard_commands_egtest.mm
index 2b72f680..db85067 100644
--- a/ios/chrome/browser/ui/keyboard_commands_egtest.mm
+++ b/ios/chrome/browser/ui/keyboard_commands_egtest.mm
@@ -115,8 +115,7 @@
 - (void)selectToolsMenuItem:(id<GREYMatcher>)toolsMenuItem {
   [ChromeEarlGreyUI openToolsMenu];
 
-  id<GREYMatcher> toolsMenuTableView =
-      grey_accessibilityID(kToolsMenuTableViewId);
+  id<GREYMatcher> toolsMenuTableView = chrome_test_util::ToolsMenuView();
   [[[EarlGrey selectElementWithMatcher:toolsMenuItem]
          usingSearchAction:grey_scrollInDirection(kGREYDirectionDown,
                                                   kScrollDisplacement)
diff --git a/ios/chrome/browser/ui/main/OWNERS b/ios/chrome/browser/ui/main/OWNERS
index f49ed38..01e8c98 100644
--- a/ios/chrome/browser/ui/main/OWNERS
+++ b/ios/chrome/browser/ui/main/OWNERS
@@ -1 +1,4 @@
 marq@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/ntp/OWNERS b/ios/chrome/browser/ui/ntp/OWNERS
index 3306281..9b78e8b 100644
--- a/ios/chrome/browser/ui/ntp/OWNERS
+++ b/ios/chrome/browser/ui/ntp/OWNERS
@@ -1,2 +1,5 @@
 rohitrao@chromium.org
 justincohen@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/OWNERS b/ios/chrome/browser/ui/ntp/recent_tabs/OWNERS
index d2e1add..c85e66a 100644
--- a/ios/chrome/browser/ui/ntp/recent_tabs/OWNERS
+++ b/ios/chrome/browser/ui/ntp/recent_tabs/OWNERS
@@ -1 +1,4 @@
 jif@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/views/session_section_header_view.mm b/ios/chrome/browser/ui/ntp/recent_tabs/views/session_section_header_view.mm
index b243aac5..5334d2a9 100644
--- a/ios/chrome/browser/ui/ntp/recent_tabs/views/session_section_header_view.mm
+++ b/ios/chrome/browser/ui/ntp/recent_tabs/views/session_section_header_view.mm
@@ -156,7 +156,7 @@
   if (last_used_delta.ToInternalValue() < base::Time::kMicrosecondsPerMinute)
     return l10n_util::GetNSString(IDS_IOS_OPEN_TABS_RECENTLY_SYNCED);
   if (last_used_delta.InHours() < kRelativeTimeMaxHours) {
-    return SysUTF16ToNSString(
+    return base::SysUTF16ToNSString(
         ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_ELAPSED,
                                ui::TimeFormat::LENGTH_SHORT, last_used_delta));
   }
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/views/session_tab_data_view.mm b/ios/chrome/browser/ui/ntp/recent_tabs/views/session_tab_data_view.mm
index a5634b0..5b1f54a 100644
--- a/ios/chrome/browser/ui/ntp/recent_tabs/views/session_tab_data_view.mm
+++ b/ios/chrome/browser/ui/ntp/recent_tabs/views/session_tab_data_view.mm
@@ -93,7 +93,7 @@
                 browserState:(ios::ChromeBrowserState*)browserState {
   DCHECK(distantTab);
   DCHECK(browserState);
-  NSString* text = SysUTF16ToNSString(distantTab->title);
+  NSString* text = base::SysUTF16ToNSString(distantTab->title);
   GURL url = distantTab->virtual_url;
   [self setText:text url:url browserState:browserState];
 }
diff --git a/ios/chrome/browser/ui/omnibox/OWNERS b/ios/chrome/browser/ui/omnibox/OWNERS
index 03b0059..5e5e932a 100644
--- a/ios/chrome/browser/ui/omnibox/OWNERS
+++ b/ios/chrome/browser/ui/omnibox/OWNERS
@@ -2,3 +2,6 @@
 rohitrao@chromium.org
 
 # COMPONENT: UI>Browser>Omnibox
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm b/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm
index cc9423ec..ba1219b1 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm
+++ b/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm
@@ -493,7 +493,7 @@
     base::string16 pastedText = base::SysNSStringToUTF16([field_ text]);
     base::string16 newText = OmniboxView::SanitizeTextForPaste(pastedText);
     if (pastedText != newText) {
-      [field_ setText:SysUTF16ToNSString(newText)];
+      [field_ setText:base::SysUTF16ToNSString(newText)];
     }
   }
 
diff --git a/ios/chrome/browser/ui/overscroll_actions/OWNERS b/ios/chrome/browser/ui/overscroll_actions/OWNERS
index d2e1add..c85e66a 100644
--- a/ios/chrome/browser/ui/overscroll_actions/OWNERS
+++ b/ios/chrome/browser/ui/overscroll_actions/OWNERS
@@ -1 +1,4 @@
 jif@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/payments/BUILD.gn b/ios/chrome/browser/ui/payments/BUILD.gn
index 21910e76..63eb3cc 100644
--- a/ios/chrome/browser/ui/payments/BUILD.gn
+++ b/ios/chrome/browser/ui/payments/BUILD.gn
@@ -158,6 +158,7 @@
     "contact_info_selection_mediator_unittest.mm",
     "country_selection_coordinator_unittest.mm",
     "credit_card_edit_coordinator_unittest.mm",
+    "credit_card_edit_mediator_unittest.mm",
     "full_card_requester_unittest.mm",
     "payment_items_display_coordinator_unittest.mm",
     "payment_items_display_view_controller_unittest.mm",
diff --git a/ios/chrome/browser/ui/payments/OWNERS b/ios/chrome/browser/ui/payments/OWNERS
index 4cfb56d..2a262cc2 100644
--- a/ios/chrome/browser/ui/payments/OWNERS
+++ b/ios/chrome/browser/ui/payments/OWNERS
@@ -1,2 +1,5 @@
 lpromero@chromium.org
 mahmadi@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/payments/credit_card_edit_mediator.mm b/ios/chrome/browser/ui/payments/credit_card_edit_mediator.mm
index 1113cd3..2ca6c574 100644
--- a/ios/chrome/browser/ui/payments/credit_card_edit_mediator.mm
+++ b/ios/chrome/browser/ui/payments/credit_card_edit_mediator.mm
@@ -9,6 +9,7 @@
 #include "components/autofill/core/browser/autofill_profile.h"
 #include "components/autofill/core/browser/credit_card.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
+#include "components/autofill/core/browser/validation.h"
 #import "components/autofill/ios/browser/credit_card_util.h"
 #include "components/payments/core/payment_request_data_util.h"
 #include "components/payments/core/strings_util.h"
@@ -104,9 +105,14 @@
 #pragma mark - PaymentRequestEditViewControllerDataSource
 
 - (NSString*)title {
-  // TODO(crbug.com/602666): Title varies depending on the missing fields.
-  return _creditCard ? l10n_util::GetNSString(IDS_PAYMENTS_EDIT_CARD)
-                     : l10n_util::GetNSString(IDS_PAYMENTS_ADD_CARD_LABEL);
+  if (!self.creditCard)
+    return l10n_util::GetNSString(IDS_PAYMENTS_ADD_CARD_LABEL);
+
+  const autofill::CreditCardCompletionStatus status =
+      autofill::GetCompletionStatusForCard(
+          *self.creditCard, self.paymentRequest->GetApplicationLocale(),
+          self.paymentRequest->billing_profiles());
+  return base::SysUTF16ToNSString(autofill::GetEditDialogTitleForCard(status));
 }
 
 - (CollectionViewItem*)headerItem {
diff --git a/ios/chrome/browser/ui/payments/credit_card_edit_mediator_unittest.mm b/ios/chrome/browser/ui/payments/credit_card_edit_mediator_unittest.mm
new file mode 100644
index 0000000..96bbcc3
--- /dev/null
+++ b/ios/chrome/browser/ui/payments/credit_card_edit_mediator_unittest.mm
@@ -0,0 +1,73 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/ui/payments/credit_card_edit_mediator.h"
+
+#include "components/autofill/core/browser/autofill_test_utils.h"
+#include "components/strings/grit/components_strings.h"
+#import "ios/chrome/browser/ui/payments/payment_request_unittest_base.h"
+#include "testing/platform_test.h"
+#include "third_party/ocmock/gtest_support.h"
+#include "ui/base/l10n/l10n_util.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+class PaymentRequestCreditCardEditMediatorTest
+    : public PaymentRequestUnitTestBase,
+      public PlatformTest {
+ protected:
+  void SetUp() override {
+    PaymentRequestUnitTestBase::SetUp();
+    AddAutofillProfile(autofill::test::GetFullProfile());
+    CreateTestPaymentRequest();
+  }
+
+  void TearDown() override { PaymentRequestUnitTestBase::TearDown(); }
+};
+
+// Tests that the editor's title is correct in various situations.
+TEST_F(PaymentRequestCreditCardEditMediatorTest, Title) {
+  // No card, so the title should ask to add a card.
+  CreditCardEditViewControllerMediator* mediator =
+      [[CreditCardEditViewControllerMediator alloc]
+          initWithPaymentRequest:payment_request()
+                      creditCard:nil];
+  EXPECT_TRUE([mediator.title
+      isEqualToString:l10n_util::GetNSString(IDS_PAYMENTS_ADD_CARD_LABEL)]);
+
+  const autofill::AutofillProfile& billing_address = *profiles()[0];
+
+  // Complete card, to title should prompt to edit the card.
+  autofill::CreditCard credit_card = autofill::test::GetCreditCard();
+  autofill::test::SetCreditCardInfo(&credit_card, nullptr, nullptr, nullptr,
+                                    nullptr, billing_address.guid());
+  mediator = [[CreditCardEditViewControllerMediator alloc]
+      initWithPaymentRequest:payment_request()
+                  creditCard:&credit_card];
+  EXPECT_TRUE([mediator.title
+      isEqualToString:l10n_util::GetNSString(IDS_PAYMENTS_EDIT_CARD)]);
+
+  // The card's name is missing, so the title should prompt to add the name.
+  autofill::test::SetCreditCardInfo(&credit_card, /* name_on_card= */ "",
+                                    nullptr, nullptr, nullptr,
+                                    billing_address.guid());
+  mediator = [[CreditCardEditViewControllerMediator alloc]
+      initWithPaymentRequest:payment_request()
+                  creditCard:&credit_card];
+  EXPECT_TRUE([mediator.title
+      isEqualToString:l10n_util::GetNSString(IDS_PAYMENTS_ADD_NAME_ON_CARD)]);
+
+  // Billing address is also missing, so the title should be generic.
+  autofill::test::SetCreditCardInfo(&credit_card, /* name_on_card= */ "",
+                                    nullptr, nullptr, nullptr,
+                                    /* billing_address_id= */ "");
+  mediator = [[CreditCardEditViewControllerMediator alloc]
+      initWithPaymentRequest:payment_request()
+                  creditCard:&credit_card];
+  EXPECT_TRUE(
+      [mediator.title isEqualToString:l10n_util::GetNSString(
+                                          IDS_PAYMENTS_ADD_MORE_INFORMATION)]);
+}
diff --git a/ios/chrome/browser/ui/payments/payment_items_display_mediator.mm b/ios/chrome/browser/ui/payments/payment_items_display_mediator.mm
index 8c7e081e..c7af79f4 100644
--- a/ios/chrome/browser/ui/payments/payment_items_display_mediator.mm
+++ b/ios/chrome/browser/ui/payments/payment_items_display_mediator.mm
@@ -49,7 +49,7 @@
       base::SysUTF16ToNSString(_paymentRequest->payment_details().total.label);
   payments::CurrencyFormatter* currencyFormatter =
       _paymentRequest->GetOrCreateCurrencyFormatter();
-  totalItem.price = SysUTF16ToNSString(l10n_util::GetStringFUTF16(
+  totalItem.price = base::SysUTF16ToNSString(l10n_util::GetStringFUTF16(
       IDS_PAYMENT_REQUEST_ORDER_SUMMARY_SHEET_TOTAL_FORMAT,
       base::UTF8ToUTF16(currencyFormatter->formatted_currency_code()),
       currencyFormatter->Format(base::UTF16ToASCII(
@@ -68,7 +68,7 @@
     item.item = base::SysUTF16ToNSString(paymentItem.label);
     payments::CurrencyFormatter* currencyFormatter =
         _paymentRequest->GetOrCreateCurrencyFormatter();
-    item.price = SysUTF16ToNSString(currencyFormatter->Format(
+    item.price = base::SysUTF16ToNSString(currencyFormatter->Format(
         base::UTF16ToASCII(paymentItem.amount.value)));
 
     [lineItems addObject:item];
diff --git a/ios/chrome/browser/ui/payments/payment_request_manager.mm b/ios/chrome/browser/ui/payments/payment_request_manager.mm
index 36ff598d..dddb360 100644
--- a/ios/chrome/browser/ui/payments/payment_request_manager.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_manager.mm
@@ -39,6 +39,8 @@
 #include "ios/chrome/browser/autofill/validation_rules_storage_factory.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/payments/ios_can_make_payment_query_factory.h"
+#include "ios/chrome/browser/payments/ios_payment_instrument_launcher.h"
+#include "ios/chrome/browser/payments/ios_payment_instrument_launcher_factory.h"
 #include "ios/chrome/browser/payments/ios_payment_request_cache_factory.h"
 #include "ios/chrome/browser/payments/origin_security_checker.h"
 #include "ios/chrome/browser/payments/payment_request.h"
@@ -308,12 +310,21 @@
                                            (ProceduralBlockWithBool)callback {
   DCHECK(_pendingPaymentRequest);
   _pendingPaymentRequest = nullptr;
+  [self resetIOSPaymentInstrumentLauncherDelegate];
   [self dismissUI];
   [_paymentRequestJsManager rejectRequestPromiseWithErrorName:kAbortErrorName
                                                  errorMessage:errorMessage
                                             completionHandler:callback];
 }
 
+- (void)resetIOSPaymentInstrumentLauncherDelegate {
+  payments::IOSPaymentInstrumentLauncher* paymentAppLauncher =
+      payments::IOSPaymentInstrumentLauncherFactory::GetInstance()
+          ->GetForBrowserState(_browserState);
+  DCHECK(paymentAppLauncher);
+  paymentAppLauncher->set_delegate(nullptr);
+}
+
 - (void)close {
   [self setActiveWebState:nullptr];
 }
@@ -474,6 +485,30 @@
       paymentRequest->request_payer_phone(),
       paymentRequest->request_payer_name());
 
+  // Log metrics around which payment methods are requested by the merchant.
+  const GURL kGooglePayUrl("https://google.com/pay");
+  const GURL kAndroidPayUrl("https://android.com/pay");
+  // Looking for payment methods that are NOT Google-related as well as the
+  // Google-related ones.
+  bool requestedMethodGoogle = false;
+  bool requestedMethodOther = false;
+  for (const GURL& url_payment_method :
+       paymentRequest->url_payment_method_identifiers()) {
+    if (url_payment_method == kGooglePayUrl ||
+        url_payment_method == kAndroidPayUrl) {
+      requestedMethodGoogle = true;
+    } else {
+      requestedMethodOther = true;
+    }
+  }
+
+  paymentRequest->journey_logger().SetRequestedPaymentMethodTypes(
+      /*requested_basic_card=*/!paymentRequest->supported_card_networks()
+          .empty(),
+      /*requested_method_google=*/
+      requestedMethodGoogle,
+      /*requested_method_other=*/requestedMethodOther);
+
   UIImage* pageFavicon = nil;
   web::NavigationItem* navigationItem =
       _activeWebState->GetNavigationManager()->GetVisibleItem();
@@ -756,12 +791,24 @@
 }
 
 - (void)paymentInstrument:(payments::IOSPaymentInstrument*)paymentInstrument
-    launchAppWithUniversalLink:(std::string)universalLink
+    launchAppWithUniversalLink:(GURL)universalLink
             instrumentDelegate:
                 (payments::PaymentInstrument::Delegate*)delegate {
-  // TODO(crbug.com/748556): Implement this function to use a native app's
-  // universal link to open it from Chrome with several arguments supplied
-  // from the Payment Request object.
+  DCHECK(_pendingPaymentRequest);
+  DCHECK(_activeWebState);
+
+  [_paymentRequestCoordinator setPending:YES];
+  [_paymentRequestCoordinator setCancellable:YES];
+
+  payments::IOSPaymentInstrumentLauncher* paymentAppLauncher =
+      payments::IOSPaymentInstrumentLauncherFactory::GetInstance()
+          ->GetForBrowserState(_browserState);
+  DCHECK(paymentAppLauncher);
+  if (!paymentAppLauncher->LaunchIOSPaymentInstrument(
+          _pendingPaymentRequest, _activeWebState, universalLink, delegate)) {
+    [_paymentRequestCoordinator setPending:NO];
+    [_paymentRequestCoordinator setCancellable:YES];
+  }
 }
 
 #pragma mark - PaymentRequestCoordinatorDelegate methods
@@ -840,6 +887,11 @@
   [_paymentRequestCoordinator setCancellable:NO];
 }
 
+- (void)paymentResponseHelperDidFailToReceivePaymentMethodDetails {
+  [_paymentRequestCoordinator setPending:NO];
+  [_paymentRequestCoordinator setCancellable:YES];
+}
+
 - (void)paymentResponseHelperDidCompleteWithPaymentResponse:
     (const web::PaymentResponse&)paymentResponse {
   [_paymentRequestJsManager
@@ -859,6 +911,7 @@
     _pendingPaymentRequest->journey_logger().SetAborted(
         payments::JourneyLogger::ABORT_REASON_MERCHANT_NAVIGATION);
     _pendingPaymentRequest = nullptr;
+    [self resetIOSPaymentInstrumentLauncherDelegate];
   }
 
   [self dismissUI];
diff --git a/ios/chrome/browser/ui/payments/payment_request_mediator.mm b/ios/chrome/browser/ui/payments/payment_request_mediator.mm
index c4dbfb6..960b4e3e 100644
--- a/ios/chrome/browser/ui/payments/payment_request_mediator.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_mediator.mm
@@ -110,7 +110,7 @@
       self.paymentRequest->payment_details().total.label);
   payments::CurrencyFormatter* currencyFormatter =
       self.paymentRequest->GetOrCreateCurrencyFormatter();
-  item.price = SysUTF16ToNSString(l10n_util::GetStringFUTF16(
+  item.price = base::SysUTF16ToNSString(l10n_util::GetStringFUTF16(
       IDS_PAYMENT_REQUEST_ORDER_SUMMARY_SHEET_TOTAL_FORMAT,
       base::UTF8ToUTF16(currencyFormatter->formatted_currency_code()),
       currencyFormatter->Format(base::UTF16ToASCII(
@@ -144,7 +144,7 @@
   }
 
   CollectionViewDetailItem* item = [[CollectionViewDetailItem alloc] init];
-  item.text = SysUTF16ToNSString(
+  item.text = base::SysUTF16ToNSString(
       GetShippingAddressSectionString(self.paymentRequest->shipping_type()));
   if (self.paymentRequest->shipping_profiles().empty()) {
     item.detailText = [l10n_util::GetNSString(IDS_ADD)
@@ -163,7 +163,7 @@
     item.text = base::SysUTF16ToNSString(option->label);
     payments::CurrencyFormatter* currencyFormatter =
         self.paymentRequest->GetOrCreateCurrencyFormatter();
-    item.detailText = SysUTF16ToNSString(
+    item.detailText = base::SysUTF16ToNSString(
         currencyFormatter->Format(base::UTF16ToASCII(option->amount.value)));
     item.accessoryType = MDCCollectionViewCellAccessoryDisclosureIndicator;
     return item;
diff --git a/ios/chrome/browser/ui/payments/shipping_option_selection_mediator.mm b/ios/chrome/browser/ui/payments/shipping_option_selection_mediator.mm
index cd59363..46e80af 100644
--- a/ios/chrome/browser/ui/payments/shipping_option_selection_mediator.mm
+++ b/ios/chrome/browser/ui/payments/shipping_option_selection_mediator.mm
@@ -101,7 +101,7 @@
     item.text = base::SysUTF16ToNSString(shippingOption->label);
     payments::CurrencyFormatter* currencyFormatter =
         _paymentRequest->GetOrCreateCurrencyFormatter();
-    item.detailText = SysUTF16ToNSString(currencyFormatter->Format(
+    item.detailText = base::SysUTF16ToNSString(currencyFormatter->Format(
         base::UTF16ToASCII(shippingOption->amount.value)));
     if (_paymentRequest->selected_shipping_option() == shippingOption)
       _selectedItemIndex = index;
diff --git a/ios/chrome/browser/ui/product_tour/OWNERS b/ios/chrome/browser/ui/product_tour/OWNERS
index 48efb49e..bd85dcf2 100644
--- a/ios/chrome/browser/ui/product_tour/OWNERS
+++ b/ios/chrome/browser/ui/product_tour/OWNERS
@@ -1 +1,4 @@
 kkhorimoto@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/promos/OWNERS b/ios/chrome/browser/ui/promos/OWNERS
index f49ed38..01e8c98 100644
--- a/ios/chrome/browser/ui/promos/OWNERS
+++ b/ios/chrome/browser/ui/promos/OWNERS
@@ -1 +1,4 @@
 marq@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/qr_scanner/OWNERS b/ios/chrome/browser/ui/qr_scanner/OWNERS
index d2e1add..c85e66a 100644
--- a/ios/chrome/browser/ui/qr_scanner/OWNERS
+++ b/ios/chrome/browser/ui/qr_scanner/OWNERS
@@ -1 +1,4 @@
 jif@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/reader_mode/OWNERS b/ios/chrome/browser/ui/reader_mode/OWNERS
index bf1620f..ab525656 100644
--- a/ios/chrome/browser/ui/reader_mode/OWNERS
+++ b/ios/chrome/browser/ui/reader_mode/OWNERS
@@ -1 +1,4 @@
 noyau@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/reading_list/OWNERS b/ios/chrome/browser/ui/reading_list/OWNERS
index ad2440ad..8f4d804 100644
--- a/ios/chrome/browser/ui/reading_list/OWNERS
+++ b/ios/chrome/browser/ui/reading_list/OWNERS
@@ -4,3 +4,6 @@
 
 per-file *badge_view*=edchin@chromium.org
 per-file *badge_view*=gchatz@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/sad_tab/OWNERS b/ios/chrome/browser/ui/sad_tab/OWNERS
index 48efb49e..bd85dcf2 100644
--- a/ios/chrome/browser/ui/sad_tab/OWNERS
+++ b/ios/chrome/browser/ui/sad_tab/OWNERS
@@ -1 +1,4 @@
 kkhorimoto@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/settings/BUILD.gn b/ios/chrome/browser/ui/settings/BUILD.gn
index 96bcdce..bb4f70b 100644
--- a/ios/chrome/browser/ui/settings/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/BUILD.gn
@@ -350,7 +350,6 @@
     "//ios/chrome/browser/search_engines",
     "//ios/chrome/browser/signin",
     "//ios/chrome/browser/ui:ui_internal",
-    "//ios/chrome/browser/ui/authentication:authentication_ui",
     "//ios/chrome/browser/ui/settings:test_support",
     "//ios/chrome/browser/ui/tools_menu",
     "//ios/chrome/browser/ui/util:util",
diff --git a/ios/chrome/browser/ui/settings/OWNERS b/ios/chrome/browser/ui/settings/OWNERS
index ccddf8d..126713c7 100644
--- a/ios/chrome/browser/ui/settings/OWNERS
+++ b/ios/chrome/browser/ui/settings/OWNERS
@@ -1,2 +1,5 @@
 lpromero@chromium.org
 sdefresne@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/settings/accounts_collection_egtest.mm b/ios/chrome/browser/ui/settings/accounts_collection_egtest.mm
index 432b587a..9efe103 100644
--- a/ios/chrome/browser/ui/settings/accounts_collection_egtest.mm
+++ b/ios/chrome/browser/ui/settings/accounts_collection_egtest.mm
@@ -9,7 +9,6 @@
 #include "components/signin/core/browser/signin_manager.h"
 #include "components/strings/grit/components_strings.h"
 #include "ios/chrome/browser/signin/signin_manager_factory.h"
-#import "ios/chrome/browser/ui/settings/accounts_collection_view_controller.h"
 #include "ios/chrome/browser/ui/tools_menu/tools_menu_constants.h"
 #import "ios/chrome/browser/ui/tools_menu/tools_popup_controller.h"
 #include "ios/chrome/grit/ios_strings.h"
@@ -32,7 +31,6 @@
 using chrome_test_util::SettingsAccountButton;
 using chrome_test_util::SignOutAccountsButton;
 using chrome_test_util::SignInMenuButton;
-using chrome_test_util::SignInPromoView;
 
 namespace {
 
@@ -122,7 +120,7 @@
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()
       ->ForgetIdentity(identity, nil);
 
-  [[EarlGrey selectElementWithMatcher:SignInPromoView()]
+  [[EarlGrey selectElementWithMatcher:SignInMenuButton()]
       assertWithMatcher:grey_sufficientlyVisible()];
   AssertAuthenticatedIdentityInActiveProfile(nil);
 
@@ -152,7 +150,7 @@
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()
       ->ForgetIdentity(identity, nil);
 
-  [[EarlGrey selectElementWithMatcher:SignInPromoView()]
+  [[EarlGrey selectElementWithMatcher:SignInMenuButton()]
       assertWithMatcher:grey_sufficientlyVisible()];
   AssertAuthenticatedIdentityInActiveProfile(nil);
 
@@ -266,7 +264,7 @@
       performAction:grey_tap()];
 
   // Check that the user is signed out and the Main Settings screen is shown.
-  [[EarlGrey selectElementWithMatcher:SignInPromoView()]
+  [[EarlGrey selectElementWithMatcher:SignInMenuButton()]
       assertWithMatcher:grey_sufficientlyVisible()];
   AssertAuthenticatedIdentityInActiveProfile(nil);
 
@@ -300,7 +298,8 @@
       performAction:grey_tap()];
 
   // Check that Account Settings screen is open and |identity| is signed in.
-  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(kSettingsAccountsId)]
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::
+                                          SettingsAccountsCollectionView()]
       assertWithMatcher:grey_sufficientlyVisible()];
   AssertAuthenticatedIdentityInActiveProfile(identity);
 
diff --git a/ios/chrome/browser/ui/settings/settings_egtest.mm b/ios/chrome/browser/ui/settings/settings_egtest.mm
index 6d5ae00..2f1a430ac 100644
--- a/ios/chrome/browser/ui/settings/settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/settings_egtest.mm
@@ -21,7 +21,6 @@
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "ios/chrome/browser/pref_names.h"
-#import "ios/chrome/browser/ui/authentication/signin_promo_view.h"
 #import "ios/chrome/browser/ui/browser_view_controller.h"
 #import "ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.h"
 #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h"
@@ -777,9 +776,8 @@
                    @"Settings should register key commands when presented.");
 
   // Present the Sign-in UI.
-  id<GREYMatcher> matcher =
-      grey_allOf(grey_accessibilityID(kSigninPromoPrimaryButtonId),
-                 grey_sufficientlyVisible(), nil);
+  id<GREYMatcher> matcher = grey_allOf(chrome_test_util::SignInMenuButton(),
+                                       grey_sufficientlyVisible(), nil);
   [[EarlGrey selectElementWithMatcher:matcher] performAction:grey_tap()];
   // Wait for UI to finish loading the Sign-in screen.
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
diff --git a/ios/chrome/browser/ui/side_swipe/OWNERS b/ios/chrome/browser/ui/side_swipe/OWNERS
index 330cb31..867f7564 100644
--- a/ios/chrome/browser/ui/side_swipe/OWNERS
+++ b/ios/chrome/browser/ui/side_swipe/OWNERS
@@ -1 +1,4 @@
 justincohen@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/stack_view/OWNERS b/ios/chrome/browser/ui/stack_view/OWNERS
index 48efb49e..bd85dcf2 100644
--- a/ios/chrome/browser/ui/stack_view/OWNERS
+++ b/ios/chrome/browser/ui/stack_view/OWNERS
@@ -1 +1,4 @@
 kkhorimoto@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/sync/BUILD.gn b/ios/chrome/browser/ui/sync/BUILD.gn
index de187ce..164c8669 100644
--- a/ios/chrome/browser/ui/sync/BUILD.gn
+++ b/ios/chrome/browser/ui/sync/BUILD.gn
@@ -52,7 +52,6 @@
     "//ios/chrome/browser/bookmarks:bookmarks_utils",
     "//ios/chrome/browser/signin",
     "//ios/chrome/browser/sync",
-    "//ios/chrome/browser/ui/authentication:authentication_ui",
     "//ios/chrome/browser/ui/settings",
     "//ios/chrome/browser/ui/tools_menu",
     "//ios/chrome/test/app:test_support",
diff --git a/ios/chrome/browser/ui/sync/OWNERS b/ios/chrome/browser/ui/sync/OWNERS
index 3431e1a..3f08195 100644
--- a/ios/chrome/browser/ui/sync/OWNERS
+++ b/ios/chrome/browser/ui/sync/OWNERS
@@ -1,3 +1,6 @@
 msarda@chromium.org
 
 # COMPONENT: Services>Sync
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/sync/sync_fake_server_egtest.mm b/ios/chrome/browser/ui/sync/sync_fake_server_egtest.mm
index 278d2c5..0c0f325e 100644
--- a/ios/chrome/browser/ui/sync/sync_fake_server_egtest.mm
+++ b/ios/chrome/browser/ui/sync/sync_fake_server_egtest.mm
@@ -16,7 +16,6 @@
 #include "ios/chrome/browser/signin/authentication_service.h"
 #include "ios/chrome/browser/signin/authentication_service_factory.h"
 #include "ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.h"
-#import "ios/chrome/browser/ui/authentication/signin_promo_view.h"
 #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h"
 #include "ios/chrome/browser/ui/tools_menu/tools_menu_constants.h"
 #import "ios/chrome/browser/ui/tools_menu/tools_popup_controller.h"
diff --git a/ios/chrome/browser/ui/tab_switcher/OWNERS b/ios/chrome/browser/ui/tab_switcher/OWNERS
index f16c1db1..e2b64c4 100644
--- a/ios/chrome/browser/ui/tab_switcher/OWNERS
+++ b/ios/chrome/browser/ui/tab_switcher/OWNERS
@@ -1,2 +1,5 @@
 edchin@chromium.org
 jif@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_controller.mm
index a2cd683..2be9016 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_controller.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_controller.mm
@@ -244,7 +244,7 @@
         << " _distantSession->tabs.size() == " << distantSessionTabCount;
     synced_sessions::DistantTab* tab = _distantSession->tabs[tabIndex].get();
     CHECK(tab);
-    [panelCell setTitle:SysUTF16ToNSString(tab->title)];
+    [panelCell setTitle:base::SysUTF16ToNSString(tab->title)];
     [panelCell setSessionGURL:tab->virtual_url
              withBrowserState:[_model browserState]];
     [panelCell setDelegate:self];
diff --git a/ios/chrome/browser/ui/tabs/OWNERS b/ios/chrome/browser/ui/tabs/OWNERS
index 40a68c7..b127701 100644
--- a/ios/chrome/browser/ui/tabs/OWNERS
+++ b/ios/chrome/browser/ui/tabs/OWNERS
@@ -1 +1,4 @@
 rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/toolbar/OWNERS b/ios/chrome/browser/ui/toolbar/OWNERS
index 3306281..9b78e8b 100644
--- a/ios/chrome/browser/ui/toolbar/OWNERS
+++ b/ios/chrome/browser/ui/toolbar/OWNERS
@@ -1,2 +1,5 @@
 rohitrao@chromium.org
 justincohen@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/toolbar/keyboard_assist/OWNERS b/ios/chrome/browser/ui/toolbar/keyboard_assist/OWNERS
index d2e1add..c85e66a 100644
--- a/ios/chrome/browser/ui/toolbar/keyboard_assist/OWNERS
+++ b/ios/chrome/browser/ui/toolbar/keyboard_assist/OWNERS
@@ -1 +1,4 @@
 jif@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_controller.h b/ios/chrome/browser/ui/toolbar/toolbar_controller.h
index 01b2b6f..412e40a 100644
--- a/ios/chrome/browser/ui/toolbar/toolbar_controller.h
+++ b/ios/chrome/browser/ui/toolbar/toolbar_controller.h
@@ -294,6 +294,9 @@
 // Shows/hides iPhone toolbar views for when the new tab page is displayed.
 - (void)hideViewsForNewTabPage:(BOOL)hide;
 
+// Triggers an animation on the tools menu button to draw the user's attention.
+- (void)triggerToolsMenuButtonAnimation;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_controller.mm b/ios/chrome/browser/ui/toolbar/toolbar_controller.mm
index 5fbf638a9..ba069b311 100644
--- a/ios/chrome/browser/ui/toolbar/toolbar_controller.mm
+++ b/ios/chrome/browser/ui/toolbar/toolbar_controller.mm
@@ -1040,6 +1040,10 @@
   return hash;
 }
 
+- (void)triggerToolsMenuButtonAnimation {
+  [toolsMenuButton_ triggerAnimation];
+}
+
 #pragma mark -
 #pragma mark PopupMenuDelegate methods.
 
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm b/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm
index bd0d13e..519caa69 100644
--- a/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm
+++ b/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm
@@ -173,6 +173,12 @@
     EARL_GREY_TEST_SKIPPED(@"Test not support on iPhone");
   }
 
+  // TODO(crbug.com/753098): Re-enable this test on iOS 11 iPad once
+  // grey_typeText works on iOS 11.
+  if (base::ios::IsRunningOnIOS11OrLater()) {
+    EARL_GREY_TEST_DISABLED(@"Test disabled on iOS 11.");
+  }
+
   const GURL URL = web::test::HttpServer::MakeUrl("http://origin");
 
   [ChromeEarlGrey loadURL:URL];
@@ -282,11 +288,11 @@
     EARL_GREY_TEST_DISABLED(@"Disabled on iOS 9.");
   }
 
-  // TODO(crbug.com/747622): re-enable this test on iOS 11 once earl grey can
-  // interact with the share menu.
-  if (base::ios::IsRunningOnIOS11OrLater()) {
-    EARL_GREY_TEST_DISABLED(@"Disabled on iOS 11.");
-  }
+  // Clear generalPasteboard before and after the test.
+  [UIPasteboard generalPasteboard].string = @"";
+  [self setTearDownHandler:^{
+    [UIPasteboard generalPasteboard].string = @"";
+  }];
 
   std::map<GURL, std::string> responses;
   const GURL URL = web::test::HttpServer::MakeUrl("http://testPage");
@@ -297,11 +303,25 @@
   [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()]
       assertWithMatcher:chrome_test_util::OmniboxText(URL.GetContent())];
 
-  [ChromeEarlGreyUI openShareMenu];
-
-  [[EarlGrey
-      selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabel(
-                                   @"Copy")] performAction:grey_tap()];
+  if (base::ios::IsRunningOnIOS11OrLater()) {
+    // Can't access share menu from xctest on iOS 11+, so use the text field
+    // callout bar instead.
+    [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()]
+        performAction:grey_longPress()];
+    [[[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Select All")]
+        inRoot:grey_kindOfClass(NSClassFromString(@"UICalloutBarButton"))]
+        performAction:grey_tap()];
+    [[[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Copy")]
+        inRoot:grey_kindOfClass(NSClassFromString(@"UICalloutBarButton"))]
+        performAction:grey_tap()];
+    [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Typing Shield")]
+        performAction:grey_tap()];
+  } else {
+    [ChromeEarlGreyUI openShareMenu];
+    [[EarlGrey
+        selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabel(
+                                     @"Copy")] performAction:grey_tap()];
+  }
 
   [ChromeEarlGrey loadURL:secondURL];
 
@@ -320,6 +340,12 @@
 
 // Verifies that the clear text button clears any text in the omnibox.
 - (void)testOmniboxClearTextButton {
+  // TODO(crbug.com/753098): Re-enable this test on iOS 11 iPad once
+  // grey_typeText works on iOS 11.
+  if (base::ios::IsRunningOnIOS11OrLater() && IsIPadIdiom()) {
+    EARL_GREY_TEST_DISABLED(@"Test disabled on iOS 11.");
+  }
+
   const GURL URL = web::test::HttpServer::MakeUrl("http://origin");
 
   [ChromeEarlGrey loadURL:URL];
diff --git a/ios/chrome/browser/ui/tools_menu/OWNERS b/ios/chrome/browser/ui/tools_menu/OWNERS
index 67c824d2..403665e 100644
--- a/ios/chrome/browser/ui/tools_menu/OWNERS
+++ b/ios/chrome/browser/ui/tools_menu/OWNERS
@@ -1,2 +1,5 @@
 rohitrao@chromium.org
 jif@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h b/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h
index 66e1049..41aaaa8 100644
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h
+++ b/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h
@@ -32,6 +32,8 @@
 @property(nonatomic, getter=isInNewTabPage) BOOL inNewTabPage;
 // Indicates that the menu should show a "NEW" badge on the reading list item.
 @property(nonatomic, assign) BOOL showReadingListNewBadge;
+// Indicates that the New Incognito Tab cell should be highlighted in blue.
+@property(nonatomic, assign) BOOL highlightNewIncognitoTabCell;
 
 // Indicates that the menu is being shown while user agent is |userAgentType|.
 // If NONE, shows "Request Desktop Site" in disabled state.
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.mm
index 441b491..fdd6309 100644
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.mm
+++ b/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.mm
@@ -18,6 +18,7 @@
 @synthesize noOpenedTabs = _noOpenedTabs;
 @synthesize inIncognito = _inIncognito;
 @synthesize showReadingListNewBadge = _showReadingListNewBadge;
+@synthesize highlightNewIncognitoTabCell = _highlightNewIncognitoTabCell;
 @synthesize userAgentType = _userAgentType;
 @synthesize requestStartTime = _requestStartTime;
 @synthesize inNewTabPage = _inNewTabPage;
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.h b/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.h
index 8e7ff99..fbd9762 100644
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.h
+++ b/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.h
@@ -98,6 +98,10 @@
 
 - (void)hideContent;
 
+// Highlight the New Incognito Tab cell in blue. The highlight fades in, pulses
+// once, and fades out.
+- (void)triggerNewIncognitoTabCellHighlight;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm
index 920ff87..0a2db26 100644
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm
+++ b/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm
@@ -15,6 +15,7 @@
 #include "components/strings/grit/components_strings.h"
 #include "ios/chrome/browser/experimental_flags.h"
 #import "ios/chrome/browser/ui/animation_util.h"
+#import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
 #import "ios/chrome/browser/ui/commands/UIKit+ChromeExecuteCommand.h"
 #import "ios/chrome/browser/ui/commands/browser_commands.h"
 #include "ios/chrome/browser/ui/commands/ios_command_ids.h"
@@ -120,6 +121,9 @@
 // Determines if the reading list should display a new feature badge. Defaults
 // to |NO|.
 @property(nonatomic, assign) BOOL showReadingListNewBadge;
+// Indicates whether the New Incognito Tab cell should be highlighted. Defaults
+// to |NO|.
+@property(nonatomic, assign) BOOL highlightNewIncognitoTabCell;
 // Tracks events for the purpose of in-product help. Does not take ownership of
 // tracker. Tracker must not be destroyed during lifetime of
 // ToolsMenuViewController. Defaults to |NULL|.
@@ -139,6 +143,7 @@
 @implementation ToolsMenuViewController
 
 @synthesize showReadingListNewBadge = _showReadingListNewBadge;
+@synthesize highlightNewIncognitoTabCell = _highlightNewIncognitoTabCell;
 @synthesize engagementTracker = _engagementTracker;
 @synthesize menuView = _menuView;
 @synthesize isCurrentPageBookmarked = _isCurrentPageBookmarked;
@@ -232,6 +237,8 @@
   self.requestStartTime = configuration.requestStartTime;
   self.showReadingListNewBadge = configuration.showReadingListNewBadge;
   self.engagementTracker = configuration.engagementTracker;
+  self.highlightNewIncognitoTabCell =
+      configuration.highlightNewIncognitoTabCell;
 
   if (configuration.readingListMenuNotifier) {
     _readingListMenuNotifier = configuration.readingListMenuNotifier;
@@ -473,6 +480,9 @@
   [[self readingListCell]
       updateSeenState:_readingListMenuNotifier.readingListUnseenItemsExist
              animated:YES];
+  if (self.highlightNewIncognitoTabCell) {
+    [self triggerNewIncognitoTabCellHighlight];
+  }
 }
 
 - (void)hideContent {
@@ -678,4 +688,33 @@
   [[self readingListCell] updateSeenState:unseenItemsExist animated:YES];
 }
 
+#pragma mark - New Incognito Tab in-product help promotion
+
+- (void)triggerNewIncognitoTabCellHighlight {
+  for (ToolsMenuViewCell* visibleCell in [_menuView visibleCells]) {
+    if ([visibleCell.accessibilityIdentifier
+            isEqualToString:kToolsMenuNewIncognitoTabId]) {
+      // Set the label's background color to be clear so that the highlight is
+      // is not covered by the label.
+      visibleCell.title.backgroundColor = [UIColor clearColor];
+      [UIView animateWithDuration:ios::material::kDuration5
+          delay:0.0
+          options:UIViewAnimationOptionAllowUserInteraction |
+                  UIViewAnimationOptionRepeat |
+                  UIViewAnimationOptionAutoreverse |
+                  UIViewAnimationOptionCurveEaseInOut
+          animations:^{
+            [UIView setAnimationRepeatCount:2];
+            visibleCell.contentView.backgroundColor =
+                [[MDCPalette cr_bluePalette] tint100];
+          }
+          completion:^(BOOL finished) {
+            visibleCell.contentView.backgroundColor = [UIColor whiteColor];
+          }];
+      self.highlightNewIncognitoTabCell = NO;
+      break;
+    }
+  }
+}
+
 @end
diff --git a/ios/chrome/browser/ui/tools_menu/tools_popup_menu_egtest.mm b/ios/chrome/browser/ui/tools_menu/tools_popup_menu_egtest.mm
index ba37230..5c655c4 100644
--- a/ios/chrome/browser/ui/tools_menu/tools_popup_menu_egtest.mm
+++ b/ios/chrome/browser/ui/tools_menu/tools_popup_menu_egtest.mm
@@ -53,8 +53,7 @@
         performAction:grey_tap()];
   }
 
-  [[EarlGrey
-      selectElementWithMatcher:grey_accessibilityID(kToolsMenuTableViewId)]
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::ToolsMenuView()]
       assertWithMatcher:grey_notVisible()];
 }
 
diff --git a/ios/chrome/browser/ui/util/OWNERS b/ios/chrome/browser/ui/util/OWNERS
index 1f7a7b8..37eb1aa3 100644
--- a/ios/chrome/browser/ui/util/OWNERS
+++ b/ios/chrome/browser/ui/util/OWNERS
@@ -1,2 +1,5 @@
 kkhorimoto@chromium.org
 marq@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/voice/OWNERS b/ios/chrome/browser/ui/voice/OWNERS
index 48efb49e..bd85dcf2 100644
--- a/ios/chrome/browser/ui/voice/OWNERS
+++ b/ios/chrome/browser/ui/voice/OWNERS
@@ -1 +1,4 @@
 kkhorimoto@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/webui/OWNERS b/ios/chrome/browser/ui/webui/OWNERS
index be9def2..11231a36 100644
--- a/ios/chrome/browser/ui/webui/OWNERS
+++ b/ios/chrome/browser/ui/webui/OWNERS
@@ -3,3 +3,6 @@
 
 per-file ntp_tiles_internals_ui.*=file://components/ntp_tiles/OWNERS
 per-file popular_sites_internals_ui.*=file://components/ntp_tiles/OWNERS
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/webui/gcm/OWNERS b/ios/chrome/browser/ui/webui/gcm/OWNERS
index 295d996..2271273 100644
--- a/ios/chrome/browser/ui/webui/gcm/OWNERS
+++ b/ios/chrome/browser/ui/webui/gcm/OWNERS
@@ -4,3 +4,6 @@
 zea@chromium.org
 
 # COMPONENT: Services>CloudMessaging
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/webui/net_export/OWNERS b/ios/chrome/browser/ui/webui/net_export/OWNERS
index be796293..3d058981 100644
--- a/ios/chrome/browser/ui/webui/net_export/OWNERS
+++ b/ios/chrome/browser/ui/webui/net_export/OWNERS
@@ -1,3 +1,6 @@
 file://net/OWNERS
 
 # COMPONENT: Internals>Network>Logging
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/ui/webui/sync_internals/OWNERS b/ios/chrome/browser/ui/webui/sync_internals/OWNERS
index 261ab18..c1575f5 100644
--- a/ios/chrome/browser/ui/webui/sync_internals/OWNERS
+++ b/ios/chrome/browser/ui/webui/sync_internals/OWNERS
@@ -1 +1,4 @@
 file://components/sync/OWNERS
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/update_client/OWNERS b/ios/chrome/browser/update_client/OWNERS
index 75e2f4d..8d0e8658 100644
--- a/ios/chrome/browser/update_client/OWNERS
+++ b/ios/chrome/browser/update_client/OWNERS
@@ -4,3 +4,6 @@
 waffles@chromium.org
 
 # COMPONENT: Internals>Installer>Components
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/voice/OWNERS b/ios/chrome/browser/voice/OWNERS
index cc50037..2f0d436 100644
--- a/ios/chrome/browser/voice/OWNERS
+++ b/ios/chrome/browser/voice/OWNERS
@@ -1,2 +1,5 @@
 kkhorimoto@chromium.org
 rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/web/OWNERS b/ios/chrome/browser/web/OWNERS
index 5a2923e..1a6c73c5 100644
--- a/ios/chrome/browser/web/OWNERS
+++ b/ios/chrome/browser/web/OWNERS
@@ -1,2 +1,5 @@
 eugenebut@chromium.org
 # This directory needs to be carved into subdirs with more specific OWNERS.
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/web/resources/OWNERS b/ios/chrome/browser/web/resources/OWNERS
index da255e6..7b2fb33 100644
--- a/ios/chrome/browser/web/resources/OWNERS
+++ b/ios/chrome/browser/web/resources/OWNERS
@@ -1 +1,4 @@
 per-file payment_request.js=mahmadi@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/web/sad_tab_tab_helper_unittest.mm b/ios/chrome/browser/web/sad_tab_tab_helper_unittest.mm
index 487e670..fc30ccd3 100644
--- a/ios/chrome/browser/web/sad_tab_tab_helper_unittest.mm
+++ b/ios/chrome/browser/web/sad_tab_tab_helper_unittest.mm
@@ -39,6 +39,7 @@
 // Tests that SadTab is not presented for not shown web states.
 TEST_F(SadTabTabHelperTest, NotPresented) {
   OCMStub([application_ applicationState]).andReturn(UIApplicationStateActive);
+  web_state_.WasHidden();
 
   // WebState should not have presented a transient content view.
   EXPECT_FALSE(web_state_.GetTransientContentView());
diff --git a/ios/chrome/browser/web_resource/OWNERS b/ios/chrome/browser/web_resource/OWNERS
index 50c6bcd4..16d5d98c 100644
--- a/ios/chrome/browser/web_resource/OWNERS
+++ b/ios/chrome/browser/web_resource/OWNERS
@@ -1,2 +1,5 @@
 achuith@chromium.org
 rsesek@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/browser/web_state_list/OWNERS b/ios/chrome/browser/web_state_list/OWNERS
index c5cd5cb..39066e1 100644
--- a/ios/chrome/browser/web_state_list/OWNERS
+++ b/ios/chrome/browser/web_state_list/OWNERS
@@ -1 +1,4 @@
 sdefresne@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/common/physical_web/OWNERS b/ios/chrome/common/physical_web/OWNERS
index 3ebff38d..56360bb 100644
--- a/ios/chrome/common/physical_web/OWNERS
+++ b/ios/chrome/common/physical_web/OWNERS
@@ -1 +1,4 @@
 olivierrobin@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/content_widget_extension/OWNERS b/ios/chrome/content_widget_extension/OWNERS
index 55fb7e49..2b72d62 100644
--- a/ios/chrome/content_widget_extension/OWNERS
+++ b/ios/chrome/content_widget_extension/OWNERS
@@ -1 +1,3 @@
-lod@chromium.org
\ No newline at end of file
+lod@chromium.org
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/search_widget_extension/OWNERS b/ios/chrome/search_widget_extension/OWNERS
index 55fb7e49..2b72d62 100644
--- a/ios/chrome/search_widget_extension/OWNERS
+++ b/ios/chrome/search_widget_extension/OWNERS
@@ -1 +1,3 @@
-lod@chromium.org
\ No newline at end of file
+lod@chromium.org
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/share_extension/OWNERS b/ios/chrome/share_extension/OWNERS
index 3ebff38d..56360bb 100644
--- a/ios/chrome/share_extension/OWNERS
+++ b/ios/chrome/share_extension/OWNERS
@@ -1 +1,4 @@
 olivierrobin@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn
index 7a7cbe32..cce1532 100644
--- a/ios/chrome/test/BUILD.gn
+++ b/ios/chrome/test/BUILD.gn
@@ -166,6 +166,7 @@
     "//ios/chrome/browser/ui/autofill/cells:unit_tests",
     "//ios/chrome/browser/ui/bookmarks:unit_tests",
     "//ios/chrome/browser/ui/bookmarks/cells:unit_tests",
+    "//ios/chrome/browser/ui/browser_list:unit_tests",
     "//ios/chrome/browser/ui/bubble:unit_tests",
     "//ios/chrome/browser/ui/collection_view:unit_tests",
     "//ios/chrome/browser/ui/collection_view/cells:unit_tests",
@@ -215,7 +216,6 @@
     "//ios/chrome/search_widget_extension:unit_tests",
     "//ios/chrome/test/base:unit_tests",
     "//ios/shared/chrome/browser/ui/broadcaster:unit_tests",
-    "//ios/shared/chrome/browser/ui/browser_list:unit_tests",
     "//ios/shared/chrome/browser/ui/commands:unit_tests",
     "//ios/shared/chrome/browser/ui/coordinators:unit_tests",
     "//ios/shared/chrome/browser/ui/dialogs:unit_tests",
diff --git a/ios/chrome/test/OWNERS b/ios/chrome/test/OWNERS
index 1df316e..6f764fe 100644
--- a/ios/chrome/test/OWNERS
+++ b/ios/chrome/test/OWNERS
@@ -1 +1,4 @@
 baxley@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/test/app/BUILD.gn b/ios/chrome/test/app/BUILD.gn
index bdd90add..c689139e 100644
--- a/ios/chrome/test/app/BUILD.gn
+++ b/ios/chrome/test/app/BUILD.gn
@@ -67,7 +67,6 @@
     "//ios/chrome/browser/sync",
     "//ios/chrome/browser/tabs",
     "//ios/chrome/browser/ui:ui_internal",
-    "//ios/chrome/browser/ui/authentication:authentication_ui",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/main",
     "//ios/chrome/browser/ui/ntp:ntp_controller",
diff --git a/ios/chrome/test/app/signin_test_util.h b/ios/chrome/test/app/signin_test_util.h
index b60ada30..1f9fcfa3 100644
--- a/ios/chrome/test/app/signin_test_util.h
+++ b/ios/chrome/test/app/signin_test_util.h
@@ -25,10 +25,6 @@
 // the accounts were correctly removed from the keychain.
 bool SignOutAndClearAccounts();
 
-// Resets Sign-in promo impression preferences for bookmarks and settings view,
-// and resets kIosBookmarkPromoAlreadySeen flag for bookmarks.
-void ResetSigninPromoPreferences();
-
 }  // namespace chrome_test_util
 
 #endif  // IOS_CHROME_TEST_APP_SIGNIN_TEST_UTIL_H_
diff --git a/ios/chrome/test/app/signin_test_util.mm b/ios/chrome/test/app/signin_test_util.mm
index 096390c..8fc529e4 100644
--- a/ios/chrome/test/app/signin_test_util.mm
+++ b/ios/chrome/test/app/signin_test_util.mm
@@ -12,12 +12,10 @@
 #include "components/signin/core/common/signin_pref_names.h"
 #include "google_apis/gaia/gaia_constants.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
-#include "ios/chrome/browser/pref_names.h"
 #include "ios/chrome/browser/signin/account_tracker_service_factory.h"
 #import "ios/chrome/browser/signin/authentication_service.h"
 #include "ios/chrome/browser/signin/authentication_service_factory.h"
 #include "ios/chrome/browser/signin/gaia_auth_fetcher_ios.h"
-#import "ios/chrome/browser/ui/authentication/signin_promo_view.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/public/provider/chrome/browser/chrome_browser_provider.h"
 #import "ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.h"
@@ -174,12 +172,4 @@
   return !identity_service->HasIdentities();
 }
 
-void ResetSigninPromoPreferences() {
-  ios::ChromeBrowserState* browser_state = GetOriginalBrowserState();
-  PrefService* prefs = browser_state->GetPrefs();
-  prefs->SetInteger(prefs::kIosBookmarkSigninPromoDisplayedCount, 0);
-  prefs->SetBoolean(prefs::kIosBookmarkPromoAlreadySeen, false);
-  prefs->SetInteger(prefs::kIosSettingsSigninPromoDisplayedCount, 0);
-}
-
 }  // namespace chrome_test_util
diff --git a/ios/chrome/test/data/OWNERS b/ios/chrome/test/data/OWNERS
index 72e8ffc..d03d28b 100644
--- a/ios/chrome/test/data/OWNERS
+++ b/ios/chrome/test/data/OWNERS
@@ -1 +1,4 @@
 *
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn
index ceb5f1e..bee6b5d 100644
--- a/ios/chrome/test/earl_grey/BUILD.gn
+++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -179,12 +179,10 @@
   deps = [
     "//base",
     "//base/test:test_support",
-    "//components/signin/core/common",
     "//components/strings",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/ui",
     "//ios/chrome/browser/ui/authentication:authentication",
-    "//ios/chrome/browser/ui/authentication:authentication_ui",
     "//ios/chrome/browser/ui/collection_view/cells",
     "//ios/chrome/browser/ui/commands:commands",
     "//ios/chrome/browser/ui/omnibox:omnibox_internal",
diff --git a/ios/chrome/test/earl_grey/OWNERS b/ios/chrome/test/earl_grey/OWNERS
index 86cd262..b69f0d0 100644
--- a/ios/chrome/test/earl_grey/OWNERS
+++ b/ios/chrome/test/earl_grey/OWNERS
@@ -1,2 +1,5 @@
 baxley@chromium.org
 liaoyuke@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.h b/ios/chrome/test/earl_grey/chrome_matchers.h
index 0b4e542..adb7a10 100644
--- a/ios/chrome/test/earl_grey/chrome_matchers.h
+++ b/ios/chrome/test/earl_grey/chrome_matchers.h
@@ -101,12 +101,12 @@
 // Returns matcher for the settings button in the tools menu.
 id<GREYMatcher> SettingsMenuButton();
 
+// Returns matcher for the tools menu table view.
+id<GREYMatcher> ToolsMenuView();
+
 // Returns matcher for the OK button.
 id<GREYMatcher> OKButton();
 
-// Returns matcher for the sign-in promo view in the settings menu.
-id<GREYMatcher> SignInPromoView();
-
 // Returns matcher for the signin button in the settings menu.
 id<GREYMatcher> SignInMenuButton();
 
@@ -114,6 +114,15 @@
 // settings menu.
 id<GREYMatcher> SettingsAccountButton();
 
+// Returns matcher for the accounts collection view.
+id<GREYMatcher> SettingsAccountsCollectionView();
+
+// Returns matcher for the Import Data cell in switch sync account view.
+id<GREYMatcher> SettingsImportDataImportButton();
+
+// Returns matcher for the Keep Data Separate cell in switch sync account view.
+id<GREYMatcher> SettingsImportDataKeepSeparateButton();
+
 // Returns matcher for the menu button to sync accounts.
 id<GREYMatcher> AccountsSyncButton();
 
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.mm b/ios/chrome/test/earl_grey/chrome_matchers.mm
index addbce3..618018a1 100644
--- a/ios/chrome/test/earl_grey/chrome_matchers.mm
+++ b/ios/chrome/test/earl_grey/chrome_matchers.mm
@@ -12,11 +12,11 @@
 #include "base/strings/sys_string_conversions.h"
 #import "base/test/ios/wait_util.h"
 #include "components/strings/grit/components_strings.h"
-#import "ios/chrome/browser/ui/authentication/signin_promo_view.h"
 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_switch_item.h"
 #import "ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h"
 #import "ios/chrome/browser/ui/settings/accounts_collection_view_controller.h"
 #import "ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.h"
+#import "ios/chrome/browser/ui/settings/import_data_collection_view_controller.h"
 #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h"
 #import "ios/chrome/browser/ui/static_content/static_html_view_controller.h"
 #import "ios/chrome/browser/ui/toolbar/toolbar_controller.h"
@@ -190,22 +190,34 @@
   return grey_accessibilityID(kToolsMenuSettingsId);
 }
 
+id<GREYMatcher> ToolsMenuView() {
+  return grey_accessibilityID(kToolsMenuTableViewId);
+}
+
 id<GREYMatcher> OKButton() {
   return ButtonWithAccessibilityLabelId(IDS_OK);
 }
 
-id<GREYMatcher> SignInPromoView() {
-  return grey_accessibilityID(kSigninPromoViewId);
-}
-
 id<GREYMatcher> SignInMenuButton() {
-  return grey_accessibilityID(kSigninPromoSecondaryButtonId);
+  return grey_accessibilityID(kSettingsSignInCellId);
 }
 
 id<GREYMatcher> SettingsAccountButton() {
   return grey_accessibilityID(kSettingsAccountCellId);
 }
 
+id<GREYMatcher> SettingsAccountsCollectionView() {
+  return grey_accessibilityID(kSettingsAccountsId);
+}
+
+id<GREYMatcher> SettingsImportDataImportButton() {
+  return grey_accessibilityID(kImportDataImportCellId);
+}
+
+id<GREYMatcher> SettingsImportDataKeepSeparateButton() {
+  return grey_accessibilityID(kImportDataKeepSeparateCellId);
+}
+
 id<GREYMatcher> AccountsSyncButton() {
   return grey_accessibilityID(kSettingsAccountsSyncCellId);
 }
diff --git a/ios/chrome/test/earl_grey/chrome_test_case.mm b/ios/chrome/test/earl_grey/chrome_test_case.mm
index 4aaf058..6da92b8 100644
--- a/ios/chrome/test/earl_grey/chrome_test_case.mm
+++ b/ios/chrome/test/earl_grey/chrome_test_case.mm
@@ -8,10 +8,8 @@
 
 #import <EarlGrey/EarlGrey.h>
 
-#include "base/command_line.h"
 #include "base/mac/scoped_block.h"
 #include "base/strings/sys_string_conversions.h"
-#include "components/signin/core/common/signin_switches.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #include "ios/chrome/test/app/settings_test_util.h"
 #include "ios/chrome/test/app/signin_test_util.h"
@@ -165,7 +163,6 @@
   _isMockAuthenticationDisabled = NO;
   _tearDownHandler = nil;
 
-  chrome_test_util::ResetSigninPromoPreferences();
   chrome_test_util::OpenNewTab();
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
 }
@@ -250,11 +247,6 @@
 }
 
 + (void)enableMockAuthentication {
-  // Enable sign-in promo for all tests.
-  // TODO(crbug.com/739910): Remove this line when the sign-in promo is enabled
-  // by default.
-  base::CommandLine::ForCurrentProcess()->AppendSwitch(
-      switches::kEnableSigninPromo);
   chrome_test_util::SetUpMockAuthentication();
   chrome_test_util::SetUpMockAccountReconcilor();
   chrome_test_util::SetUpFakeSyncServer();
diff --git a/ios/chrome/today_extension/OWNERS b/ios/chrome/today_extension/OWNERS
index 3ebff38d..56360bb 100644
--- a/ios/chrome/today_extension/OWNERS
+++ b/ios/chrome/today_extension/OWNERS
@@ -1 +1,4 @@
 olivierrobin@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/clean/OWNERS b/ios/clean/OWNERS
index 6d63668..d846ad4fa 100644
--- a/ios/clean/OWNERS
+++ b/ios/clean/OWNERS
@@ -1,3 +1,6 @@
 edchin@chromium.org
 lpromero@chromium.org
 marq@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/clean/chrome/app/steps/BUILD.gn b/ios/clean/chrome/app/steps/BUILD.gn
index a9a6b5e..c6640336 100644
--- a/ios/clean/chrome/app/steps/BUILD.gn
+++ b/ios/clean/chrome/app/steps/BUILD.gn
@@ -55,11 +55,11 @@
     "//ios/chrome/browser/browser_state",
     "//ios/chrome/browser/browser_state:browser_state_impl",
     "//ios/chrome/browser/content_settings",
+    "//ios/chrome/browser/ui/browser_list",
     "//ios/chrome/browser/web:web_internal",
     "//ios/chrome/browser/web_state_list",
     "//ios/clean/chrome/browser/ui/root",
     "//ios/net",
-    "//ios/shared/chrome/browser/ui/browser_list",
     "//ios/shared/chrome/browser/ui/coordinators",
     "//ios/web:web_arc",
   ]
diff --git a/ios/clean/chrome/app/steps/root_coordinator+application_step.mm b/ios/clean/chrome/app/steps/root_coordinator+application_step.mm
index ac306df..29ce9606 100644
--- a/ios/clean/chrome/app/steps/root_coordinator+application_step.mm
+++ b/ios/clean/chrome/app/steps/root_coordinator+application_step.mm
@@ -7,13 +7,13 @@
 #include "base/memory/ptr_util.h"
 #include "base/supports_user_data.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#import "ios/chrome/browser/ui/browser_list/browser.h"
+#import "ios/chrome/browser/ui/browser_list/browser_list.h"
+#import "ios/chrome/browser/ui/browser_list/browser_list_session_service.h"
+#import "ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/chrome/browser/web_state_list/web_state_opener.h"
 #import "ios/clean/chrome/app/application_state.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser_list.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser_list_session_service.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.h"
 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
 #import "ios/web/public/navigation_manager.h"
 #include "ios/web/public/web_state/web_state.h"
diff --git a/ios/clean/chrome/app/steps/root_coordinator_initializer.mm b/ios/clean/chrome/app/steps/root_coordinator_initializer.mm
index d098a546..0feba6b 100644
--- a/ios/clean/chrome/app/steps/root_coordinator_initializer.mm
+++ b/ios/clean/chrome/app/steps/root_coordinator_initializer.mm
@@ -7,14 +7,14 @@
 #import "ios/chrome/app/startup/provider_registration.h"
 #include "ios/chrome/browser/application_context.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#import "ios/chrome/browser/ui/browser_list/browser_list.h"
+#import "ios/chrome/browser/ui/browser_list/browser_list_session_service.h"
+#import "ios/chrome/browser/ui/browser_list/browser_list_session_service_factory.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/chrome/browser/web_state_list/web_state_opener.h"
 #import "ios/clean/chrome/app/steps/step_context.h"
 #import "ios/clean/chrome/app/steps/step_features.h"
 #import "ios/clean/chrome/browser/ui/root/root_coordinator.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser_list.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser_list_session_service.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser_list_session_service_factory.h"
 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
 #include "ios/web/public/web_state/web_state.h"
 
diff --git a/ios/clean/chrome/browser/ui/bookmarks/BUILD.gn b/ios/clean/chrome/browser/ui/bookmarks/BUILD.gn
index dec4e7694..591d83f 100644
--- a/ios/clean/chrome/browser/ui/bookmarks/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/bookmarks/BUILD.gn
@@ -13,7 +13,7 @@
   deps = [
     "//ios/chrome/browser/ui",
     "//ios/chrome/browser/ui/bookmarks",
-    "//ios/shared/chrome/browser/ui/browser_list",
+    "//ios/chrome/browser/ui/browser_list",
     "//ios/shared/chrome/browser/ui/coordinators",
   ]
 }
diff --git a/ios/clean/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm b/ios/clean/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm
index 2a3a6f0..63b16bc 100644
--- a/ios/clean/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/bookmarks/bookmarks_coordinator.mm
@@ -7,8 +7,8 @@
 #import "ios/chrome/browser/ui/bookmarks/bookmark_controller_factory.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_home_tablet_ntp_controller.h"
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 #include "ios/chrome/browser/ui/ui_util.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/clean/chrome/browser/ui/context_menu/BUILD.gn b/ios/clean/chrome/browser/ui/context_menu/BUILD.gn
index 75ed85b0..ec87bff 100644
--- a/ios/clean/chrome/browser/ui/context_menu/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/context_menu/BUILD.gn
@@ -16,9 +16,9 @@
 
   deps = [
     ":context_menu_ui",
+    "//ios/chrome/browser/ui/browser_list",
     "//ios/chrome/browser/web_state_list:web_state_list",
     "//ios/clean/chrome/browser/ui/commands:commands",
-    "//ios/shared/chrome/browser/ui/browser_list",
     "//ios/shared/chrome/browser/ui/commands",
     "//ios/shared/chrome/browser/ui/coordinators",
     "//ios/web",
diff --git a/ios/clean/chrome/browser/ui/context_menu/context_menu_mediator.mm b/ios/clean/chrome/browser/ui/context_menu/context_menu_mediator.mm
index fe17c57..2c5d24b 100644
--- a/ios/clean/chrome/browser/ui/context_menu/context_menu_mediator.mm
+++ b/ios/clean/chrome/browser/ui/context_menu/context_menu_mediator.mm
@@ -4,10 +4,10 @@
 
 #import "ios/clean/chrome/browser/ui/context_menu/context_menu_mediator.h"
 
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 #import "ios/clean/chrome/browser/ui/commands/context_menu_commands.h"
 #import "ios/clean/chrome/browser/ui/context_menu/context_menu_consumer.h"
 #import "ios/clean/chrome/browser/ui/context_menu/context_menu_context_impl.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
 #import "ios/web/public/url_scheme_util.h"
 #include "url/gurl.h"
 
diff --git a/ios/clean/chrome/browser/ui/context_menu/web_context_menu_coordinator.mm b/ios/clean/chrome/browser/ui/context_menu/web_context_menu_coordinator.mm
index a86ea59..253777b 100644
--- a/ios/clean/chrome/browser/ui/context_menu/web_context_menu_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/context_menu/web_context_menu_coordinator.mm
@@ -5,11 +5,11 @@
 #import "ios/clean/chrome/browser/ui/context_menu/web_context_menu_coordinator.h"
 
 #include "base/logging.h"
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 #import "ios/clean/chrome/browser/ui/commands/context_menu_commands.h"
 #import "ios/clean/chrome/browser/ui/context_menu/context_menu_context_impl.h"
 #import "ios/clean/chrome/browser/ui/context_menu/context_menu_mediator.h"
 #import "ios/clean/chrome/browser/ui/context_menu/context_menu_view_controller.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
 #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
 
diff --git a/ios/clean/chrome/browser/ui/find_in_page/BUILD.gn b/ios/clean/chrome/browser/ui/find_in_page/BUILD.gn
index dccbfe0..918c16d 100644
--- a/ios/clean/chrome/browser/ui/find_in_page/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/find_in_page/BUILD.gn
@@ -16,11 +16,11 @@
     ":find_in_page_ui",
     "//base",
     "//ios/chrome/browser/find_in_page",
+    "//ios/chrome/browser/ui/browser_list",
     "//ios/chrome/browser/web_state_list",
     "//ios/clean/chrome/browser",
     "//ios/clean/chrome/browser/ui/actions",
     "//ios/clean/chrome/browser/ui/commands",
-    "//ios/shared/chrome/browser/ui/browser_list",
     "//ios/shared/chrome/browser/ui/commands",
     "//ios/shared/chrome/browser/ui/coordinators",
     "//ios/web",
diff --git a/ios/clean/chrome/browser/ui/find_in_page/find_in_page_coordinator.mm b/ios/clean/chrome/browser/ui/find_in_page/find_in_page_coordinator.mm
index 14acfc1..01ec12e 100644
--- a/ios/clean/chrome/browser/ui/find_in_page/find_in_page_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/find_in_page/find_in_page_coordinator.mm
@@ -8,11 +8,11 @@
 
 #include "base/logging.h"
 #import "ios/chrome/browser/find_in_page/find_tab_helper.h"
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 #include "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/clean/chrome/browser/ui/commands/find_in_page_visibility_commands.h"
 #import "ios/clean/chrome/browser/ui/find_in_page/find_in_page_mediator.h"
 #import "ios/clean/chrome/browser/ui/find_in_page/find_in_page_view_controller.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
 #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
 
diff --git a/ios/clean/chrome/browser/ui/ntp/BUILD.gn b/ios/clean/chrome/browser/ui/ntp/BUILD.gn
index a774196f..d1972ca 100644
--- a/ios/clean/chrome/browser/ui/ntp/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/ntp/BUILD.gn
@@ -32,6 +32,7 @@
     "//ios/chrome/browser/reading_list",
     "//ios/chrome/browser/ui",
     "//ios/chrome/browser/ui/alert_coordinator",
+    "//ios/chrome/browser/ui/browser_list",
     "//ios/chrome/browser/ui/content_suggestions",
     "//ios/chrome/browser/ui/content_suggestions:content_suggestions_util",
     "//ios/chrome/browser/ui/content_suggestions/cells",
@@ -42,7 +43,6 @@
     "//ios/clean/chrome/browser/ui/bookmarks",
     "//ios/clean/chrome/browser/ui/commands",
     "//ios/clean/chrome/browser/ui/recent_tabs",
-    "//ios/shared/chrome/browser/ui/browser_list",
     "//ios/shared/chrome/browser/ui/commands",
     "//ios/shared/chrome/browser/ui/coordinators",
     "//ios/web:web_arc",
diff --git a/ios/clean/chrome/browser/ui/ntp/ntp_coordinator.mm b/ios/clean/chrome/browser/ui/ntp/ntp_coordinator.mm
index 3380b4e..365ab19c 100644
--- a/ios/clean/chrome/browser/ui/ntp/ntp_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/ntp/ntp_coordinator.mm
@@ -5,6 +5,7 @@
 #import "ios/clean/chrome/browser/ui/ntp/ntp_coordinator.h"
 
 #include "base/logging.h"
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/clean/chrome/browser/ui/bookmarks/bookmarks_coordinator.h"
 #import "ios/clean/chrome/browser/ui/commands/ntp_commands.h"
@@ -12,7 +13,6 @@
 #import "ios/clean/chrome/browser/ui/ntp/ntp_mediator.h"
 #import "ios/clean/chrome/browser/ui/ntp/ntp_view_controller.h"
 #import "ios/clean/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
 #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
 
diff --git a/ios/clean/chrome/browser/ui/ntp/ntp_home_coordinator.mm b/ios/clean/chrome/browser/ui/ntp/ntp_home_coordinator.mm
index ce336ed..19a27c76 100644
--- a/ios/clean/chrome/browser/ui/ntp/ntp_home_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/ntp/ntp_home_coordinator.mm
@@ -20,6 +20,7 @@
 #include "ios/chrome/browser/ntp_tiles/ios_most_visited_sites_factory.h"
 #include "ios/chrome/browser/reading_list/reading_list_model_factory.h"
 #import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h"
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_gesture_commands.h"
 #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_item.h"
 #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h"
@@ -38,7 +39,6 @@
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/clean/chrome/browser/ui/ntp/ntp_home_header_coordinator.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
 #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
 #import "ios/third_party/material_components_ios/src/components/Snackbar/src/MaterialSnackbar.h"
diff --git a/ios/clean/chrome/browser/ui/omnibox/BUILD.gn b/ios/clean/chrome/browser/ui/omnibox/BUILD.gn
index 44ddf1a96..1b75b9f 100644
--- a/ios/clean/chrome/browser/ui/omnibox/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/omnibox/BUILD.gn
@@ -14,11 +14,11 @@
     "//base",
     "//components/toolbar",
     "//ios/chrome/browser/ssl",
+    "//ios/chrome/browser/ui/browser_list",
     "//ios/chrome/browser/ui/omnibox:omnibox_internal",
     "//ios/chrome/browser/ui/toolbar",
     "//ios/chrome/browser/web_state_list",
     "//ios/clean/chrome/browser",
-    "//ios/shared/chrome/browser/ui/browser_list",
     "//ios/shared/chrome/browser/ui/coordinators",
     "//ios/shared/chrome/browser/ui/omnibox",
     "//ios/web",
diff --git a/ios/clean/chrome/browser/ui/omnibox/location_bar_coordinator.mm b/ios/clean/chrome/browser/ui/omnibox/location_bar_coordinator.mm
index 2880d51..4e5ab50 100644
--- a/ios/clean/chrome/browser/ui/omnibox/location_bar_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/omnibox/location_bar_coordinator.mm
@@ -5,11 +5,11 @@
 #import "ios/clean/chrome/browser/ui/omnibox/location_bar_coordinator.h"
 
 #include "base/memory/ptr_util.h"
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 #import "ios/chrome/browser/ui/omnibox/location_bar_controller_impl.h"
 #include "ios/chrome/browser/ui/toolbar/toolbar_model_ios.h"
 #import "ios/clean/chrome/browser/ui/omnibox/location_bar_mediator.h"
 #import "ios/clean/chrome/browser/ui/omnibox/location_bar_view_controller.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/clean/chrome/browser/ui/recent_tabs/BUILD.gn b/ios/clean/chrome/browser/ui/recent_tabs/BUILD.gn
index 0ebc0e4..0fc25c9 100644
--- a/ios/clean/chrome/browser/ui/recent_tabs/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/recent_tabs/BUILD.gn
@@ -12,8 +12,8 @@
 
   deps = [
     "//ios/chrome/browser/ui",
+    "//ios/chrome/browser/ui/browser_list",
     "//ios/chrome/browser/ui/ntp/recent_tabs",
-    "//ios/shared/chrome/browser/ui/browser_list",
     "//ios/shared/chrome/browser/ui/coordinators",
   ]
 }
diff --git a/ios/clean/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm b/ios/clean/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm
index 12ca148..d7bd8ceb 100644
--- a/ios/clean/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm
@@ -4,10 +4,10 @@
 
 #import "ios/clean/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.h"
 
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 #import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_panel_controller.h"
 #import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_panel_view_controller.h"
 #include "ios/chrome/browser/ui/ui_util.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/clean/chrome/browser/ui/root/BUILD.gn b/ios/clean/chrome/browser/ui/root/BUILD.gn
index d499ecd..c9c6460 100644
--- a/ios/clean/chrome/browser/ui/root/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/root/BUILD.gn
@@ -9,10 +9,10 @@
   ]
   deps = [
     ":root_ui",
+    "//ios/chrome/browser/ui/browser_list",
     "//ios/clean/chrome/browser",
     "//ios/clean/chrome/browser/ui/commands",
     "//ios/clean/chrome/browser/ui/tab_grid",
-    "//ios/shared/chrome/browser/ui/browser_list",
     "//ios/shared/chrome/browser/ui/commands",
     "//ios/shared/chrome/browser/ui/coordinators",
   ]
diff --git a/ios/clean/chrome/browser/ui/root/root_coordinator.mm b/ios/clean/chrome/browser/ui/root/root_coordinator.mm
index 289e2700..12de61a 100644
--- a/ios/clean/chrome/browser/ui/root/root_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/root/root_coordinator.mm
@@ -8,9 +8,9 @@
 #error "This file requires ARC support."
 #endif
 
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 #import "ios/clean/chrome/browser/ui/root/root_container_view_controller.h"
 #import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/clean/chrome/browser/ui/settings/BUILD.gn b/ios/clean/chrome/browser/ui/settings/BUILD.gn
index fae4fa0..ddace90 100644
--- a/ios/clean/chrome/browser/ui/settings/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/settings/BUILD.gn
@@ -17,10 +17,10 @@
   deps = [
     "//base:base",
     "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/ui/browser_list",
     "//ios/chrome/browser/ui/settings",
     "//ios/clean/chrome/browser/ui/actions",
     "//ios/clean/chrome/browser/ui/commands",
-    "//ios/shared/chrome/browser/ui/browser_list",
     "//ios/shared/chrome/browser/ui/commands",
     "//ios/shared/chrome/browser/ui/coordinators",
   ]
@@ -37,8 +37,8 @@
   deps = [
     ":settings",
     "//ios/chrome/browser/browser_state:test_support",
+    "//ios/chrome/browser/ui/browser_list",
     "//ios/chrome/browser/ui/settings",
-    "//ios/shared/chrome/browser/ui/browser_list",
     "//ios/shared/chrome/browser/ui/coordinators:test_support",
     "//testing/gtest",
   ]
diff --git a/ios/clean/chrome/browser/ui/settings/settings_coordinator.mm b/ios/clean/chrome/browser/ui/settings/settings_coordinator.mm
index 8194051..26958214 100644
--- a/ios/clean/chrome/browser/ui/settings/settings_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/settings/settings_coordinator.mm
@@ -6,10 +6,10 @@
 
 #include "base/logging.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
 #import "ios/clean/chrome/browser/ui/commands/settings_commands.h"
 #import "ios/clean/chrome/browser/ui/settings/settings_main_page_coordinator.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
 #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
 
diff --git a/ios/clean/chrome/browser/ui/settings/settings_main_page_coordinator.mm b/ios/clean/chrome/browser/ui/settings/settings_main_page_coordinator.mm
index e89125d..f8cb709f 100644
--- a/ios/clean/chrome/browser/ui/settings/settings_main_page_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/settings/settings_main_page_coordinator.mm
@@ -6,9 +6,9 @@
 
 #include "base/logging.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h"
 #import "ios/clean/chrome/browser/ui/settings/material_cell_catalog_coordinator.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
 #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
 #import "ios/shared/chrome/browser/ui/settings/settings_main_page_commands.h"
diff --git a/ios/clean/chrome/browser/ui/tab/BUILD.gn b/ios/clean/chrome/browser/ui/tab/BUILD.gn
index 5bc2d72..d04dfb4 100644
--- a/ios/clean/chrome/browser/ui/tab/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/tab/BUILD.gn
@@ -16,6 +16,7 @@
     ":tab_ui",
     "//base",
     "//ios/chrome/browser",
+    "//ios/chrome/browser/ui/browser_list",
     "//ios/chrome/browser/web_state_list",
     "//ios/clean/chrome/browser/ui/actions",
     "//ios/clean/chrome/browser/ui/commands",
@@ -26,7 +27,6 @@
     "//ios/clean/chrome/browser/ui/transitions",
     "//ios/clean/chrome/browser/ui/web_contents",
     "//ios/shared/chrome/browser/ui/broadcaster",
-    "//ios/shared/chrome/browser/ui/browser_list",
     "//ios/shared/chrome/browser/ui/commands",
     "//ios/shared/chrome/browser/ui/coordinators",
     "//ios/web",
@@ -64,8 +64,8 @@
     ":tab",
     ":tab_ui",
     "//base",
+    "//ios/chrome/browser/ui/browser_list",
     "//ios/chrome/browser/ui/toolbar/test",
-    "//ios/shared/chrome/browser/ui/browser_list",
     "//ios/shared/chrome/browser/ui/coordinators",
     "//ios/shared/chrome/browser/ui/coordinators:test_support",
     "//ios/shared/chrome/browser/ui/tab:test_support",
diff --git a/ios/clean/chrome/browser/ui/tab/tab_coordinator.mm b/ios/clean/chrome/browser/ui/tab/tab_coordinator.mm
index a29ecb7b..01e9139c 100644
--- a/ios/clean/chrome/browser/ui/tab/tab_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/tab/tab_coordinator.mm
@@ -10,6 +10,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/scoped_observer.h"
 #include "ios/chrome/browser/chrome_url_constants.h"
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 #include "ios/chrome/browser/web_state_list/web_state_list.h"
 #include "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h"
 #import "ios/clean/chrome/browser/ui/commands/tab_commands.h"
@@ -23,7 +24,6 @@
 #import "ios/clean/chrome/browser/ui/transitions/zoom_transition_controller.h"
 #import "ios/clean/chrome/browser/ui/web_contents/web_coordinator.h"
 #import "ios/shared/chrome/browser/ui/broadcaster/chrome_broadcaster.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
 #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
 #import "ios/web/public/web_state/web_state.h"
diff --git a/ios/clean/chrome/browser/ui/tab/tab_coordinator_unittest.mm b/ios/clean/chrome/browser/ui/tab/tab_coordinator_unittest.mm
index 5ac4ca8a..5b4f1fe 100644
--- a/ios/clean/chrome/browser/ui/tab/tab_coordinator_unittest.mm
+++ b/ios/clean/chrome/browser/ui/tab/tab_coordinator_unittest.mm
@@ -7,9 +7,9 @@
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 #import "ios/chrome/browser/ui/toolbar/test/toolbar_test_web_state.h"
 #import "ios/clean/chrome/browser/ui/tab/tab_container_view_controller.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator_test.h"
 #import "ios/shared/chrome/browser/ui/tab/tab_test_util.h"
diff --git a/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn b/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn
index cb12b1a..9d2b93cf9 100644
--- a/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn
@@ -17,6 +17,7 @@
     "//base",
     "//ios/chrome/browser/browser_state",
     "//ios/chrome/browser/snapshots",
+    "//ios/chrome/browser/ui/browser_list",
     "//ios/chrome/browser/ui/tools_menu:configuration",
     "//ios/chrome/browser/web_state_list",
     "//ios/clean/chrome/browser",
@@ -27,7 +28,6 @@
     "//ios/clean/chrome/browser/ui/tab_collection",
     "//ios/clean/chrome/browser/ui/tab_collection:tab_collection_ui",
     "//ios/clean/chrome/browser/ui/tools",
-    "//ios/shared/chrome/browser/ui/browser_list",
     "//ios/shared/chrome/browser/ui/commands",
     "//ios/shared/chrome/browser/ui/coordinators",
     "//ios/web",
diff --git a/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm b/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
index fe0a209..cb9f9e77 100644
--- a/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
@@ -10,6 +10,7 @@
 #include "base/strings/sys_string_conversions.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #import "ios/chrome/browser/snapshots/snapshot_cache_factory.h"
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 #import "ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/chrome/browser/web_state_list/web_state_opener.h"
@@ -23,7 +24,6 @@
 #import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_mediator.h"
 #import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_view_controller.h"
 #import "ios/clean/chrome/browser/ui/tools/tools_coordinator.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
 #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
 #import "ios/web/public/navigation_manager.h"
diff --git a/ios/clean/chrome/browser/ui/tab_strip/BUILD.gn b/ios/clean/chrome/browser/ui/tab_strip/BUILD.gn
index e75f5f6..074ebaf 100644
--- a/ios/clean/chrome/browser/ui/tab_strip/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/tab_strip/BUILD.gn
@@ -10,10 +10,10 @@
   deps = [
     ":tab_strip_ui",
     "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/ui/browser_list",
     "//ios/chrome/browser/web_state_list",
     "//ios/clean/chrome/browser/ui/commands",
     "//ios/clean/chrome/browser/ui/tab_collection",
-    "//ios/shared/chrome/browser/ui/browser_list",
     "//ios/shared/chrome/browser/ui/commands",
     "//ios/shared/chrome/browser/ui/coordinators",
     "//ios/web",
diff --git a/ios/clean/chrome/browser/ui/tab_strip/tab_strip_coordinator.mm b/ios/clean/chrome/browser/ui/tab_strip/tab_strip_coordinator.mm
index 8478ce5..0f7eb69 100644
--- a/ios/clean/chrome/browser/ui/tab_strip/tab_strip_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/tab_strip/tab_strip_coordinator.mm
@@ -4,12 +4,12 @@
 
 #import "ios/clean/chrome/browser/ui/tab_strip/tab_strip_coordinator.h"
 
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/clean/chrome/browser/ui/commands/tab_grid_commands.h"
 #import "ios/clean/chrome/browser/ui/commands/tab_strip_commands.h"
 #import "ios/clean/chrome/browser/ui/tab_collection/tab_collection_mediator.h"
 #import "ios/clean/chrome/browser/ui/tab_strip/tab_strip_view_controller.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
 #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h"
 #include "ios/web/public/web_state/web_state.h"
 
diff --git a/ios/clean/chrome/browser/ui/toolbar/BUILD.gn b/ios/clean/chrome/browser/ui/toolbar/BUILD.gn
index 0184951..e517ef7 100644
--- a/ios/clean/chrome/browser/ui/toolbar/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/toolbar/BUILD.gn
@@ -16,13 +16,13 @@
     ":toolbar_ui",
     "//base",
     "//ios/chrome/browser",
+    "//ios/chrome/browser/ui/browser_list",
     "//ios/chrome/browser/ui/tools_menu:configuration",
     "//ios/chrome/browser/web_state_list",
     "//ios/clean/chrome/browser/ui/commands",
     "//ios/clean/chrome/browser/ui/omnibox",
     "//ios/clean/chrome/browser/ui/tools",
     "//ios/shared/chrome/browser/ui/broadcaster",
-    "//ios/shared/chrome/browser/ui/browser_list",
     "//ios/shared/chrome/browser/ui/commands",
     "//ios/shared/chrome/browser/ui/coordinators",
     "//ios/web",
diff --git a/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.mm b/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.mm
index e48a074..50079c6 100644
--- a/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.mm
@@ -5,6 +5,7 @@
 #import "ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.h"
 
 #include "ios/chrome/browser/chrome_url_constants.h"
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 #import "ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h"
 #import "ios/clean/chrome/browser/ui/commands/tools_menu_commands.h"
 #import "ios/clean/chrome/browser/ui/omnibox/location_bar_coordinator.h"
@@ -12,7 +13,6 @@
 #import "ios/clean/chrome/browser/ui/toolbar/toolbar_view_controller.h"
 #import "ios/clean/chrome/browser/ui/tools/tools_coordinator.h"
 #import "ios/shared/chrome/browser/ui/broadcaster/chrome_broadcaster.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
 #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
 #import "ios/web/public/web_state/web_state.h"
diff --git a/ios/clean/chrome/browser/ui/tools/BUILD.gn b/ios/clean/chrome/browser/ui/tools/BUILD.gn
index c9ddf772..d9c569bf 100644
--- a/ios/clean/chrome/browser/ui/tools/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/tools/BUILD.gn
@@ -16,10 +16,10 @@
   deps = [
     ":tools_ui",
     "//base",
+    "//ios/chrome/browser/ui/browser_list",
     "//ios/chrome/browser/ui/tools_menu:configuration",
     "//ios/clean/chrome/browser/ui/commands",
     "//ios/clean/chrome/browser/ui/transitions",
-    "//ios/shared/chrome/browser/ui/browser_list",
     "//ios/shared/chrome/browser/ui/coordinators",
     "//ios/web",
     "//ui/base",
diff --git a/ios/clean/chrome/browser/ui/tools/tools_coordinator.mm b/ios/clean/chrome/browser/ui/tools/tools_coordinator.mm
index 0251ceba..7610df3 100644
--- a/ios/clean/chrome/browser/ui/tools/tools_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/tools/tools_coordinator.mm
@@ -4,10 +4,10 @@
 
 #import "ios/clean/chrome/browser/ui/tools/tools_coordinator.h"
 
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 #import "ios/clean/chrome/browser/ui/tools/menu_view_controller.h"
 #import "ios/clean/chrome/browser/ui/tools/tools_mediator.h"
 #import "ios/clean/chrome/browser/ui/transitions/zooming_menu_transition_controller.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/clean/chrome/browser/ui/web_contents/BUILD.gn b/ios/clean/chrome/browser/ui/web_contents/BUILD.gn
index 7cc6f98..36ae90d 100644
--- a/ios/clean/chrome/browser/ui/web_contents/BUILD.gn
+++ b/ios/clean/chrome/browser/ui/web_contents/BUILD.gn
@@ -15,9 +15,9 @@
   deps = [
     ":web_contents_ui",
     "//ios/chrome/browser",
+    "//ios/chrome/browser/ui/browser_list",
     "//ios/clean/chrome/browser/ui/commands",
     "//ios/clean/chrome/browser/ui/context_menu",
-    "//ios/shared/chrome/browser/ui/browser_list",
     "//ios/shared/chrome/browser/ui/commands",
     "//ios/shared/chrome/browser/ui/coordinators",
     "//ios/web",
@@ -40,6 +40,7 @@
   testonly = true
   sources = [
     "web_contents_mediator_unittest.mm",
+    "web_coordinator_unittest.mm",
   ]
 
   configs += [ "//build/config/compiler:enable_arc" ]
@@ -50,6 +51,7 @@
     "//base",
     "//base/test:test_support",
     "//ios/chrome/test/base",
+    "//ios/shared/chrome/browser/ui/coordinators",
     "//ios/shared/chrome/browser/ui/tab:test_support",
     "//ios/web/public/test/fakes",
     "//testing/gtest",
diff --git a/ios/clean/chrome/browser/ui/web_contents/web_coordinator.mm b/ios/clean/chrome/browser/ui/web_contents/web_coordinator.mm
index db3ac94a..a7ea49c 100644
--- a/ios/clean/chrome/browser/ui/web_contents/web_coordinator.mm
+++ b/ios/clean/chrome/browser/ui/web_contents/web_coordinator.mm
@@ -6,12 +6,12 @@
 
 #include "base/mac/foundation_util.h"
 #include "base/memory/ptr_util.h"
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 #import "ios/clean/chrome/browser/ui/commands/context_menu_commands.h"
 #import "ios/clean/chrome/browser/ui/context_menu/context_menu_context_impl.h"
 #import "ios/clean/chrome/browser/ui/context_menu/web_context_menu_coordinator.h"
 #import "ios/clean/chrome/browser/ui/web_contents/web_contents_mediator.h"
 #import "ios/clean/chrome/browser/ui/web_contents/web_contents_view_controller.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
 #import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
 #include "ios/web/public/navigation_manager.h"
diff --git a/ios/clean/chrome/browser/ui/web_contents/web_coordinator_unittest.mm b/ios/clean/chrome/browser/ui/web_contents/web_coordinator_unittest.mm
new file mode 100644
index 0000000..2abeebc
--- /dev/null
+++ b/ios/clean/chrome/browser/ui/web_contents/web_coordinator_unittest.mm
@@ -0,0 +1,63 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/clean/chrome/browser/ui/web_contents/web_coordinator.h"
+
+#include "base/memory/ptr_util.h"
+#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
+#import "ios/shared/chrome/browser/ui/tab/tab_test_util.h"
+#import "ios/web/public/test/fakes/test_web_state.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/gtest_mac.h"
+#include "testing/platform_test.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+
+class WebCoordinatorTest : public PlatformTest {
+ public:
+  WebCoordinatorTest() {
+    auto navigation_manager = base::MakeUnique<TabNavigationManager>();
+    navigation_manager->SetItemCount(0);
+    test_web_state_.SetView([[UIView alloc] init]);
+    test_web_state_.SetNavigationManager(std::move(navigation_manager));
+
+    coordinator_ = [[WebCoordinator alloc] init];
+  }
+
+ protected:
+  WebCoordinator* coordinator_;
+  web::TestWebState test_web_state_;
+};
+
+// Tests that starting without the webstate still creates a view controller.
+TEST_F(WebCoordinatorTest, TestStartWithoutWebState) {
+  EXPECT_EQ(coordinator_.viewController, nil);
+  [coordinator_ start];
+  EXPECT_NE(coordinator_.viewController, nil);
+}
+
+// Tests that starting with the webstate puts the webstate's view in the VC.
+TEST_F(WebCoordinatorTest, TestStartWithWebState) {
+  coordinator_.webState = &test_web_state_;
+  [coordinator_ start];
+  EXPECT_TRUE([test_web_state_.GetView()
+      isDescendantOfView:coordinator_.viewController.view]);
+}
+
+// Tests that starting and then setting the webstate puts the webstate's view in
+// the VC.
+TEST_F(WebCoordinatorTest, TestStartThenSetWebState) {
+  [coordinator_ start];
+  EXPECT_FALSE([test_web_state_.GetView()
+      isDescendantOfView:coordinator_.viewController.view]);
+  coordinator_.webState = &test_web_state_;
+  EXPECT_TRUE([test_web_state_.GetView()
+      isDescendantOfView:coordinator_.viewController.view]);
+}
+
+}  // namespace
diff --git a/ios/net/OWNERS b/ios/net/OWNERS
index 13444820..706c5f3 100644
--- a/ios/net/OWNERS
+++ b/ios/net/OWNERS
@@ -1,3 +1,6 @@
 droger@chromium.org
 ellyjones@chromium.org
 marq@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/public/consumer/OWNERS b/ios/public/consumer/OWNERS
index ae82009..ba9c65db 100644
--- a/ios/public/consumer/OWNERS
+++ b/ios/public/consumer/OWNERS
@@ -1,2 +1,5 @@
 rohitrao@chromium.org
 sdefresne@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/public/provider/OWNERS b/ios/public/provider/OWNERS
index ae82009..ba9c65db 100644
--- a/ios/public/provider/OWNERS
+++ b/ios/public/provider/OWNERS
@@ -1,2 +1,5 @@
 rohitrao@chromium.org
 sdefresne@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/public/provider/chrome/browser/signin/OWNERS b/ios/public/provider/chrome/browser/signin/OWNERS
index d45210b..6068057 100644
--- a/ios/public/provider/chrome/browser/signin/OWNERS
+++ b/ios/public/provider/chrome/browser/signin/OWNERS
@@ -2,3 +2,6 @@
 msarda@chromium.org
 
 # COMPONENT: Services>SignIn
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/shared/OWNERS b/ios/shared/OWNERS
index b8d3d41f..290f78a 100644
--- a/ios/shared/OWNERS
+++ b/ios/shared/OWNERS
@@ -1,3 +1,6 @@
 lpromero@chromium.org
 marq@chromium.org
 sdefresne@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/shared/chrome/browser/ui/DEPS b/ios/shared/chrome/browser/ui/DEPS
index eb4f1fa..661df6b 100644
--- a/ios/shared/chrome/browser/ui/DEPS
+++ b/ios/shared/chrome/browser/ui/DEPS
@@ -1,7 +1,6 @@
 include_rules = [
-  # Allow ios/chrome/browser but not ios/chrome/browser/ui.
+  # Allow ios/chrome/browser.
   "+ios/chrome/browser",
-  "-ios/chrome/browser/ui",
 
   "+components/omnibox/browser",
 ]
diff --git a/ios/shared/chrome/browser/ui/coordinators/BUILD.gn b/ios/shared/chrome/browser/ui/coordinators/BUILD.gn
index 01805bb..ad36878 100644
--- a/ios/shared/chrome/browser/ui/coordinators/BUILD.gn
+++ b/ios/shared/chrome/browser/ui/coordinators/BUILD.gn
@@ -17,7 +17,7 @@
     "//ios/chrome/browser",
     "//ios/chrome/browser/browser_state",
     "//ios/chrome/browser/tabs:tabs_internal",
-    "//ios/shared/chrome/browser/ui/browser_list",
+    "//ios/chrome/browser/ui/browser_list",
   ]
 }
 
@@ -34,7 +34,7 @@
     ":coordinators",
     "//base",
     "//ios/chrome/browser/browser_state:test_support",
-    "//ios/shared/chrome/browser/ui/browser_list",
+    "//ios/chrome/browser/ui/browser_list",
     "//testing/gtest",
   ]
 }
diff --git a/ios/shared/chrome/browser/ui/coordinators/browser_coordinator_test.mm b/ios/shared/chrome/browser/ui/coordinators/browser_coordinator_test.mm
index 5f4cb62a..4d54d95 100644
--- a/ios/shared/chrome/browser/ui/coordinators/browser_coordinator_test.mm
+++ b/ios/shared/chrome/browser/ui/coordinators/browser_coordinator_test.mm
@@ -6,7 +6,7 @@
 
 #include "base/memory/ptr_util.h"
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
-#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
+#import "ios/chrome/browser/ui/browser_list/browser.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/shared/chrome/browser/ui/dialogs/OWNERS b/ios/shared/chrome/browser/ui/dialogs/OWNERS
index 48efb49e..bd85dcf2 100644
--- a/ios/shared/chrome/browser/ui/dialogs/OWNERS
+++ b/ios/shared/chrome/browser/ui/dialogs/OWNERS
@@ -1 +1,4 @@
 kkhorimoto@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/shared/chrome/browser/ui/settings/BUILD.gn b/ios/shared/chrome/browser/ui/settings/BUILD.gn
index ac535bc..4d5db7a 100644
--- a/ios/shared/chrome/browser/ui/settings/BUILD.gn
+++ b/ios/shared/chrome/browser/ui/settings/BUILD.gn
@@ -8,13 +8,4 @@
   ]
 
   configs += [ "//build/config/compiler:enable_arc" ]
-
-  deps = [
-    # "//base",
-    # "//ios/chrome/app:tests_fake_hook",
-    # "//ios/chrome/browser",
-    # "//ios/chrome/browser/browser_state",
-    # "//ios/chrome/browser/tabs:tabs_internal",
-    # "//ios/shared/chrome/browser/ui/browser_list",
-  ]
 }
diff --git a/ios/showcase/OWNERS b/ios/showcase/OWNERS
index 411d967..aa8e8548 100644
--- a/ios/showcase/OWNERS
+++ b/ios/showcase/OWNERS
@@ -1,2 +1,5 @@
 edchin@chromium.org
 lpromero@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/showcase/content_suggestions/OWNERS b/ios/showcase/content_suggestions/OWNERS
index 2d35f0a5..f192143 100644
--- a/ios/showcase/content_suggestions/OWNERS
+++ b/ios/showcase/content_suggestions/OWNERS
@@ -1 +1,4 @@
 gambard@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/testing/earl_grey/OWNERS b/ios/testing/earl_grey/OWNERS
index 1df316e..6f764fe 100644
--- a/ios/testing/earl_grey/OWNERS
+++ b/ios/testing/earl_grey/OWNERS
@@ -1 +1,4 @@
 baxley@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/third_party/blink/OWNERS b/ios/third_party/blink/OWNERS
index 40a68c7..b127701 100644
--- a/ios/third_party/blink/OWNERS
+++ b/ios/third_party/blink/OWNERS
@@ -1 +1,4 @@
 rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/third_party/earl_grey/OWNERS b/ios/third_party/earl_grey/OWNERS
index 3bb1f30..f1cc9a03 100644
--- a/ios/third_party/earl_grey/OWNERS
+++ b/ios/third_party/earl_grey/OWNERS
@@ -1,3 +1,6 @@
 baxley@chromium.org
 justincohen@chromium.org
 rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/third_party/fishhook/OWNERS b/ios/third_party/fishhook/OWNERS
index 3bb1f30..f1cc9a03 100644
--- a/ios/third_party/fishhook/OWNERS
+++ b/ios/third_party/fishhook/OWNERS
@@ -1,3 +1,6 @@
 baxley@chromium.org
 justincohen@chromium.org
 rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/third_party/material_components_ios/OWNERS b/ios/third_party/material_components_ios/OWNERS
index 2b842fe..1e909408 100644
--- a/ios/third_party/material_components_ios/OWNERS
+++ b/ios/third_party/material_components_ios/OWNERS
@@ -4,3 +4,6 @@
 # These are for the common case of adding or renaming files. If you're doing
 # structural changes, please get a review from an OWNER.
 per-file BUILD.gn=*
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/third_party/material_components_ios/README.chromium b/ios/third_party/material_components_ios/README.chromium
index 5c68a80..69d4294 100644
--- a/ios/third_party/material_components_ios/README.chromium
+++ b/ios/third_party/material_components_ios/README.chromium
@@ -1,7 +1,7 @@
 Name: Material Components for iOS
 URL: https://github.com/material-components/material-components-ios
 Version: 0
-Revision: c2a357fb67321e9660190c55b49836c51fe04821
+Revision: a0466df249c593ba65007440d7a84e4665ac2631
 License: Apache 2.0
 License File: LICENSE
 Security Critical: yes
diff --git a/ios/third_party/material_font_disk_loader_ios/OWNERS b/ios/third_party/material_font_disk_loader_ios/OWNERS
index 077a06e..c984591 100644
--- a/ios/third_party/material_font_disk_loader_ios/OWNERS
+++ b/ios/third_party/material_font_disk_loader_ios/OWNERS
@@ -1,2 +1,5 @@
 lpromero@chromium.org
 rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/third_party/material_roboto_font_loader_ios/OWNERS b/ios/third_party/material_roboto_font_loader_ios/OWNERS
index 077a06e..c984591 100644
--- a/ios/third_party/material_roboto_font_loader_ios/OWNERS
+++ b/ios/third_party/material_roboto_font_loader_ios/OWNERS
@@ -1,2 +1,5 @@
 lpromero@chromium.org
 rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/third_party/material_sprited_animation_view_ios/OWNERS b/ios/third_party/material_sprited_animation_view_ios/OWNERS
index 077a06e..c984591 100644
--- a/ios/third_party/material_sprited_animation_view_ios/OWNERS
+++ b/ios/third_party/material_sprited_animation_view_ios/OWNERS
@@ -1,2 +1,5 @@
 lpromero@chromium.org
 rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/third_party/material_text_accessibility_ios/OWNERS b/ios/third_party/material_text_accessibility_ios/OWNERS
index 077a06e..c984591 100644
--- a/ios/third_party/material_text_accessibility_ios/OWNERS
+++ b/ios/third_party/material_text_accessibility_ios/OWNERS
@@ -1,2 +1,5 @@
 lpromero@chromium.org
 rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/third_party/ochamcrest/OWNERS b/ios/third_party/ochamcrest/OWNERS
index 3bb1f30..f1cc9a03 100644
--- a/ios/third_party/ochamcrest/OWNERS
+++ b/ios/third_party/ochamcrest/OWNERS
@@ -1,3 +1,6 @@
 baxley@chromium.org
 justincohen@chromium.org
 rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/web/OWNERS b/ios/web/OWNERS
index 2710e7a..a7206ed 100644
--- a/ios/web/OWNERS
+++ b/ios/web/OWNERS
@@ -1,3 +1,6 @@
 eugenebut@chromium.org
 kkhorimoto@chromium.org
 marq@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/web/payments/OWNERS b/ios/web/payments/OWNERS
index f189e142..6e417fc 100644
--- a/ios/web/payments/OWNERS
+++ b/ios/web/payments/OWNERS
@@ -1,2 +1,5 @@
 mahmadi@chromium.org
 lpromero@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/web/payments/payment_request.cc b/ios/web/payments/payment_request.cc
index c535f9d7..63ff82d 100644
--- a/ios/web/payments/payment_request.cc
+++ b/ios/web/payments/payment_request.cc
@@ -59,6 +59,9 @@
 
 namespace web {
 
+const char kPaymentRequestIDExternal[] = "payment-request-id";
+const char kPaymentRequestDataExternal[] = "payment-request-data";
+
 PaymentCurrencyAmount::PaymentCurrencyAmount()
     // By default, the currency is defined by [ISO4217]. For example, USD for
     // US Dollars.
diff --git a/ios/web/public/OWNERS b/ios/web/public/OWNERS
index 08850f4..75983fd 100644
--- a/ios/web/public/OWNERS
+++ b/ios/web/public/OWNERS
@@ -1,2 +1,5 @@
 per-file *.mojom=set noparent
 per-file *.mojom=file://ipc/SECURITY_OWNERS
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/web/public/app/mojo/OWNERS b/ios/web/public/app/mojo/OWNERS
index 1c9493c3..77df058 100644
--- a/ios/web/public/app/mojo/OWNERS
+++ b/ios/web/public/app/mojo/OWNERS
@@ -1,2 +1,5 @@
 per-file *.json=set noparent
 per-file *.json=file://ipc/SECURITY_OWNERS
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/web/public/payments/OWNERS b/ios/web/public/payments/OWNERS
index f189e142..6e417fc 100644
--- a/ios/web/public/payments/OWNERS
+++ b/ios/web/public/payments/OWNERS
@@ -1,2 +1,5 @@
 mahmadi@chromium.org
 lpromero@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/web/public/payments/payment_request.h b/ios/web/public/payments/payment_request.h
index 62c3ab6..a5353b1c 100644
--- a/ios/web/public/payments/payment_request.h
+++ b/ios/web/public/payments/payment_request.h
@@ -25,6 +25,11 @@
 
 namespace web {
 
+// These constants are for Univesral Link query parameters when receiving
+// payment response data from an external application.
+extern const char kPaymentRequestIDExternal[];
+extern const char kPaymentRequestDataExternal[];
+
 // Supplies monetary amounts.
 class PaymentCurrencyAmount {
  public:
diff --git a/ios/web/public/test/OWNERS b/ios/web/public/test/OWNERS
index c3cd7d2..a4af3ca 100644
--- a/ios/web/public/test/OWNERS
+++ b/ios/web/public/test/OWNERS
@@ -1,2 +1,5 @@
 baxley@chromium.org
 eugenebut@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/web/public/user_agent.mm b/ios/web/public/user_agent.mm
index 10b16fb..ac2a4dd 100644
--- a/ios/web/public/user_agent.mm
+++ b/ios/web/public/user_agent.mm
@@ -45,6 +45,7 @@
   // Safari version can't be, so a lookup table is used instead (for both, since
   // the reported versions should stay in sync).
   static const OSVersionMap version_map[] = {
+      {11, 0, {"604.1", "604.1.34"}},
       {10, 3, {"602.1", "603.1.30"}},
       {10, 0, {"602.1", "602.1.50"}},
       {9, 0, {"601.1.46", "601.1"}},
diff --git a/ios/web/public/webui/OWNERS b/ios/web/public/webui/OWNERS
index a01ab6c..f75309d 100644
--- a/ios/web/public/webui/OWNERS
+++ b/ios/web/public/webui/OWNERS
@@ -1,2 +1,5 @@
 eugenebut@chromium.org
 michaeldo@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/web/shell/OWNERS b/ios/web/shell/OWNERS
index d0f3b7e..fd32f2c 100644
--- a/ios/web/shell/OWNERS
+++ b/ios/web/shell/OWNERS
@@ -3,3 +3,6 @@
 
 per-file *.mojom=set noparent
 per-file *.mojom=file://ipc/SECURITY_OWNERS
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/web/shell/test/OWNERS b/ios/web/shell/test/OWNERS
index 1df316e..6f764fe 100644
--- a/ios/web/shell/test/OWNERS
+++ b/ios/web/shell/test/OWNERS
@@ -1 +1,4 @@
 baxley@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ios/web/web_state/ui/crw_web_controller.h b/ios/web/web_state/ui/crw_web_controller.h
index 2493e20..8619a60 100644
--- a/ios/web/web_state/ui/crw_web_controller.h
+++ b/ios/web/web_state/ui/crw_web_controller.h
@@ -196,12 +196,6 @@
 // only checks on creation, such that the whole object needs to be rebuilt.
 - (void)requirePageReconstruction;
 
-// Requires that the next display reload the page, using a placeholder while
-// loading. This could be used, e.g., to handle a crash in a WebController that
-// is not currently visible.
-// TODO(stuartmorgan): When revisiting the methods above, revisit this as well.
-- (void)requirePageReload;
-
 // Show overlay, don't reload web page. Used when the view will be
 // visible only briefly (e.g., tablet side swipe).
 - (void)setOverlayPreviewMode:(BOOL)overlayPreviewMode;
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index e9617da..19335f89 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -320,9 +320,6 @@
   base::scoped_nsobject<NSMutableArray> _webViewToolbars;
   // Flag to say if browsing is enabled.
   BOOL _webUsageEnabled;
-  // The next time the view is requested, reload the page (using the placeholder
-  // overlay until it's loaded).
-  BOOL _requireReloadOnDisplay;
   // Overlay view used instead of webView.
   base::scoped_nsobject<UIImageView> _placeholderOverlayView;
   // The touch tracking recognizer allowing us to decide if a navigation is
@@ -1111,10 +1108,6 @@
   [self removeWebView];
 }
 
-- (void)requirePageReload {
-  _requireReloadOnDisplay = YES;
-}
-
 - (void)resetContainerView {
   [_containerView removeFromSuperview];
   _containerView.reset();
@@ -1967,10 +1960,6 @@
     // then transition away.
     if (_overlayPreviewMode && !isChromeScheme)
       [self addPlaceholderOverlay];
-  } else if (_requireReloadOnDisplay && _webView) {
-    _requireReloadOnDisplay = NO;
-    [self addPlaceholderOverlay];
-    [self loadCurrentURL];
   }
 }
 
diff --git a/ios/web/webui/web_ui_mojo_inttest.mm b/ios/web/webui/web_ui_mojo_inttest.mm
index d90e2333..0c4dc8f 100644
--- a/ios/web/webui/web_ui_mojo_inttest.mm
+++ b/ios/web/webui/web_ui_mojo_inttest.mm
@@ -174,13 +174,7 @@
 // Tests that JS can send messages to the native code and vice versa.
 // TestUIHandler is used for communication and test succeeds only when
 // |TestUIHandler| successfully receives "ack" message from WebUI page.
-#if TARGET_IPHONE_SIMULATOR
-#define MAYBE_MessageExchange MessageExchange
-#else
-#define MAYBE_MessageExchange FLAKY_MessageExchange
-#endif
-// TODO(crbug.com/720098): Enable this test on device.
-TEST_F(WebUIMojoTest, MAYBE_MessageExchange) {
+TEST_F(WebUIMojoTest, MessageExchange) {
   @autoreleasepool {
     web_state()->SetWebUsageEnabled(true);
     web_state()->GetView();  // WebState won't load URL without view.
diff --git a/ios/web_view/OWNERS b/ios/web_view/OWNERS
index d0087512..c3456e9 100644
--- a/ios/web_view/OWNERS
+++ b/ios/web_view/OWNERS
@@ -7,4 +7,6 @@
 # structural changes, please get a review from an OWNER.
 per-file BUILD.gn=*
 
-# COMPONENT: Mobile>iOSWebView
\ No newline at end of file
+# COMPONENT: Mobile>iOSWebView
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
diff --git a/ipc/ipc_mojo_bootstrap.cc b/ipc/ipc_mojo_bootstrap.cc
index afd0e3c..4ea67bbd 100644
--- a/ipc/ipc_mojo_bootstrap.cc
+++ b/ipc/ipc_mojo_bootstrap.cc
@@ -172,6 +172,15 @@
     if (!mojo::IsValidInterfaceId(id))
       return mojo::ScopedInterfaceEndpointHandle();
 
+    // Unless it is the master ID, |id| is from the remote side and therefore
+    // its namespace bit is supposed to be different than the value that this
+    // router would use.
+    if (!mojo::IsMasterInterfaceId(id) &&
+        set_interface_id_namespace_bit_ ==
+            mojo::HasInterfaceIdNamespaceBitSet(id)) {
+      return mojo::ScopedInterfaceEndpointHandle();
+    }
+
     base::AutoLock locker(lock_);
     bool inserted = false;
     Endpoint* endpoint = FindOrInsertEndpoint(id, &inserted);
diff --git a/media/base/pipeline.h b/media/base/pipeline.h
index 1423afae..b39ae20 100644
--- a/media/base/pipeline.h
+++ b/media/base/pipeline.h
@@ -34,6 +34,7 @@
     // Executed whenever an error occurs except when the error occurs during
     // Start/Seek/Resume or Suspend. Those errors are reported via |seek_cb|
     // and |suspend_cb| respectively.
+    // NOTE: The client is responsible for calling Pipeline::Stop().
     virtual void OnError(PipelineStatus status) = 0;
 
     // Executed whenever the media reaches the end.
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc
index ecf1574..2028019 100644
--- a/media/base/pipeline_impl.cc
+++ b/media/base/pipeline_impl.cc
@@ -222,8 +222,8 @@
     std::unique_ptr<TextRenderer> text_renderer,
     base::WeakPtr<PipelineImpl> weak_pipeline) {
   DCHECK(media_task_runner_->BelongsToCurrentThread());
-  DCHECK_EQ(kCreated, state_) << "Received start in unexpected state: "
-                              << state_;
+  DCHECK(state_ == kCreated || state_ == kStopped)
+      << "Received start in unexpected state: " << state_;
 
   SetState(kStarting);
 
@@ -232,7 +232,6 @@
   DCHECK(!text_renderer_);
   DCHECK(!renderer_ended_);
   DCHECK(!text_renderer_ended_);
-  DCHECK(!weak_pipeline_);
   demuxer_ = demuxer;
   {
     base::AutoLock auto_lock(shared_state_lock_);
@@ -1275,18 +1274,16 @@
   // Else report error via the client interface.
   if (!seek_cb_.is_null()) {
     base::ResetAndReturn(&seek_cb_).Run(error);
-  } else if (!suspend_cb_.is_null()) {
-    base::ResetAndReturn(&suspend_cb_).Run(error);
-  } else {
-    DCHECK(client_);
-    client_->OnError(error);
+    return;
   }
 
-  // Any kind of error stops the pipeline.
-  //
-  // TODO (tguilbert): Move this out to PipelineController to make the state
-  // changes more consistent. See crbug.com/695734.
-  Stop();
+  if (!suspend_cb_.is_null()) {
+    base::ResetAndReturn(&suspend_cb_).Run(error);
+    return;
+  }
+
+  DCHECK(client_);
+  client_->OnError(error);
 }
 
 void PipelineImpl::OnEnded() {
diff --git a/media/base/pipeline_impl.h b/media/base/pipeline_impl.h
index e5c9de3..73ee91f 100644
--- a/media/base/pipeline_impl.h
+++ b/media/base/pipeline_impl.h
@@ -29,7 +29,7 @@
 // Here's a state diagram that describes the lifetime of this object.
 //
 //   [ *Created ]                       [ Any State ]
-//         | Start()                         | Stop() / SetError()
+//         | Start()                         | Stop()
 //         V                                 V
 //   [ Starting ]                       [ Stopping ]
 //         |                                 |
@@ -55,9 +55,9 @@
 // a chance to preroll. From then on the normal Seek() transitions are carried
 // out and we start playing the media.
 //
-// If any error ever happens, this object will transition to the "Error" state
-// from any state. If Stop() is ever called, this object will transition to
-// "Stopped" state.
+// If Stop() is ever called, this object will transition to "Stopped" state.
+// Pipeline::Stop() is never called from withing PipelineImpl. It's |client_|'s
+// responsibility to call stop when appropriate.
 //
 // TODO(sandersd): It should be possible to pass through Suspended when going
 // from InitDemuxer to InitRenderer, thereby eliminating the Resuming state.
diff --git a/media/base/pipeline_impl_unittest.cc b/media/base/pipeline_impl_unittest.cc
index 8e81bd2d..9db941b9 100644
--- a/media/base/pipeline_impl_unittest.cc
+++ b/media/base/pipeline_impl_unittest.cc
@@ -37,8 +37,6 @@
 using ::testing::CreateFunctor;
 using ::testing::DeleteArg;
 using ::testing::DoAll;
-// TODO(scherkus): Remove InSequence after refactoring Pipeline.
-using ::testing::InSequence;
 using ::testing::Invoke;
 using ::testing::InvokeWithoutArgs;
 using ::testing::Mock;
@@ -424,7 +422,6 @@
 TEST_F(PipelineImplTest, NoStreams) {
   EXPECT_CALL(*demuxer_, Initialize(_, _, _))
       .WillOnce(PostCallback<1>(PIPELINE_OK));
-  EXPECT_CALL(*demuxer_, Stop());
   EXPECT_CALL(callbacks_, OnMetadata(_));
 
   StartPipelineAndExpect(PIPELINE_ERROR_COULD_NOT_RENDER);
@@ -536,8 +533,9 @@
   // Initialize then seek!
   StartPipelineAndExpect(PIPELINE_OK);
 
+  // Pipeline::Client is supposed to call Pipeline::Stop() after errors.
+  EXPECT_CALL(callbacks_, OnError(_)).WillOnce(Stop(pipeline_.get()));
   EXPECT_CALL(*demuxer_, Stop());
-  EXPECT_CALL(callbacks_, OnError(_));
   OnDemuxerError();
   base::RunLoop().RunUntilIdle();
 
@@ -701,7 +699,8 @@
 
   pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek,
                                         base::Unretained(&callbacks_)));
-  EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
+  EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ))
+      .WillOnce(Stop(pipeline_.get()));
   base::RunLoop().RunUntilIdle();
 }
 
@@ -754,7 +753,8 @@
 
   pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek,
                                         base::Unretained(&callbacks_)));
-  EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
+  EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ))
+      .WillOnce(Stop(pipeline_.get()));
   base::RunLoop().RunUntilIdle();
 }
 
@@ -934,7 +934,8 @@
       } else {
         EXPECT_CALL(*demuxer_, Initialize(_, _, _))
             .WillOnce(PostCallback<1>(DEMUXER_ERROR_COULD_NOT_OPEN));
-        EXPECT_CALL(callbacks_, OnStart(DEMUXER_ERROR_COULD_NOT_OPEN));
+        EXPECT_CALL(callbacks_, OnStart(DEMUXER_ERROR_COULD_NOT_OPEN))
+            .WillOnce(Stop(pipeline_.get()));
       }
 
       EXPECT_CALL(*demuxer_, Stop());
@@ -957,7 +958,8 @@
       } else {
         EXPECT_CALL(*renderer_, Initialize(_, _, _))
             .WillOnce(PostCallback<2>(PIPELINE_ERROR_INITIALIZATION_FAILED));
-        EXPECT_CALL(callbacks_, OnStart(PIPELINE_ERROR_INITIALIZATION_FAILED));
+        EXPECT_CALL(callbacks_, OnStart(PIPELINE_ERROR_INITIALIZATION_FAILED))
+            .WillOnce(Stop(pipeline_.get()));
       }
 
       EXPECT_CALL(callbacks_, OnMetadata(_));
@@ -1008,7 +1010,8 @@
                 SetError(&renderer_client_, PIPELINE_ERROR_READ),
                 RunClosure<0>()));
         EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING));
-        EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
+        EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ))
+            .WillOnce(Stop(pipeline_.get()));
       }
       return;
     }
@@ -1028,7 +1031,8 @@
       } else {
         EXPECT_CALL(*demuxer_, Seek(_, _))
             .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ));
-        EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
+        EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ))
+            .WillOnce(Stop(pipeline_.get()));
       }
       return;
     }
@@ -1068,7 +1072,8 @@
       } else {
         EXPECT_CALL(*demuxer_, Seek(_, _))
             .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ));
-        EXPECT_CALL(callbacks_, OnResume(PIPELINE_ERROR_READ));
+        EXPECT_CALL(callbacks_, OnResume(PIPELINE_ERROR_READ))
+            .WillOnce(Stop(pipeline_.get()));
       }
     } else if (state != kSuspended && state != kSuspending) {
       NOTREACHED() << "State not supported: " << state;
@@ -1085,7 +1090,8 @@
       case kError:
         if (expect_errors) {
           EXPECT_CALL(*demuxer_, Stop());
-          EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ));
+          EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ))
+              .WillOnce(Stop(pipeline_.get()));
         }
         renderer_client_->OnError(PIPELINE_ERROR_READ);
         break;
diff --git a/media/blink/buffered_data_source_host_impl.cc b/media/blink/buffered_data_source_host_impl.cc
index 8569558..1b4f872 100644
--- a/media/blink/buffered_data_source_host_impl.cc
+++ b/media/blink/buffered_data_source_host_impl.cc
@@ -57,9 +57,12 @@
 void BufferedDataSourceHostImpl::AddBufferedByteRange(int64_t start,
                                                       int64_t end) {
   int64_t new_bytes = UnloadedBytesInInterval(Interval<int64_t>(start, end));
-  if (new_bytes > 0)
-    did_loading_progress_ = true;
+  if (new_bytes == 0) {
+    // No change
+    return;
+  }
   buffered_byte_ranges_.SetInterval(start, end, 1);
+  did_loading_progress_ = true;
 
   base::TimeTicks now = tick_clock_->NowTicks();
   int64_t bytes_so_far = 0;
diff --git a/media/blink/multibuffer_data_source.cc b/media/blink/multibuffer_data_source.cc
index 3f29a1c..d793c69 100644
--- a/media/blink/multibuffer_data_source.cc
+++ b/media/blink/multibuffer_data_source.cc
@@ -116,7 +116,7 @@
       stop_signal_received_(false),
       media_has_played_(false),
       single_origin_(true),
-      cancel_on_defer_(true),
+      cancel_on_defer_(false),
       preload_(AUTO),
       bitrate_(0),
       playback_rate_(0.0),
@@ -414,7 +414,6 @@
 }
 
 void MultibufferDataSource::StopInternal_Locked() {
-  DVLOG(1) << __func__;
   lock_.AssertAcquired();
   if (stop_signal_received_)
     return;
@@ -444,7 +443,6 @@
 /////////////////////////////////////////////////////////////////////////////
 // BufferedResourceLoader callback methods.
 void MultibufferDataSource::StartCallback() {
-  DVLOG(1) << __func__;
   DCHECK(render_task_runner_->BelongsToCurrentThread());
 
   if (init_cb_.is_null()) {
@@ -495,8 +493,6 @@
     media_log_->SetBooleanProperty("range_header_supported",
                                    url_data_->range_supported());
   }
-  if (!url_data_->range_supported())
-    cancel_on_defer_ = false;
 
   render_task_runner_->PostTask(
       FROM_HERE, base::Bind(base::ResetAndReturn(&init_cb_), success));
@@ -540,8 +536,7 @@
     bool loading = is_loading || force_loading;
 
     if (!loading && cancel_on_defer_) {
-      DVLOG(2) << "Cancel on defer";
-      if (read_op_ || !init_cb_.is_null()) {
+      if (read_op_) {
         // We can't destroy the reader if a read operation is pending.
         // UpdateLoadingState_Locked will be called again when the read
         // operation is done.
diff --git a/media/blink/multibuffer_data_source_unittest.cc b/media/blink/multibuffer_data_source_unittest.cc
index a7c2b9c..b71b1f2 100644
--- a/media/blink/multibuffer_data_source_unittest.cc
+++ b/media/blink/multibuffer_data_source_unittest.cc
@@ -390,21 +390,18 @@
   }
 
   void CheckCapacityDefer() {
-    if (loader()) {
-      EXPECT_EQ(2 << 20, preload_low());
-      EXPECT_EQ(3 << 20, preload_high());
-    } else {
-      EXPECT_EQ(preload(), MultibufferDataSource::AUTO);
-    }
+    EXPECT_EQ(2 << 20, preload_low());
+    EXPECT_EQ(3 << 20, preload_high());
   }
 
   void CheckReadThenDefer() {
-    if (loader()) {
-      EXPECT_EQ(0, preload_low());
-      EXPECT_EQ(0, preload_high());
-    } else {
-      EXPECT_EQ(preload(), MultibufferDataSource::METADATA);
-    }
+    EXPECT_EQ(0, preload_low());
+    EXPECT_EQ(0, preload_high());
+  }
+
+  void CheckNeverDefer() {
+    EXPECT_EQ(1LL << 40, preload_low());
+    EXPECT_EQ(1LL << 40, preload_high());
   }
 
   // Accessors for private variables on |data_source_|.
@@ -1189,20 +1186,15 @@
   set_preload(MultibufferDataSource::METADATA);
   InitializeWith206Response();
 
-  data_source_->MediaIsPlaying();
-  data_source_->SetPreload(MultibufferDataSource::METADATA);
+  EXPECT_EQ(MultibufferDataSource::METADATA, preload());
   EXPECT_FALSE(is_local_source());
   EXPECT_TRUE(data_source_->range_supported());
   CheckReadThenDefer();
 
-  // Read next block. (Needed to start up the loader again.)
+  // Read a bit from the beginning.
   EXPECT_CALL(*this, ReadCallback(kDataSize));
-  ReadAt(kDataSize);
-  Respond(response_generator_->Generate206(kDataSize));
-  EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2));
-  ReceiveData(kDataSize);
+  ReadAt(0);
 
-  // After reading, we should be in a deferred state.
   ASSERT_TRUE(active_loader());
   EXPECT_TRUE(data_provider()->deferred());
 }
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
index 68b41bce..545b5c7 100644
--- a/media/blink/webmediaplayer_impl.cc
+++ b/media/blink/webmediaplayer_impl.cc
@@ -938,16 +938,6 @@
   if (highest_ready_state_ >= ReadyState::kReadyStateHaveFutureData)
     return false;
 
-  // To suspend before we reach kReadyStateHaveCurrentData is only ok
-  // if we know we're going to get woken up when we get more data, which
-  // will only happen if the network is in the "Loading" state.
-  // This happens when the network is fast, but multiple videos are loading
-  // and multiplexing gets held up waiting for available threads.
-  if (highest_ready_state_ <= ReadyState::kReadyStateHaveMetadata &&
-      network_state_ != WebMediaPlayer::kNetworkStateLoading) {
-    return true;
-  }
-
   if (preroll_attempt_pending_)
     return true;
 
@@ -1333,6 +1323,9 @@
     SetNetworkState(PipelineErrorToNetworkState(status));
   }
 
+  // PipelineController::Stop() is idempotent.
+  pipeline_controller_.Stop();
+
   UpdatePlayState();
 }
 
diff --git a/media/blink/webmediaplayer_impl_unittest.cc b/media/blink/webmediaplayer_impl_unittest.cc
index 014a2d3..116f8f1e 100644
--- a/media/blink/webmediaplayer_impl_unittest.cc
+++ b/media/blink/webmediaplayer_impl_unittest.cc
@@ -270,9 +270,6 @@
   }
 
  protected:
-  void SetNetworkState(blink::WebMediaPlayer::NetworkState state) {
-    wmpi_->SetNetworkState(state);
-  }
   void SetReadyState(blink::WebMediaPlayer::ReadyState state) {
     wmpi_->SetReadyState(state);
   }
@@ -424,9 +421,11 @@
   EXPECT_FALSE(IsSuspended());
 }
 
-TEST_F(WebMediaPlayerImplTest, IdleSuspendBeforeLoadingBegins) {
+TEST_F(WebMediaPlayerImplTest, IdleSuspendIsEnabledBeforeLoadingBegins) {
   InitializeWebMediaPlayerImpl();
-  EXPECT_FALSE(delegate_.ExpireForTesting());
+  EXPECT_TRUE(delegate_.ExpireForTesting());
+  base::RunLoop().RunUntilIdle();
+  EXPECT_TRUE(IsSuspended());
 }
 
 TEST_F(WebMediaPlayerImplTest,
@@ -446,7 +445,6 @@
 
 TEST_F(WebMediaPlayerImplTest, IdleSuspendIsEnabledIfLoadingHasStalled) {
   InitializeWebMediaPlayerImpl();
-  SetNetworkState(blink::WebMediaPlayer::kNetworkStateLoading);
   base::SimpleTestTickClock* clock = new base::SimpleTestTickClock();
   clock->Advance(base::TimeDelta::FromSeconds(1));
   SetTickClock(clock);
@@ -462,7 +460,6 @@
 TEST_F(WebMediaPlayerImplTest, DidLoadingProgressTriggersResume) {
   // Same setup as IdleSuspendIsEnabledBeforeLoadingBegins.
   InitializeWebMediaPlayerImpl();
-  SetNetworkState(blink::WebMediaPlayer::kNetworkStateLoading);
   EXPECT_TRUE(delegate_.ExpireForTesting());
   base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(IsSuspended());
diff --git a/media/capture/video/video_capture_system_impl.cc b/media/capture/video/video_capture_system_impl.cc
index da8f119d..8e18420 100644
--- a/media/capture/video/video_capture_system_impl.cc
+++ b/media/capture/video/video_capture_system_impl.cc
@@ -9,41 +9,36 @@
 namespace {
 
 // Compares two VideoCaptureFormat by checking smallest frame_size area, then
-// by _largest_ frame_rate. Used to order a VideoCaptureFormats vector so that
-// the first entry for a given resolution has the largest frame rate, as needed
-// by the ConsolidateCaptureFormats() method.
+// by width, and then by _largest_ frame_rate. Used to order a
+// VideoCaptureFormats vector so that the first entry for a given resolution has
+// the largest frame rate.
 bool IsCaptureFormatSmaller(const media::VideoCaptureFormat& format1,
                             const media::VideoCaptureFormat& format2) {
   DCHECK(format1.frame_size.GetCheckedArea().IsValid());
   DCHECK(format2.frame_size.GetCheckedArea().IsValid());
   if (format1.frame_size.GetCheckedArea().ValueOrDefault(0) ==
       format2.frame_size.GetCheckedArea().ValueOrDefault(0)) {
-    return format1.frame_rate > format2.frame_rate;
+    if (format1.frame_size.width() == format2.frame_size.width()) {
+      return format1.frame_rate > format2.frame_rate;
+    }
+    return format1.frame_size.width() < format2.frame_size.width();
   }
   return format1.frame_size.GetCheckedArea().ValueOrDefault(0) <
          format2.frame_size.GetCheckedArea().ValueOrDefault(0);
 }
 
-bool IsCaptureFormatSizeEqual(const media::VideoCaptureFormat& format1,
-                              const media::VideoCaptureFormat& format2) {
-  DCHECK(format1.frame_size.GetCheckedArea().IsValid());
-  DCHECK(format2.frame_size.GetCheckedArea().IsValid());
-  return format1.frame_size.GetCheckedArea().ValueOrDefault(0) ==
-         format2.frame_size.GetCheckedArea().ValueOrDefault(0);
+bool IsCaptureFormatEqual(const media::VideoCaptureFormat& format1,
+                          const media::VideoCaptureFormat& format2) {
+  return format1.frame_size == format2.frame_size &&
+         format1.frame_rate == format2.frame_rate &&
+         format1.pixel_format == format2.pixel_format;
 }
 
-// This function receives a list of capture formats, removes duplicated
-// resolutions while keeping the highest frame rate for each, and forcing I420
-// pixel format.
+// This function receives a list of capture formats, sets all of them to I420
+// (while keeping Y16 as is), and then removes duplicates.
 void ConsolidateCaptureFormats(media::VideoCaptureFormats* formats) {
   if (formats->empty())
     return;
-  std::sort(formats->begin(), formats->end(), IsCaptureFormatSmaller);
-  // Due to the ordering imposed, the largest frame_rate is kept while removing
-  // duplicated resolutions.
-  media::VideoCaptureFormats::iterator last =
-      std::unique(formats->begin(), formats->end(), IsCaptureFormatSizeEqual);
-  formats->erase(last, formats->end());
   // Mark all formats as I420, since this is what the renderer side will get
   // anyhow: the actual pixel format is decided at the device level.
   // Don't do this for Y16 format as it is handled separatelly.
@@ -51,6 +46,11 @@
     if (format.pixel_format != media::PIXEL_FORMAT_Y16)
       format.pixel_format = media::PIXEL_FORMAT_I420;
   }
+  std::sort(formats->begin(), formats->end(), IsCaptureFormatSmaller);
+  // Remove duplicates
+  media::VideoCaptureFormats::iterator last =
+      std::unique(formats->begin(), formats->end(), IsCaptureFormatEqual);
+  formats->erase(last, formats->end());
 }
 
 }  // anonymous namespace
diff --git a/media/capture/video/win/video_capture_device_factory_win.cc b/media/capture/video/win/video_capture_device_factory_win.cc
index c044c52..18fa3681 100644
--- a/media/capture/video/win/video_capture_device_factory_win.cc
+++ b/media/capture/video/win/video_capture_device_factory_win.cc
@@ -245,88 +245,13 @@
                                                 VideoCaptureFormats* formats) {
   DVLOG(1) << "GetDeviceSupportedFormatsDirectShow for "
            << descriptor.display_name;
-  ScopedComPtr<ICreateDevEnum> dev_enum;
-  HRESULT hr = ::CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
-                                  IID_PPV_ARGS(&dev_enum));
-  if (FAILED(hr))
-    return;
-
-  ScopedComPtr<IEnumMoniker> enum_moniker;
-  hr = dev_enum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
-                                       enum_moniker.GetAddressOf(), 0);
-  // CreateClassEnumerator returns S_FALSE on some Windows OS when no camera
-  // exists. Therefore the FAILED macro can't be used.
-  if (hr != S_OK)
-    return;
-
-  // Walk the capture devices. No need to check for device presence again since
-  // that is anyway needed in GetDeviceFilter(). "google camera adapter" and old
-  // VFW devices are already skipped previously in GetDeviceNames() enumeration.
-  base::win::ScopedComPtr<IBaseFilter> capture_filter;
-  hr = VideoCaptureDeviceWin::GetDeviceFilter(descriptor.device_id,
-                                              capture_filter.GetAddressOf());
-  if (!capture_filter.Get()) {
-    DLOG(ERROR) << "Failed to create capture filter: "
-                << logging::SystemErrorCodeToString(hr);
-    return;
-  }
-
-  base::win::ScopedComPtr<IPin> output_capture_pin(
-      VideoCaptureDeviceWin::GetPin(capture_filter.Get(), PINDIR_OUTPUT,
-                                    PIN_CATEGORY_CAPTURE, GUID_NULL));
-  if (!output_capture_pin.Get()) {
-    DLOG(ERROR) << "Failed to get capture output pin";
-    return;
-  }
-
-  ScopedComPtr<IAMStreamConfig> stream_config;
-  hr = output_capture_pin.CopyTo(stream_config.GetAddressOf());
-  if (FAILED(hr)) {
-    DLOG(ERROR) << "Failed to get IAMStreamConfig interface from "
-                   "capture device: " << logging::SystemErrorCodeToString(hr);
-    return;
-  }
-
-  int count = 0, size = 0;
-  hr = stream_config->GetNumberOfCapabilities(&count, &size);
-  if (FAILED(hr)) {
-    DLOG(ERROR) << "GetNumberOfCapabilities failed: "
-                << logging::SystemErrorCodeToString(hr);
-    return;
-  }
-
-  std::unique_ptr<BYTE[]> caps(new BYTE[size]);
-  for (int i = 0; i < count; ++i) {
-    VideoCaptureDeviceWin::ScopedMediaType media_type;
-    hr = stream_config->GetStreamCaps(i, media_type.Receive(), caps.get());
-    // GetStreamCaps() may return S_FALSE, so don't use FAILED() or SUCCEED()
-    // macros here since they'll trigger incorrectly.
-    if (hr != S_OK || !media_type.get()) {
-      DLOG(ERROR) << "GetStreamCaps failed: "
-                  << logging::SystemErrorCodeToString(hr);
-      return;
-    }
-
-    if (media_type->majortype == MEDIATYPE_Video &&
-        media_type->formattype == FORMAT_VideoInfo) {
-      VideoCaptureFormat format;
-      format.pixel_format =
-          VideoCaptureDeviceWin::TranslateMediaSubtypeToPixelFormat(
-              media_type->subtype);
-      if (format.pixel_format == PIXEL_FORMAT_UNKNOWN)
-        continue;
-      VIDEOINFOHEADER* h =
-          reinterpret_cast<VIDEOINFOHEADER*>(media_type->pbFormat);
-      format.frame_size.SetSize(h->bmiHeader.biWidth, h->bmiHeader.biHeight);
-      // Trust the frame rate from the VIDEOINFOHEADER.
-      format.frame_rate =
-          (h->AvgTimePerFrame > 0)
-              ? kSecondsToReferenceTime / static_cast<float>(h->AvgTimePerFrame)
-              : 0.0f;
-      formats->push_back(format);
-      DVLOG(1) << descriptor.display_name << " "
-               << VideoCaptureFormat::ToString(format);
-    }
+  CapabilityList capability_list;
+  VideoCaptureDeviceWin::GetDeviceCapabilityList(descriptor.device_id,
+                                                 &capability_list);
+  for (const auto& entry : capability_list) {
+    formats->emplace_back(entry.supported_format);
+    DVLOG(1) << descriptor.display_name << " "
+             << VideoCaptureFormat::ToString(entry.supported_format);
   }
 }
 
diff --git a/media/capture/video/win/video_capture_device_win.cc b/media/capture/video/win/video_capture_device_win.cc
index b1c90bc..1c010fe 100644
--- a/media/capture/video/win/video_capture_device_win.cc
+++ b/media/capture/video/win/video_capture_device_win.cc
@@ -101,6 +101,120 @@
   return control_range;
 }
 
+// static
+void VideoCaptureDeviceWin::GetDeviceCapabilityList(
+    const std::string& device_id,
+    CapabilityList* out_capability_list) {
+  base::win::ScopedComPtr<IBaseFilter> capture_filter;
+  HRESULT hr = VideoCaptureDeviceWin::GetDeviceFilter(
+      device_id, capture_filter.GetAddressOf());
+  if (!capture_filter.Get()) {
+    DLOG(ERROR) << "Failed to create capture filter: "
+                << logging::SystemErrorCodeToString(hr);
+    return;
+  }
+
+  base::win::ScopedComPtr<IPin> output_capture_pin(
+      VideoCaptureDeviceWin::GetPin(capture_filter.Get(), PINDIR_OUTPUT,
+                                    PIN_CATEGORY_CAPTURE, GUID_NULL));
+  if (!output_capture_pin.Get()) {
+    DLOG(ERROR) << "Failed to get capture output pin";
+    return;
+  }
+
+  GetPinCapabilityList(capture_filter, output_capture_pin, out_capability_list);
+}
+
+// static
+void VideoCaptureDeviceWin::GetPinCapabilityList(
+    base::win::ScopedComPtr<IBaseFilter> capture_filter,
+    base::win::ScopedComPtr<IPin> output_capture_pin,
+    CapabilityList* out_capability_list) {
+  ScopedComPtr<IAMStreamConfig> stream_config;
+  HRESULT hr = output_capture_pin.CopyTo(stream_config.GetAddressOf());
+  if (FAILED(hr)) {
+    DLOG(ERROR) << "Failed to get IAMStreamConfig interface from "
+                   "capture device: "
+                << logging::SystemErrorCodeToString(hr);
+    return;
+  }
+
+  // Get interface used for getting the frame rate.
+  ScopedComPtr<IAMVideoControl> video_control;
+  hr = capture_filter.CopyTo(video_control.GetAddressOf());
+
+  int count = 0, size = 0;
+  hr = stream_config->GetNumberOfCapabilities(&count, &size);
+  if (FAILED(hr)) {
+    DLOG(ERROR) << "GetNumberOfCapabilities failed: "
+                << logging::SystemErrorCodeToString(hr);
+    return;
+  }
+
+  std::unique_ptr<BYTE[]> caps(new BYTE[size]);
+  for (int i = 0; i < count; ++i) {
+    VideoCaptureDeviceWin::ScopedMediaType media_type;
+    hr = stream_config->GetStreamCaps(i, media_type.Receive(), caps.get());
+    // GetStreamCaps() may return S_FALSE, so don't use FAILED() or SUCCEED()
+    // macros here since they'll trigger incorrectly.
+    if (hr != S_OK || !media_type.get()) {
+      DLOG(ERROR) << "GetStreamCaps failed: "
+                  << logging::SystemErrorCodeToString(hr);
+      return;
+    }
+
+    if (media_type->majortype == MEDIATYPE_Video &&
+        media_type->formattype == FORMAT_VideoInfo) {
+      VideoCaptureFormat format;
+      format.pixel_format =
+          VideoCaptureDeviceWin::TranslateMediaSubtypeToPixelFormat(
+              media_type->subtype);
+      if (format.pixel_format == PIXEL_FORMAT_UNKNOWN)
+        continue;
+      VIDEOINFOHEADER* h =
+          reinterpret_cast<VIDEOINFOHEADER*>(media_type->pbFormat);
+      format.frame_size.SetSize(h->bmiHeader.biWidth, h->bmiHeader.biHeight);
+
+      // Try to get a better |time_per_frame| from IAMVideoControl. If not, use
+      // the value from VIDEOINFOHEADER.
+      std::vector<float> frame_rates;
+      if (video_control.Get()) {
+        ScopedCoMem<LONGLONG> time_per_frame_list;
+        LONG list_size = 0;
+        const SIZE size = {format.frame_size.width(),
+                           format.frame_size.height()};
+        hr = video_control->GetFrameRateList(output_capture_pin.Get(), i, size,
+                                             &list_size, &time_per_frame_list);
+        // Sometimes |list_size| will be > 0, but time_per_frame_list will be
+        // NULL. Some drivers may return an HRESULT of S_FALSE which SUCCEEDED()
+        // translates into success, so explicitly check S_OK.
+        // See http://crbug.com/306237.
+        if (hr == S_OK && list_size > 0 && time_per_frame_list) {
+          for (int k = 0; k < list_size; k++) {
+            LONGLONG time_per_frame = *(time_per_frame_list + k);
+            if (time_per_frame <= 0)
+              continue;
+            frame_rates.push_back(kSecondsToReferenceTime /
+                                  static_cast<float>(time_per_frame));
+          }
+        }
+      }
+
+      if (frame_rates.empty() && h->AvgTimePerFrame > 0) {
+        frame_rates.push_back(kSecondsToReferenceTime /
+                              static_cast<float>(h->AvgTimePerFrame));
+      }
+      if (frame_rates.empty())
+        frame_rates.push_back(0.0f);
+
+      for (const auto& frame_rate : frame_rates) {
+        format.frame_rate = frame_rate;
+        out_capability_list->emplace_back(i, format, h->bmiHeader);
+      }
+    }
+  }
+}
+
 // Finds and creates a DirectShow Video Capture filter matching the |device_id|.
 // static
 HRESULT VideoCaptureDeviceWin::GetDeviceFilter(const std::string& device_id,
@@ -746,77 +860,7 @@
 
 bool VideoCaptureDeviceWin::CreateCapabilityMap() {
   DCHECK(thread_checker_.CalledOnValidThread());
-  ScopedComPtr<IAMStreamConfig> stream_config;
-  HRESULT hr = output_capture_pin_.CopyTo(stream_config.GetAddressOf());
-  DLOG_IF_FAILED_WITH_HRESULT(
-      "Failed to get IAMStreamConfig from capture device", hr);
-  if (FAILED(hr))
-    return false;
-
-  // Get interface used for getting the frame rate.
-  ScopedComPtr<IAMVideoControl> video_control;
-  hr = capture_filter_.CopyTo(video_control.GetAddressOf());
-
-  int count = 0, size = 0;
-  hr = stream_config->GetNumberOfCapabilities(&count, &size);
-  DLOG_IF_FAILED_WITH_HRESULT("Failed to GetNumberOfCapabilities", hr);
-  if (FAILED(hr))
-    return false;
-
-  std::unique_ptr<BYTE[]> caps(new BYTE[size]);
-  for (int stream_index = 0; stream_index < count; ++stream_index) {
-    ScopedMediaType media_type;
-    hr = stream_config->GetStreamCaps(stream_index, media_type.Receive(),
-                                      caps.get());
-    // GetStreamCaps() may return S_FALSE, so don't use FAILED() or SUCCEED()
-    // macros here since they'll trigger incorrectly.
-    if (hr != S_OK) {
-      DLOG(ERROR) << "Failed to GetStreamCaps";
-      return false;
-    }
-
-    if (media_type->majortype == MEDIATYPE_Video &&
-        media_type->formattype == FORMAT_VideoInfo) {
-      VideoCaptureFormat format;
-      format.pixel_format =
-          TranslateMediaSubtypeToPixelFormat(media_type->subtype);
-      if (format.pixel_format == PIXEL_FORMAT_UNKNOWN)
-        continue;
-
-      VIDEOINFOHEADER* h =
-          reinterpret_cast<VIDEOINFOHEADER*>(media_type->pbFormat);
-      format.frame_size.SetSize(h->bmiHeader.biWidth, h->bmiHeader.biHeight);
-
-      // Try to get a better |time_per_frame| from IAMVideoControl. If not, use
-      // the value from VIDEOINFOHEADER.
-      REFERENCE_TIME time_per_frame = h->AvgTimePerFrame;
-      if (video_control.Get()) {
-        ScopedCoMem<LONGLONG> max_fps;
-        LONG list_size = 0;
-        const SIZE size = {format.frame_size.width(),
-                           format.frame_size.height()};
-        hr = video_control->GetFrameRateList(output_capture_pin_.Get(),
-                                             stream_index, size, &list_size,
-                                             &max_fps);
-        // Can't assume the first value will return the max fps.
-        // Sometimes |list_size| will be > 0, but max_fps will be NULL. Some
-        // drivers may return an HRESULT of S_FALSE which SUCCEEDED() translates
-        // into success, so explicitly check S_OK. See http://crbug.com/306237.
-        if (hr == S_OK && list_size > 0 && max_fps) {
-          time_per_frame =
-              *std::min_element(max_fps.get(), max_fps.get() + list_size);
-        }
-      }
-
-      format.frame_rate =
-          (time_per_frame > 0)
-              ? (kSecondsToReferenceTime / static_cast<float>(time_per_frame))
-              : 0.0;
-
-      capabilities_.emplace_back(stream_index, format, h->bmiHeader);
-    }
-  }
-
+  GetPinCapabilityList(capture_filter_, output_capture_pin_, &capabilities_);
   return !capabilities_.empty();
 }
 
diff --git a/media/capture/video/win/video_capture_device_win.h b/media/capture/video/win/video_capture_device_win.h
index 7ae6a710..facee7e3 100644
--- a/media/capture/video/win/video_capture_device_win.h
+++ b/media/capture/video/win/video_capture_device_win.h
@@ -56,6 +56,12 @@
     AM_MEDIA_TYPE* media_type_;
   };
 
+  static void GetDeviceCapabilityList(const std::string& device_id,
+                                      CapabilityList* out_capability_list);
+  static void GetPinCapabilityList(
+      base::win::ScopedComPtr<IBaseFilter> capture_filter,
+      base::win::ScopedComPtr<IPin> output_capture_pin,
+      CapabilityList* out_capability_list);
   static HRESULT GetDeviceFilter(const std::string& device_id,
                                  IBaseFilter** filter);
   static base::win::ScopedComPtr<IPin> GetPin(IBaseFilter* filter,
diff --git a/media/filters/pipeline_controller.cc b/media/filters/pipeline_controller.cc
index e5d0245..aad3e4f9 100644
--- a/media/filters/pipeline_controller.cc
+++ b/media/filters/pipeline_controller.cc
@@ -45,7 +45,7 @@
                                bool is_streaming,
                                bool is_static) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(state_ == State::CREATED);
+  DCHECK_EQ(state_, State::STOPPED);
   DCHECK(demuxer);
 
   // Once the pipeline is started, we want to call the seeked callback but
@@ -247,12 +247,18 @@
 }
 
 void PipelineController::Stop() {
-  // For the moment, Stop() is only called on WMPI destruction, and updating the
-  // state of |this| is not relevant. Eventually, Start()/Stop() will be called
-  // in order to swap between demuxer types, and this will need to be adressed.
-  //
-  // TODO(tguilbert): Clarify the appropriate state changes when Stop() is
-  // called. See crbug.com/695734.
+  if (state_ == State::STOPPED)
+    return;
+
+  demuxer_ = nullptr;
+  waiting_for_seek_ = false;
+  pending_seeked_cb_ = false;
+  pending_time_updated_ = false;
+  pending_seek_ = false;
+  pending_suspend_ = false;
+  pending_resume_ = false;
+  state_ = State::STOPPED;
+
   pipeline_->Stop();
 }
 
diff --git a/media/filters/pipeline_controller.h b/media/filters/pipeline_controller.h
index 79cb14b..e8fce793 100644
--- a/media/filters/pipeline_controller.h
+++ b/media/filters/pipeline_controller.h
@@ -30,7 +30,7 @@
 class MEDIA_EXPORT PipelineController {
  public:
   enum class State {
-    CREATED,
+    STOPPED,
     STARTING,
     PLAYING,
     SEEKING,
@@ -169,7 +169,7 @@
   bool is_static_ = true;
 
   // Tracks the current state of |pipeline_|.
-  State state_ = State::CREATED;
+  State state_ = State::STOPPED;
 
   // Indicates that a seek has occurred. When set, a seeked callback will be
   // issued at the next stable state.
diff --git a/media/gpu/ipc/service/gpu_video_decode_accelerator.cc b/media/gpu/ipc/service/gpu_video_decode_accelerator.cc
index 0394ce47..61c6b2e 100644
--- a/media/gpu/ipc/service/gpu_video_decode_accelerator.cc
+++ b/media/gpu/ipc/service/gpu_video_decode_accelerator.cc
@@ -434,53 +434,58 @@
       return;
     }
     for (size_t j = 0; j < textures_per_buffer_; j++) {
-      gpu::gles2::TextureRef* texture_ref =
-          texture_manager->GetTexture(buffer_texture_ids[j]);
-      if (!texture_ref) {
+      GLuint service_id = 0;
+      if (!command_decoder->GetServiceTextureId(buffer_texture_ids[j],
+                                                &service_id)) {
         DLOG(ERROR) << "Failed to find texture id " << buffer_texture_ids[j];
         NotifyError(VideoDecodeAccelerator::INVALID_ARGUMENT);
         return;
       }
-      gpu::gles2::Texture* info = texture_ref->texture();
-      if (info->target() != texture_target_) {
-        DLOG(ERROR) << "Texture target mismatch for texture id "
-                    << buffer_texture_ids[j];
-        NotifyError(VideoDecodeAccelerator::INVALID_ARGUMENT);
-        return;
-      }
-      if (texture_target_ == GL_TEXTURE_EXTERNAL_OES ||
-          texture_target_ == GL_TEXTURE_RECTANGLE_ARB) {
-        // These textures have their dimensions defined by the underlying
-        // storage.
-        // Use |texture_dimensions_| for this size.
-        texture_manager->SetLevelInfo(texture_ref, texture_target_, 0, GL_RGBA,
-                                      texture_dimensions_.width(),
-                                      texture_dimensions_.height(), 1, 0,
-                                      GL_RGBA, GL_UNSIGNED_BYTE, gfx::Rect());
-      } else {
-        // For other targets, texture dimensions should already be defined.
-        GLsizei width = 0, height = 0;
-        info->GetLevelSize(texture_target_, 0, &width, &height, nullptr);
-        if (width != texture_dimensions_.width() ||
-            height != texture_dimensions_.height()) {
-          DLOG(ERROR) << "Size mismatch for texture id "
+
+      gpu::gles2::TextureRef* texture_ref =
+          texture_manager->GetTexture(buffer_texture_ids[j]);
+      if (texture_ref) {
+        gpu::gles2::Texture* info = texture_ref->texture();
+        if (info->target() != texture_target_) {
+          DLOG(ERROR) << "Texture target mismatch for texture id "
                       << buffer_texture_ids[j];
           NotifyError(VideoDecodeAccelerator::INVALID_ARGUMENT);
           return;
         }
+        if (texture_target_ == GL_TEXTURE_EXTERNAL_OES ||
+            texture_target_ == GL_TEXTURE_RECTANGLE_ARB) {
+          // These textures have their dimensions defined by the underlying
+          // storage.
+          // Use |texture_dimensions_| for this size.
+          texture_manager->SetLevelInfo(texture_ref, texture_target_, 0,
+                                        GL_RGBA, texture_dimensions_.width(),
+                                        texture_dimensions_.height(), 1, 0,
+                                        GL_RGBA, GL_UNSIGNED_BYTE, gfx::Rect());
+        } else {
+          // For other targets, texture dimensions should already be defined.
+          GLsizei width = 0, height = 0;
+          info->GetLevelSize(texture_target_, 0, &width, &height, nullptr);
+          if (width != texture_dimensions_.width() ||
+              height != texture_dimensions_.height()) {
+            DLOG(ERROR) << "Size mismatch for texture id "
+                        << buffer_texture_ids[j];
+            NotifyError(VideoDecodeAccelerator::INVALID_ARGUMENT);
+            return;
+          }
 
-        // TODO(dshwang): after moving to D3D11, remove this. crbug.com/438691
-        GLenum format =
-            video_decode_accelerator_.get()->GetSurfaceInternalFormat();
-        if (format != GL_RGBA) {
-          DCHECK(format == GL_BGRA_EXT);
-          texture_manager->SetLevelInfo(texture_ref, texture_target_, 0, format,
-                                        width, height, 1, 0, format,
-                                        GL_UNSIGNED_BYTE, gfx::Rect());
+          // TODO(dshwang): after moving to D3D11, remove this. crbug.com/438691
+          GLenum format =
+              video_decode_accelerator_.get()->GetSurfaceInternalFormat();
+          if (format != GL_RGBA) {
+            DCHECK(format == GL_BGRA_EXT);
+            texture_manager->SetLevelInfo(texture_ref, texture_target_, 0,
+                                          format, width, height, 1, 0, format,
+                                          GL_UNSIGNED_BYTE, gfx::Rect());
+          }
         }
+        current_textures.push_back(texture_ref);
       }
-      service_ids.push_back(texture_ref->service_id());
-      current_textures.push_back(texture_ref);
+      service_ids.push_back(service_id);
     }
     textures.push_back(current_textures);
     buffers.push_back(PictureBuffer(buffer_ids[i], texture_dimensions_,
diff --git a/media/gpu/v4l2_image_processor.cc b/media/gpu/v4l2_image_processor.cc
index bbbed74..08bd66e 100644
--- a/media/gpu/v4l2_image_processor.cc
+++ b/media/gpu/v4l2_image_processor.cc
@@ -365,14 +365,25 @@
   DCHECK(gfx::Rect(input_allocated_size_)
              .Contains(gfx::Rect(input_visible_size_)));
 
-  struct v4l2_crop crop;
-  memset(&crop, 0, sizeof(crop));
-  crop.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-  crop.c.left = 0;
-  crop.c.top = 0;
-  crop.c.width = base::checked_cast<__u32>(input_visible_size_.width());
-  crop.c.height = base::checked_cast<__u32>(input_visible_size_.height());
-  IOCTL_OR_ERROR_RETURN_FALSE(VIDIOC_S_CROP, &crop);
+  struct v4l2_rect visible_rect;
+  visible_rect.left = 0;
+  visible_rect.top = 0;
+  visible_rect.width = base::checked_cast<__u32>(input_visible_size_.width());
+  visible_rect.height = base::checked_cast<__u32>(input_visible_size_.height());
+
+  struct v4l2_selection selection_arg;
+  memset(&selection_arg, 0, sizeof(selection_arg));
+  selection_arg.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
+  selection_arg.target = V4L2_SEL_TGT_CROP;
+  selection_arg.r = visible_rect;
+  if (device_->Ioctl(VIDIOC_S_SELECTION, &selection_arg) != 0) {
+    DVLOG(2) << "Fallback to VIDIOC_S_CROP for input buffers.";
+    struct v4l2_crop crop;
+    memset(&crop, 0, sizeof(crop));
+    crop.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+    crop.c = visible_rect;
+    IOCTL_OR_ERROR_RETURN_FALSE(VIDIOC_S_CROP, &crop);
+  }
 
   struct v4l2_requestbuffers reqbufs;
   memset(&reqbufs, 0, sizeof(reqbufs));
@@ -416,14 +427,26 @@
              .Contains(gfx::Rect(output_allocated_size_)));
   output_allocated_size_ = adjusted_allocated_size;
 
-  struct v4l2_crop crop;
-  memset(&crop, 0, sizeof(crop));
-  crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-  crop.c.left = 0;
-  crop.c.top = 0;
-  crop.c.width = base::checked_cast<__u32>(output_visible_size_.width());
-  crop.c.height = base::checked_cast<__u32>(output_visible_size_.height());
-  IOCTL_OR_ERROR_RETURN_FALSE(VIDIOC_S_CROP, &crop);
+  struct v4l2_rect visible_rect;
+  visible_rect.left = 0;
+  visible_rect.top = 0;
+  visible_rect.width = base::checked_cast<__u32>(output_visible_size_.width());
+  visible_rect.height =
+    base::checked_cast<__u32>(output_visible_size_.height());
+
+  struct v4l2_selection selection_arg;
+  memset(&selection_arg, 0, sizeof(selection_arg));
+  selection_arg.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+  selection_arg.target = V4L2_SEL_TGT_COMPOSE;
+  selection_arg.r = visible_rect;
+  if (device_->Ioctl(VIDIOC_S_SELECTION, &selection_arg) != 0) {
+    DVLOG(2) << "Fallback to VIDIOC_S_CROP for output buffers.";
+    struct v4l2_crop crop;
+    memset(&crop, 0, sizeof(crop));
+    crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+    crop.c = visible_rect;
+    IOCTL_OR_ERROR_RETURN_FALSE(VIDIOC_S_CROP, &crop);
+  }
 
   struct v4l2_requestbuffers reqbufs;
   memset(&reqbufs, 0, sizeof(reqbufs));
diff --git a/media/renderers/video_renderer_impl.cc b/media/renderers/video_renderer_impl.cc
index def6618..34185302 100644
--- a/media/renderers/video_renderer_impl.cc
+++ b/media/renderers/video_renderer_impl.cc
@@ -557,35 +557,62 @@
 
   // Paint the first frame if possible and necessary. Paint ahead of
   // HAVE_ENOUGH_DATA to ensure the user sees the frame as early as possible.
+  bool just_painted_first_frame = false;
   if (!sink_started_ && algorithm_->frames_queued() && !painted_first_frame_) {
     // We want to paint the first frame under two conditions: Either (1) we have
     // enough frames to know it's definitely the first frame or (2) there may be
     // no more frames coming (sometimes unless we paint one of them).
     //
-    // For the first condition, we need at least two frames or the first frame
-    // must have a timestamp >= |start_timestamp_|, since otherwise we may be
-    // prerolling frames before the actual start time that will be dropped.
-    if (algorithm_->frames_queued() > 1 || received_end_of_stream_ ||
-        frame->timestamp() >= start_timestamp_ || low_delay_ ||
-        !video_frame_stream_->CanReadWithoutStalling()) {
+    // For the first condition, we need at least two effective frames, since
+    // otherwise we may be prerolling frames before the actual start time that
+    // will be dropped.
+    bool should_paint_first_frame =
+        algorithm_->effective_frames_queued() > 1 || received_end_of_stream_ ||
+        !video_frame_stream_->CanReadWithoutStalling();
+
+    // For the very first frame (i.e. not after seeks), we want to paint as fast
+    // as possible to ensure users don't abandon the playback. For live streams
+    // with long duration frames, waiting for a second frame may take seconds.
+    //
+    // Before time starts progressing we may not know if frames are effective or
+    // not, so the first frame must check if timestamp >= |start_timestamp_|.
+    //
+    // We only do this for the very first frame ever painted, since later frames
+    // risk being wrong due to the lack of duration on the first frame. This
+    // avoids any fast-forward or frame-flipping type effects as we try to
+    // resume after a seek.
+    if (!have_renderered_frames_ && !should_paint_first_frame) {
+      should_paint_first_frame =
+          frame->timestamp() >= start_timestamp_ || low_delay_;
+    }
+
+    if (should_paint_first_frame) {
       scoped_refptr<VideoFrame> first_frame =
           algorithm_->Render(base::TimeTicks(), base::TimeTicks(), nullptr);
       CheckForMetadataChanges(first_frame->format(),
                               first_frame->natural_size());
       sink_->PaintSingleFrame(first_frame);
-      painted_first_frame_ = true;
+      just_painted_first_frame = painted_first_frame_ = true;
     }
   }
 
   // Signal buffering state if we've met our conditions.
-  if (buffering_state_ == BUFFERING_HAVE_NOTHING && HaveEnoughData_Locked())
+  //
+  // If we've just painted the first frame, require the standard 1 frame for low
+  // latency playback. If we're resuming after a Flush(), wait until we have two
+  // frames even in low delay mode to avoid any kind of fast-forward or frame
+  // flipping effect while we attempt to find the best frame.
+  if (buffering_state_ == BUFFERING_HAVE_NOTHING &&
+      HaveEnoughData_Locked(just_painted_first_frame ? 1u : 2u)) {
     TransitionToHaveEnough_Locked();
+  }
 
   // Always request more decoded video if we have capacity.
   AttemptRead_Locked();
 }
 
-bool VideoRendererImpl::HaveEnoughData_Locked() {
+bool VideoRendererImpl::HaveEnoughData_Locked(
+    size_t low_latency_frames_required) const {
   DCHECK_EQ(state_, kPlaying);
   lock_.AssertAcquired();
 
@@ -602,10 +629,16 @@
   if (was_background_rendering_ && frames_decoded_)
     return true;
 
-  if (!low_delay_ && video_frame_stream_->CanReadWithoutStalling())
+  // Note: We still require an effective frame in the stalling case since this
+  // method is also used to inform TransitionToHaveNothing_Locked() and thus
+  // would never pause and rebuffer if we always return true here.
+  if (!video_frame_stream_->CanReadWithoutStalling())
+    return algorithm_->effective_frames_queued() > 0u;
+
+  if (!low_delay_)
     return false;
 
-  return algorithm_->effective_frames_queued() > 0;
+  return algorithm_->effective_frames_queued() >= low_latency_frames_required;
 }
 
 void VideoRendererImpl::TransitionToHaveEnough_Locked() {
@@ -725,7 +758,7 @@
   }
 }
 
-bool VideoRendererImpl::HaveReachedBufferingCap() {
+bool VideoRendererImpl::HaveReachedBufferingCap() const {
   DCHECK(task_runner_->BelongsToCurrentThread());
 
   if (use_complexity_based_buffering_)
diff --git a/media/renderers/video_renderer_impl.h b/media/renderers/video_renderer_impl.h
index 2785bed..0cf59f82 100644
--- a/media/renderers/video_renderer_impl.h
+++ b/media/renderers/video_renderer_impl.h
@@ -140,7 +140,12 @@
 
   // Returns true if the renderer has enough data for playback purposes.
   // Note that having enough data may be due to reaching end of stream.
-  bool HaveEnoughData_Locked();
+  //
+  // |low_latency_frames_required| indicates the required number of frame for
+  // have enough with a low latency playback. By default it's one frame, but
+  // during resume after a Flush() we may wait for 2 frames to ensure we have
+  // effective frames.
+  bool HaveEnoughData_Locked(size_t low_latency_frames_required = 1u) const;
   void TransitionToHaveEnough_Locked();
   void TransitionToHaveNothing();
   void TransitionToHaveNothing_Locked();
@@ -150,7 +155,7 @@
   void UpdateStats_Locked();
 
   // Returns true if there is no more room for additional buffered frames.
-  bool HaveReachedBufferingCap();
+  bool HaveReachedBufferingCap() const;
 
   // Starts or stops |sink_| respectively. Do not call while |lock_| is held.
   void StartSink();
diff --git a/media/renderers/video_renderer_impl_unittest.cc b/media/renderers/video_renderer_impl_unittest.cc
index eea5882..486ae88 100644
--- a/media/renderers/video_renderer_impl_unittest.cc
+++ b/media/renderers/video_renderer_impl_unittest.cc
@@ -433,13 +433,14 @@
       EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
       EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH))
           .WillOnce(RunClosure(event.GetClosure()));
+
       // Note: In the normal underflow case we queue 5 frames here instead of
       // four since the underflow increases the number of required frames to
       // reach the have enough state.
       if (type == UnderflowTestType::NORMAL)
         QueueFrames("80 100 120 140 160");
       else
-        QueueFrames("40 60 80 90");
+        QueueFrames("40 60 80 90 100");
       SatisfyPendingDecode();
       event.RunAndWait();
     }
diff --git a/media/test/data/load_many_videos.html b/media/test/data/load_many_videos.html
deleted file mode 100644
index 0eacf6f..0000000
--- a/media/test/data/load_many_videos.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!--
-Loads lots of videos to make sure that we don't deadlock somewhere
-while loading lots of videos. We try a variety of video formats and
-containers to try to cover different read patterns.
--->
-<html>
-<body onload="RunTest();">
-<video controls preload=audo src="bear-320x180-hi10p.mp4"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?A"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?B"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?C"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?D"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?E"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?F"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?G"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?H"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?I"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?J"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?K"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?L"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?M"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?N"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?O"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?P"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?Q"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?R"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?S"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?T"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?U"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?V"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?W"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?X"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?Y"></video><br>
-<video controls preload=audo src="bear-320x180-hi10p.mp4?Z"></video><br>
-<video controls preload=audo src="bear-1280x720.mp4"></video><br>
-<video controls preload=audo src="bear-320x240.webm"></video><br>
-<video controls preload=audo src="bear.mp4"></video><br>
-<video controls preload=audo src="bear-vp8a.webm"></video><br>
-<video controls preload=audo src="bear-320x240-video-only.webm"></video><br>
-<video controls preload=audo src="bear-320x240-vp9_profile2.webm"></video><br>
-<video controls preload=audo src="bear-320x180-hi12p-vp9.webm"></video><br>
-<video controls preload=audo src="bbb-320x240-2video-2audio.mp4"></video><br>
-<video controls preload=audo src="bear-1280x720-av_with-aud-nalus_frag.mp4"></video><br>
-<video controls preload=audo src="bear-vp8-webvtt.webm"></video><br>
-</body>
-
-<script>
-  function CheckIfDone() {
-    console.log("Done?");
-    var players = document.getElementsByTagName("video");
-    for (var i = 0; i < players.length; i++) {
-      if (players[i].readyState < 4) return;
-    }
-    document.title = "ENDED";
-  }
-  function RunTest() {
-    var players = document.getElementsByTagName("video");
-    for (var i = 0; i < players.length; i++) {
-      players[i].addEventListener('canplaythrough', function(e) { CheckIfDone(); });
-    }
-    CheckIfDone();
-  }
-</script>
-</html>
diff --git a/media/test/pipeline_integration_test_base.cc b/media/test/pipeline_integration_test_base.cc
index cae4034..6f08481 100644
--- a/media/test/pipeline_integration_test_base.cc
+++ b/media/test/pipeline_integration_test_base.cc
@@ -192,6 +192,7 @@
 void PipelineIntegrationTestBase::OnError(PipelineStatus status) {
   DCHECK_NE(status, PIPELINE_OK);
   pipeline_status_ = status;
+  pipeline_->Stop();
   scoped_task_environment_.GetMainThreadTaskRunner()->PostTask(
       FROM_HERE, base::MessageLoop::QuitWhenIdleClosure());
 }
diff --git a/mojo/edk/embedder/README.md b/mojo/edk/embedder/README.md
index 99ec23e..2e7c02d 100644
--- a/mojo/edk/embedder/README.md
+++ b/mojo/edk/embedder/README.md
@@ -59,7 +59,7 @@
 
   base::Thread ipc_thread("ipc!");
   ipc_thread.StartWithOptions(
-      base::Thread::Options(base::MessageLoop::TYPE_IO));
+      base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
 
   // As long as this object is alive, all EDK API surface relevant to IPC
   // connections is usable and message pipes which span a process boundary will
@@ -120,7 +120,7 @@
 
   base::Thread ipc_thread("ipc!");
   ipc_thread.StartWithOptions(
-      base::Thread::Options(base::MessageLoop::TYPE_IO));
+      base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
 
   mojo::edk::ScopedIPCSupport ipc_support(
       ipc_thread.task_runner(),
@@ -164,7 +164,7 @@
 
   base::Thread ipc_thread("ipc!");
   ipc_thread.StartWithOptions(
-      base::Thread::Options(base::MessageLoop::TYPE_IO));
+      base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
 
   mojo::edk::ScopedIPCSupport ipc_support(
       ipc_thread.task_runner(),
@@ -212,7 +212,7 @@
 
   base::Thread ipc_thread("ipc!");
   ipc_thread.StartWithOptions(
-      base::Thread::Options(base::MessageLoop::TYPE_IO));
+      base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
 
   mojo::edk::ScopedIPCSupport ipc_support(
       ipc_thread.task_runner(),
diff --git a/mojo/public/cpp/bindings/interface_id.h b/mojo/public/cpp/bindings/interface_id.h
index 53475d6..d612853 100644
--- a/mojo/public/cpp/bindings/interface_id.h
+++ b/mojo/public/cpp/bindings/interface_id.h
@@ -30,6 +30,10 @@
   return id != kInvalidInterfaceId;
 }
 
+inline bool HasInterfaceIdNamespaceBitSet(InterfaceId id) {
+  return (id & kInterfaceIdNamespaceMask) != 0;
+}
+
 }  // namespace mojo
 
 #endif  // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ID_H_
diff --git a/mojo/public/cpp/bindings/lib/multiplex_router.cc b/mojo/public/cpp/bindings/lib/multiplex_router.cc
index 54fae5c8..031822c 100644
--- a/mojo/public/cpp/bindings/lib/multiplex_router.cc
+++ b/mojo/public/cpp/bindings/lib/multiplex_router.cc
@@ -442,6 +442,14 @@
   if (!IsValidInterfaceId(id))
     return ScopedInterfaceEndpointHandle();
 
+  // Unless it is the master ID, |id| is from the remote side and therefore its
+  // namespace bit is supposed to be different than the value that this router
+  // would use.
+  if (!IsMasterInterfaceId(id) &&
+      set_interface_id_namespace_bit_ == HasInterfaceIdNamespaceBitSet(id)) {
+    return ScopedInterfaceEndpointHandle();
+  }
+
   MayAutoLock locker(&lock_);
   bool inserted = false;
   InterfaceEndpoint* endpoint = FindOrInsertEndpoint(id, &inserted);
@@ -451,13 +459,13 @@
     if (encountered_error_)
       UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED);
   } else {
-    // If the endpoint already exist, it is because we have received a
-    // notification that the peer endpoint has closed.
-    CHECK(!endpoint->closed());
-    CHECK(endpoint->peer_closed());
-
     if (endpoint->handle_created())
       return ScopedInterfaceEndpointHandle();
+
+    // If the endpoint already exist, it is because we have received a
+    // notification that the peer endpoint has closed.
+    DCHECK(!endpoint->closed());
+    DCHECK(endpoint->peer_closed());
   }
 
   endpoint->set_handle_created();
diff --git a/mojo/public/js/new_bindings/interface_types.js b/mojo/public/js/new_bindings/interface_types.js
index 3d35e8c..b7085e5a 100644
--- a/mojo/public/js/new_bindings/interface_types.js
+++ b/mojo/public/js/new_bindings/interface_types.js
@@ -77,12 +77,20 @@
     return interfaceId !== kInvalidInterfaceId;
   }
 
+  function hasInterfaceIdNamespaceBitSet(interfaceId) {
+    if (interfaceId >= 2 * kInterfaceIdNamespaceMask) {
+      throw new Error("Interface ID should be a 32-bit unsigned integer.");
+    }
+    return interfaceId >= kInterfaceIdNamespaceMask;
+  }
+
   mojo.InterfacePtrInfo = InterfacePtrInfo;
   mojo.InterfaceRequest = InterfaceRequest;
   mojo.AssociatedInterfacePtrInfo = AssociatedInterfacePtrInfo;
   mojo.AssociatedInterfaceRequest = AssociatedInterfaceRequest;
   internal.isMasterInterfaceId = isMasterInterfaceId;
   internal.isValidInterfaceId = isValidInterfaceId;
+  internal.hasInterfaceIdNamespaceBitSet = hasInterfaceIdNamespaceBitSet;
   internal.kInvalidInterfaceId = kInvalidInterfaceId;
   internal.kMasterInterfaceId = kMasterInterfaceId;
   internal.kInterfaceIdNamespaceMask = kInterfaceIdNamespaceMask;
diff --git a/mojo/public/js/new_bindings/router.js b/mojo/public/js/new_bindings/router.js
index c7065dc..9aab9c2 100644
--- a/mojo/public/js/new_bindings/router.js
+++ b/mojo/public/js/new_bindings/router.js
@@ -165,6 +165,15 @@
       return new internal.InterfaceEndpointHandle();
     }
 
+    // Unless it is the master ID, |interfaceId| is from the remote side and
+    // therefore its namespace bit is supposed to be different than the value
+    // that this router would use.
+    if (!internal.isMasterInterfaceId(interfaceId) &&
+        this.setInterfaceIdNamespaceBit_ ===
+            internal.hasInterfaceIdNamespaceBitSet(interfaceId)) {
+      return new internal.InterfaceEndpointHandle();
+    }
+
     var endpoint = this.endpoints_.get(interfaceId);
 
     if (!endpoint) {
diff --git a/mojo/public/js/router.js b/mojo/public/js/router.js
index 5fc0ed56..805f663 100644
--- a/mojo/public/js/router.js
+++ b/mojo/public/js/router.js
@@ -194,14 +194,14 @@
             EndpointStateUpdateType.PEER_ENDPOINT_CLOSED);
       }
     } else {
+      if (endpoint.handleCreated) {
+        return new InterfaceEndpointHandle();
+      }
+
       // If the endpoint already exist, it is because we have received a
       // notification that the peer endpoint has closed.
       check(!endpoint.closed);
       check(endpoint.peerClosed);
-
-      if (endpoint.handleCreated) {
-        return new InterfaceEndpointHandle();
-      }
     }
 
     endpoint.handleCreated = true;
diff --git a/net/base/network_change_notifier.cc b/net/base/network_change_notifier.cc
index 080e7427..6bca78c 100644
--- a/net/base/network_change_notifier.cc
+++ b/net/base/network_change_notifier.cc
@@ -63,18 +63,17 @@
     NetworkChangeNotifier::kInvalidNetworkHandle = -1;
 
 // The main observer class that records UMAs for network events.
-class HistogramWatcher
-    : public NetworkChangeNotifier::ConnectionTypeObserver,
-      public NetworkChangeNotifier::IPAddressObserver,
-      public NetworkChangeNotifier::DNSObserver,
-      public NetworkChangeNotifier::NetworkChangeObserver {
+class NetworkChangeNotifier::HistogramWatcher : public ConnectionTypeObserver,
+                                                public IPAddressObserver,
+                                                public DNSObserver,
+                                                public NetworkChangeObserver {
  public:
   HistogramWatcher()
       : last_ip_address_change_(base::TimeTicks::Now()),
         last_connection_change_(base::TimeTicks::Now()),
         last_dns_change_(base::TimeTicks::Now()),
         last_network_change_(base::TimeTicks::Now()),
-        last_connection_type_(NetworkChangeNotifier::CONNECTION_UNKNOWN),
+        last_connection_type_(CONNECTION_UNKNOWN),
         offline_packets_received_(0),
         bytes_read_since_last_connection_change_(0),
         peak_kbps_since_last_connection_change_(0) {}
@@ -87,22 +86,22 @@
   void Init() {
     DCHECK(thread_checker_.CalledOnValidThread());
     DCHECK(g_network_change_notifier);
-    NetworkChangeNotifier::AddConnectionTypeObserver(this);
-    NetworkChangeNotifier::AddIPAddressObserver(this);
-    NetworkChangeNotifier::AddDNSObserver(this);
-    NetworkChangeNotifier::AddNetworkChangeObserver(this);
+    AddConnectionTypeObserver(this);
+    AddIPAddressObserver(this);
+    AddDNSObserver(this);
+    AddNetworkChangeObserver(this);
   }
 
   ~HistogramWatcher() override {
     DCHECK(thread_checker_.CalledOnValidThread());
     DCHECK(g_network_change_notifier);
-    NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
-    NetworkChangeNotifier::RemoveIPAddressObserver(this);
-    NetworkChangeNotifier::RemoveDNSObserver(this);
-    NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
+    RemoveConnectionTypeObserver(this);
+    RemoveIPAddressObserver(this);
+    RemoveDNSObserver(this);
+    RemoveNetworkChangeObserver(this);
   }
 
-  // NetworkChangeNotifier::IPAddressObserver implementation.
+  // IPAddressObserver implementation.
   void OnIPAddressChanged() override {
     DCHECK(thread_checker_.CalledOnValidThread());
     UMA_HISTOGRAM_MEDIUM_TIMES("NCN.IPAddressChange",
@@ -112,58 +111,57 @@
         last_ip_address_change_ - last_connection_change_);
   }
 
-  // NetworkChangeNotifier::ConnectionTypeObserver implementation.
-  void OnConnectionTypeChanged(
-      NetworkChangeNotifier::ConnectionType type) override {
+  // ConnectionTypeObserver implementation.
+  void OnConnectionTypeChanged(ConnectionType type) override {
     DCHECK(thread_checker_.CalledOnValidThread());
     base::TimeTicks now = base::TimeTicks::Now();
     int32_t kilobytes_read = bytes_read_since_last_connection_change_ / 1000;
     base::TimeDelta state_duration = SinceLast(&last_connection_change_);
     if (bytes_read_since_last_connection_change_) {
       switch (last_connection_type_) {
-        case NetworkChangeNotifier::CONNECTION_UNKNOWN:
+        case CONNECTION_UNKNOWN:
           UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOnUnknown",
                               first_byte_after_connection_change_);
           UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOnUnknown",
                               fastest_RTT_since_last_connection_change_);
           break;
-        case NetworkChangeNotifier::CONNECTION_ETHERNET:
+        case CONNECTION_ETHERNET:
           UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOnEthernet",
                               first_byte_after_connection_change_);
           UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOnEthernet",
                               fastest_RTT_since_last_connection_change_);
           break;
-        case NetworkChangeNotifier::CONNECTION_WIFI:
+        case CONNECTION_WIFI:
           UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOnWifi",
                               first_byte_after_connection_change_);
           UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOnWifi",
                               fastest_RTT_since_last_connection_change_);
           break;
-        case NetworkChangeNotifier::CONNECTION_2G:
+        case CONNECTION_2G:
           UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOn2G",
                               first_byte_after_connection_change_);
           UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOn2G",
                               fastest_RTT_since_last_connection_change_);
           break;
-        case NetworkChangeNotifier::CONNECTION_3G:
+        case CONNECTION_3G:
           UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOn3G",
                               first_byte_after_connection_change_);
           UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOn3G",
                               fastest_RTT_since_last_connection_change_);
           break;
-        case NetworkChangeNotifier::CONNECTION_4G:
+        case CONNECTION_4G:
           UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOn4G",
                               first_byte_after_connection_change_);
           UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOn4G",
                               fastest_RTT_since_last_connection_change_);
           break;
-        case NetworkChangeNotifier::CONNECTION_NONE:
+        case CONNECTION_NONE:
           UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOnNone",
                               first_byte_after_connection_change_);
           UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOnNone",
                               fastest_RTT_since_last_connection_change_);
           break;
-        case NetworkChangeNotifier::CONNECTION_BLUETOOTH:
+        case CONNECTION_BLUETOOTH:
           UMA_HISTOGRAM_TIMES("NCN.CM.FirstReadOnBluetooth",
                               first_byte_after_connection_change_);
           UMA_HISTOGRAM_TIMES("NCN.CM.FastestRTTOnBluetooth",
@@ -172,78 +170,78 @@
     }
     if (peak_kbps_since_last_connection_change_) {
       switch (last_connection_type_) {
-        case NetworkChangeNotifier::CONNECTION_UNKNOWN:
+        case CONNECTION_UNKNOWN:
           UMA_HISTOGRAM_COUNTS_1M("NCN.CM.PeakKbpsOnUnknown",
                                   peak_kbps_since_last_connection_change_);
           break;
-        case NetworkChangeNotifier::CONNECTION_ETHERNET:
+        case CONNECTION_ETHERNET:
           UMA_HISTOGRAM_COUNTS_1M("NCN.CM.PeakKbpsOnEthernet",
                                   peak_kbps_since_last_connection_change_);
           break;
-        case NetworkChangeNotifier::CONNECTION_WIFI:
+        case CONNECTION_WIFI:
           UMA_HISTOGRAM_COUNTS_1M("NCN.CM.PeakKbpsOnWifi",
                                   peak_kbps_since_last_connection_change_);
           break;
-        case NetworkChangeNotifier::CONNECTION_2G:
+        case CONNECTION_2G:
           UMA_HISTOGRAM_COUNTS_1M("NCN.CM.PeakKbpsOn2G",
                                   peak_kbps_since_last_connection_change_);
           break;
-        case NetworkChangeNotifier::CONNECTION_3G:
+        case CONNECTION_3G:
           UMA_HISTOGRAM_COUNTS_1M("NCN.CM.PeakKbpsOn3G",
                                   peak_kbps_since_last_connection_change_);
           break;
-        case NetworkChangeNotifier::CONNECTION_4G:
+        case CONNECTION_4G:
           UMA_HISTOGRAM_COUNTS_1M("NCN.CM.PeakKbpsOn4G",
                                   peak_kbps_since_last_connection_change_);
           break;
-        case NetworkChangeNotifier::CONNECTION_NONE:
+        case CONNECTION_NONE:
           UMA_HISTOGRAM_COUNTS_1M("NCN.CM.PeakKbpsOnNone",
                                   peak_kbps_since_last_connection_change_);
           break;
-        case NetworkChangeNotifier::CONNECTION_BLUETOOTH:
+        case CONNECTION_BLUETOOTH:
           UMA_HISTOGRAM_COUNTS_1M("NCN.CM.PeakKbpsOnBluetooth",
                                   peak_kbps_since_last_connection_change_);
           break;
       }
     }
     switch (last_connection_type_) {
-      case NetworkChangeNotifier::CONNECTION_UNKNOWN:
+      case CONNECTION_UNKNOWN:
         UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOnUnknown", state_duration);
         UMA_HISTOGRAM_COUNTS_1M("NCN.CM.KBTransferedOnUnknown", kilobytes_read);
         break;
-      case NetworkChangeNotifier::CONNECTION_ETHERNET:
+      case CONNECTION_ETHERNET:
         UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOnEthernet", state_duration);
         UMA_HISTOGRAM_COUNTS_1M("NCN.CM.KBTransferedOnEthernet",
                                 kilobytes_read);
         break;
-      case NetworkChangeNotifier::CONNECTION_WIFI:
+      case CONNECTION_WIFI:
         UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOnWifi", state_duration);
         UMA_HISTOGRAM_COUNTS_1M("NCN.CM.KBTransferedOnWifi", kilobytes_read);
         break;
-      case NetworkChangeNotifier::CONNECTION_2G:
+      case CONNECTION_2G:
         UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOn2G", state_duration);
         UMA_HISTOGRAM_COUNTS_1M("NCN.CM.KBTransferedOn2G", kilobytes_read);
         break;
-      case NetworkChangeNotifier::CONNECTION_3G:
+      case CONNECTION_3G:
         UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOn3G", state_duration);
         UMA_HISTOGRAM_COUNTS_1M("NCN.CM.KBTransferedOn3G", kilobytes_read);
         break;
-      case NetworkChangeNotifier::CONNECTION_4G:
+      case CONNECTION_4G:
         UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOn4G", state_duration);
         UMA_HISTOGRAM_COUNTS_1M("NCN.CM.KBTransferedOn4G", kilobytes_read);
         break;
-      case NetworkChangeNotifier::CONNECTION_NONE:
+      case CONNECTION_NONE:
         UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOnNone", state_duration);
         UMA_HISTOGRAM_COUNTS_1M("NCN.CM.KBTransferedOnNone", kilobytes_read);
         break;
-      case NetworkChangeNotifier::CONNECTION_BLUETOOTH:
+      case CONNECTION_BLUETOOTH:
         UMA_HISTOGRAM_LONG_TIMES("NCN.CM.TimeOnBluetooth", state_duration);
         UMA_HISTOGRAM_COUNTS_1M("NCN.CM.KBTransferedOnBluetooth",
                                 kilobytes_read);
         break;
     }
 
-    if (type != NetworkChangeNotifier::CONNECTION_NONE) {
+    if (type != CONNECTION_NONE) {
       UMA_HISTOGRAM_MEDIUM_TIMES("NCN.OnlineChange", state_duration);
 
       if (offline_packets_received_) {
@@ -262,7 +260,7 @@
       UMA_HISTOGRAM_MEDIUM_TIMES("NCN.OfflineChange", state_duration);
     }
 
-    NetworkChangeNotifier::LogOperatorCodeHistogram(type);
+    LogOperatorCodeHistogram(type);
 
     UMA_HISTOGRAM_MEDIUM_TIMES(
         "NCN.IPAddressChangeToConnectionTypeChange",
@@ -275,17 +273,17 @@
     polling_interval_ = base::TimeDelta::FromSeconds(1);
   }
 
-  // NetworkChangeNotifier::DNSObserver implementation.
+  // DNSObserver implementation.
   void OnDNSChanged() override {
     DCHECK(thread_checker_.CalledOnValidThread());
     UMA_HISTOGRAM_MEDIUM_TIMES("NCN.DNSConfigChange",
                                SinceLast(&last_dns_change_));
   }
 
-  // NetworkChangeNotifier::NetworkChangeObserver implementation.
-  void OnNetworkChanged(NetworkChangeNotifier::ConnectionType type) override {
+  // NetworkChangeObserver implementation.
+  void OnNetworkChanged(ConnectionType type) override {
     DCHECK(thread_checker_.CalledOnValidThread());
-    if (type != NetworkChangeNotifier::CONNECTION_NONE) {
+    if (type != CONNECTION_NONE) {
       UMA_HISTOGRAM_MEDIUM_TIMES("NCN.NetworkOnlineChange",
                                  SinceLast(&last_network_change_));
     } else {
@@ -323,7 +321,7 @@
         peak_kbps_since_last_connection_change_ = kbps;
     }
 
-    if (last_connection_type_ != NetworkChangeNotifier::CONNECTION_NONE)
+    if (last_connection_type_ != CONNECTION_NONE)
       return;
 
     UMA_HISTOGRAM_MEDIUM_TIMES("NCN.OfflineDataRecv",
@@ -334,11 +332,9 @@
     if ((now - last_polled_connection_) > polling_interval_) {
       polling_interval_ *= 2;
       last_polled_connection_ = now;
-      last_polled_connection_type_ =
-          NetworkChangeNotifier::GetConnectionType();
+      last_polled_connection_type_ = GetConnectionType();
     }
-    if (last_polled_connection_type_ ==
-        NetworkChangeNotifier::CONNECTION_NONE) {
+    if (last_polled_connection_type_ == CONNECTION_NONE) {
       UMA_HISTOGRAM_MEDIUM_TIMES("NCN.PollingOfflineDataRecv",
                                  now - last_connection_change_);
     }
@@ -361,15 +357,15 @@
   // |polling_interval_| is initialized by |OnConnectionTypeChanged| on our
   // first transition to offline and on subsequent transitions.  Once offline,
   // |polling_interval_| doubles as offline data is received and we poll
-  // with |NetworkChangeNotifier::GetConnectionType| to verify the connection
+  // with |GetConnectionType| to verify the connection
   // state.
   base::TimeDelta polling_interval_;
   // |last_connection_type_| is the last value passed to
   // |OnConnectionTypeChanged|.
-  NetworkChangeNotifier::ConnectionType last_connection_type_;
+  ConnectionType last_connection_type_;
   // |last_polled_connection_type_| is last result from calling
-  // |NetworkChangeNotifier::GetConnectionType| in |NotifyDataReceived|.
-  NetworkChangeNotifier::ConnectionType last_polled_connection_type_;
+  // |GetConnectionType| in |NotifyDataReceived|.
+  ConnectionType last_polled_connection_type_;
   // Count of how many times NotifyDataReceived() has been called while the
   // NetworkChangeNotifier thought network connection was offline.
   int32_t offline_packets_received_;
diff --git a/net/base/network_change_notifier.h b/net/base/network_change_notifier.h
index 6678979..4f22ed1 100644
--- a/net/base/network_change_notifier.h
+++ b/net/base/network_change_notifier.h
@@ -18,7 +18,6 @@
 namespace net {
 
 struct DnsConfig;
-class HistogramWatcher;
 class NetworkChangeNotifierFactory;
 struct NetworkInterface;
 typedef std::vector<NetworkInterface> NetworkInterfaceList;
@@ -103,6 +102,7 @@
     SUBTYPE_LAST = SUBTYPE_WIFI_AD
   };
 
+  // DEPRECATED. Please use NetworkChangeObserver instead. crbug.com/754695.
   class NET_EXPORT IPAddressObserver {
    public:
     // Will be called when the IP address of the primary interface changes.
@@ -117,6 +117,7 @@
     DISALLOW_COPY_AND_ASSIGN(IPAddressObserver);
   };
 
+  // DEPRECATED. Please use NetworkChangeObserver instead. crbug.com/754695.
   class NET_EXPORT ConnectionTypeObserver {
    public:
     // Will be called when the connection type of the system has changed.
@@ -374,7 +375,12 @@
   // called back with notifications.  This is safe to call if Create() has not
   // been called (as long as it doesn't race the Create() call on another
   // thread), in which case it will simply do nothing.
+
+  // DEPRECATED. IPAddressObserver is deprecated. Please use
+  // NetworkChangeObserver instead. crbug.com/754695.
   static void AddIPAddressObserver(IPAddressObserver* observer);
+  // DEPRECATED. ConnectionTypeObserver is deprecated. Please use
+  // NetworkChangeObserver instead. crbug.com/754695.
   static void AddConnectionTypeObserver(ConnectionTypeObserver* observer);
   static void AddDNSObserver(DNSObserver* observer);
   static void AddNetworkChangeObserver(NetworkChangeObserver* observer);
@@ -388,7 +394,12 @@
   // nothing.  Technically, it's also safe to call after the notifier object has
   // been destroyed, if the call doesn't race the notifier's destruction, but
   // there's no reason to use the API in this risky way, so don't do it.
+
+  // DEPRECATED. IPAddressObserver is deprecated. Please use
+  // NetworkChangeObserver instead. crbug.com/754695.
   static void RemoveIPAddressObserver(IPAddressObserver* observer);
+  // DEPRECATED. ConnectionTypeObserver is deprecated. Please use
+  // NetworkChangeObserver instead. crbug.com/754695.
   static void RemoveConnectionTypeObserver(ConnectionTypeObserver* observer);
   static void RemoveDNSObserver(DNSObserver* observer);
   static void RemoveNetworkChangeObserver(NetworkChangeObserver* observer);
@@ -548,6 +559,7 @@
   friend class NetworkChangeNotifierLinuxTest;
   friend class NetworkChangeNotifierWinTest;
 
+  class HistogramWatcher;
   class NetworkState;
   class NetworkChangeCalculator;
 
diff --git a/net/dns/host_resolver_impl.cc b/net/dns/host_resolver_impl.cc
index f6b1b8fa..422a8e8 100644
--- a/net/dns/host_resolver_impl.cc
+++ b/net/dns/host_resolver_impl.cc
@@ -2099,6 +2099,14 @@
     MakeNotStale(stale_info);
     return net_error;
   }
+
+  // Special-case localhost names, as per the recommendations in
+  // https://tools.ietf.org/html/draft-west-let-localhost-be-localhost.
+  if (ServeLocalhost(*key, info, addresses)) {
+    MakeNotStale(stale_info);
+    return OK;
+  }
+
   if (ServeFromCache(*key, info, &net_error, addresses, allow_stale,
                      stale_info)) {
     source_net_log.AddEvent(NetLogEventType::HOST_RESOLVER_IMPL_CACHE_HIT,
@@ -2106,6 +2114,7 @@
     // |ServeFromCache()| will set |*stale_info| as needed.
     return net_error;
   }
+
   // TODO(szym): Do not do this if nsswitch.conf instructs not to.
   // http://crbug.com/117655
   if (ServeFromHosts(*key, info, addresses)) {
@@ -2115,11 +2124,6 @@
     return OK;
   }
 
-  if (ServeLocalhost(*key, info, addresses)) {
-    MakeNotStale(stale_info);
-    return OK;
-  }
-
   return ERR_DNS_CACHE_MISS;
 }
 
diff --git a/net/dns/host_resolver_impl_unittest.cc b/net/dns/host_resolver_impl_unittest.cc
index 9b3b3948..249419c 100644
--- a/net/dns/host_resolver_impl_unittest.cc
+++ b/net/dns/host_resolver_impl_unittest.cc
@@ -641,30 +641,6 @@
   EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
 }
 
-// RFC 6761 localhost names should always resolve to loopback.
-TEST_F(HostResolverImplTest, LocalhostLookup) {
-  // Add a rule resolving localhost names to a non-loopback IP and test
-  // that they still resolves to loopback.
-  proc_->AddRuleForAllFamilies("foo.localhost", "192.168.1.42");
-  proc_->AddRuleForAllFamilies("localhost", "192.168.1.42");
-  proc_->AddRuleForAllFamilies("localhost.", "192.168.1.42");
-
-  Request* req0 = CreateRequest("foo.localhost", 80);
-  EXPECT_THAT(req0->Resolve(), IsOk());
-  EXPECT_TRUE(req0->HasAddress("127.0.0.1", 80));
-  EXPECT_TRUE(req0->HasAddress("::1", 80));
-
-  Request* req1 = CreateRequest("localhost", 80);
-  EXPECT_THAT(req1->Resolve(), IsOk());
-  EXPECT_TRUE(req1->HasAddress("127.0.0.1", 80));
-  EXPECT_TRUE(req1->HasAddress("::1", 80));
-
-  Request* req2 = CreateRequest("localhost.", 80);
-  EXPECT_THAT(req2->Resolve(), IsOk());
-  EXPECT_TRUE(req2->HasAddress("127.0.0.1", 80));
-  EXPECT_TRUE(req2->HasAddress("::1", 80));
-}
-
 TEST_F(HostResolverImplTest, LocalhostIPV4IPV6Lookup) {
   Request* req1 = CreateRequest("localhost6", 80, MEDIUM, ADDRESS_FAMILY_IPV4);
   EXPECT_THAT(req1->Resolve(), IsOk());
@@ -1713,6 +1689,56 @@
 
 // TODO(cbentzel): Test a mix of requests with different HostResolverFlags.
 
+// RFC 6761 localhost names should always resolve to loopback.
+TEST_F(HostResolverImplDnsTest, LocalhostLookup) {
+  // Add a rule resolving localhost names to a non-loopback IP and test
+  // that they still resolves to loopback.
+  proc_->AddRuleForAllFamilies("foo.localhost", "192.168.1.42");
+  proc_->AddRuleForAllFamilies("localhost", "192.168.1.42");
+  proc_->AddRuleForAllFamilies("localhost.", "192.168.1.42");
+
+  Request* req0 = CreateRequest("foo.localhost", 80);
+  EXPECT_THAT(req0->Resolve(), IsOk());
+  EXPECT_TRUE(req0->HasAddress("127.0.0.1", 80));
+  EXPECT_TRUE(req0->HasAddress("::1", 80));
+
+  Request* req1 = CreateRequest("localhost", 80);
+  EXPECT_THAT(req1->Resolve(), IsOk());
+  EXPECT_TRUE(req1->HasAddress("127.0.0.1", 80));
+  EXPECT_TRUE(req1->HasAddress("::1", 80));
+
+  Request* req2 = CreateRequest("localhost.", 80);
+  EXPECT_THAT(req2->Resolve(), IsOk());
+  EXPECT_TRUE(req2->HasAddress("127.0.0.1", 80));
+  EXPECT_TRUE(req2->HasAddress("::1", 80));
+}
+
+// RFC 6761 localhost names should always resolve to loopback, even if a HOSTS
+// file is active.
+TEST_F(HostResolverImplDnsTest, LocalhostLookupWithHosts) {
+  DnsHosts hosts;
+  hosts[DnsHostsKey("localhost", ADDRESS_FAMILY_IPV4)] =
+      IPAddress({192, 168, 1, 1});
+  hosts[DnsHostsKey("foo.localhost", ADDRESS_FAMILY_IPV4)] =
+      IPAddress({192, 168, 1, 2});
+
+  DnsConfig config = CreateValidDnsConfig();
+  config.hosts = hosts;
+  ChangeDnsConfig(config);
+
+  Request* req1 = CreateRequest("localhost", 80);
+  EXPECT_THAT(req1->Resolve(), IsOk());
+  EXPECT_TRUE(req1->HasAddress("127.0.0.1", 80));
+  EXPECT_TRUE(req1->HasAddress("::1", 80));
+  EXPECT_FALSE(req1->HasAddress("192.168.1.1", 80));
+
+  Request* req2 = CreateRequest("foo.localhost", 80);
+  EXPECT_THAT(req2->Resolve(), IsOk());
+  EXPECT_TRUE(req2->HasAddress("127.0.0.1", 80));
+  EXPECT_TRUE(req2->HasAddress("::1", 80));
+  EXPECT_FALSE(req2->HasAddress("192.168.1.2", 80));
+}
+
 // Test successful and fallback resolutions in HostResolverImpl::DnsTask.
 TEST_F(HostResolverImplDnsTest, DnsTask) {
   proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
@@ -2102,8 +2128,11 @@
   // Expect synchronous resolution from DnsHosts.
   EXPECT_THAT(req->Resolve(), IsOk());
 
-  EXPECT_EQ(saw_ipv4, req->HasAddress("127.0.0.1", 80));
-  EXPECT_EQ(saw_ipv6, req->HasAddress("::1", 80));
+  // Localhost names always resolve to IPv4 and IPv6, regardless of the content
+  // written into the HOSTS file above based on the results of the
+  // SystemHostResolverCall at the top of this test.
+  EXPECT_TRUE(req->HasAddress("127.0.0.1", 80));
+  EXPECT_TRUE(req->HasAddress("::1", 80));
 }
 
 // Cancel a request with a single DNS transaction active.
diff --git a/net/quic/chromium/quic_chromium_client_session.h b/net/quic/chromium/quic_chromium_client_session.h
index a443e4a09..73d3f05 100644
--- a/net/quic/chromium/quic_chromium_client_session.h
+++ b/net/quic/chromium/quic_chromium_client_session.h
@@ -475,6 +475,8 @@
   // TODO(xunjieli): It only tracks |packet_readers_|. Write a better estimate.
   size_t EstimateMemoryUsage() const;
 
+  bool require_confirmation() const { return require_confirmation_; }
+
  protected:
   // QuicSession methods:
   bool ShouldCreateIncomingDynamicStream(QuicStreamId id) override;
diff --git a/net/quic/chromium/quic_chromium_packet_reader.cc b/net/quic/chromium/quic_chromium_packet_reader.cc
index 97e649e..816ad536 100644
--- a/net/quic/chromium/quic_chromium_packet_reader.cc
+++ b/net/quic/chromium/quic_chromium_packet_reader.cc
@@ -35,34 +35,38 @@
 QuicChromiumPacketReader::~QuicChromiumPacketReader() {}
 
 void QuicChromiumPacketReader::StartReading() {
-  if (read_pending_)
-    return;
+  for (;;) {
+    if (read_pending_)
+      return;
 
-  if (num_packets_read_ == 0)
-    yield_after_ = clock_->Now() + yield_after_duration_;
+    if (num_packets_read_ == 0)
+      yield_after_ = clock_->Now() + yield_after_duration_;
 
-  DCHECK(socket_);
-  read_pending_ = true;
-  int rv = socket_->Read(read_buffer_.get(), read_buffer_->size(),
-                         base::Bind(&QuicChromiumPacketReader::OnReadComplete,
-                                    weak_factory_.GetWeakPtr()));
-  UMA_HISTOGRAM_BOOLEAN("Net.QuicSession.AsyncRead", rv == ERR_IO_PENDING);
-  if (rv == ERR_IO_PENDING) {
-    num_packets_read_ = 0;
-    return;
-  }
+    DCHECK(socket_);
+    read_pending_ = true;
+    int rv = socket_->Read(read_buffer_.get(), read_buffer_->size(),
+                           base::Bind(&QuicChromiumPacketReader::OnReadComplete,
+                                      weak_factory_.GetWeakPtr()));
+    UMA_HISTOGRAM_BOOLEAN("Net.QuicSession.AsyncRead", rv == ERR_IO_PENDING);
+    if (rv == ERR_IO_PENDING) {
+      num_packets_read_ = 0;
+      return;
+    }
 
-  if (++num_packets_read_ > yield_after_packets_ ||
-      clock_->Now() > yield_after_) {
-    num_packets_read_ = 0;
-    // Data was read, process it.
-    // Schedule the work through the message loop to 1) prevent infinite
-    // recursion and 2) avoid blocking the thread for too long.
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::Bind(&QuicChromiumPacketReader::OnReadComplete,
-                              weak_factory_.GetWeakPtr(), rv));
-  } else {
-    OnReadComplete(rv);
+    if (++num_packets_read_ > yield_after_packets_ ||
+        clock_->Now() > yield_after_) {
+      num_packets_read_ = 0;
+      // Data was read, process it.
+      // Schedule the work through the message loop to 1) prevent infinite
+      // recursion and 2) avoid blocking the thread for too long.
+      base::ThreadTaskRunnerHandle::Get()->PostTask(
+          FROM_HERE, base::Bind(&QuicChromiumPacketReader::OnReadComplete,
+                                weak_factory_.GetWeakPtr(), rv));
+    } else {
+      if (!ProcessReadResult(rv)) {
+        return;
+      }
+    }
   }
 }
 
@@ -71,14 +75,14 @@
   return kMaxPacketSize;
 }
 
-void QuicChromiumPacketReader::OnReadComplete(int result) {
+bool QuicChromiumPacketReader::ProcessReadResult(int result) {
   read_pending_ = false;
   if (result == 0)
     result = ERR_CONNECTION_CLOSED;
 
   if (result < 0) {
     visitor_->OnReadError(result, socket_);
-    return;
+    return false;
   }
 
   QuicReceivedPacket packet(read_buffer_->data(), result, clock_->Now());
@@ -86,12 +90,15 @@
   IPEndPoint peer_address;
   socket_->GetLocalAddress(&local_address);
   socket_->GetPeerAddress(&peer_address);
-  if (!visitor_->OnPacket(
-          packet, QuicSocketAddress(QuicSocketAddressImpl(local_address)),
-          QuicSocketAddress(QuicSocketAddressImpl(peer_address))))
-    return;
+  return visitor_->OnPacket(
+      packet, QuicSocketAddress(QuicSocketAddressImpl(local_address)),
+      QuicSocketAddress(QuicSocketAddressImpl(peer_address)));
+}
 
-  StartReading();
+void QuicChromiumPacketReader::OnReadComplete(int result) {
+  if (ProcessReadResult(result)) {
+    StartReading();
+  }
 }
 
 }  // namespace net
diff --git a/net/quic/chromium/quic_chromium_packet_reader.h b/net/quic/chromium/quic_chromium_packet_reader.h
index 113eeef..a7ad85a 100644
--- a/net/quic/chromium/quic_chromium_packet_reader.h
+++ b/net/quic/chromium/quic_chromium_packet_reader.h
@@ -55,6 +55,8 @@
  private:
   // A completion callback invoked when a read completes.
   void OnReadComplete(int result);
+  // Return true if reading should continue.
+  bool ProcessReadResult(int result);
 
   DatagramClientSocket* socket_;
   Visitor* visitor_;
diff --git a/net/quic/chromium/quic_stream_factory.cc b/net/quic/chromium/quic_stream_factory.cc
index cee86b8..9572d01 100644
--- a/net/quic/chromium/quic_stream_factory.cc
+++ b/net/quic/chromium/quic_stream_factory.cc
@@ -508,8 +508,7 @@
 int QuicStreamFactory::Job::DoConnect() {
   io_state_ = STATE_CONNECT_COMPLETE;
 
-  bool require_confirmation = factory_->require_confirmation() ||
-                              was_alternative_service_recently_broken_;
+  bool require_confirmation = was_alternative_service_recently_broken_;
   net_log_.BeginEvent(
       NetLogEventType::QUIC_STREAM_FACTORY_JOB_CONNECT,
       NetLog::BoolCallback("require_confirmation", require_confirmation));
@@ -1533,6 +1532,11 @@
             SocketPerformanceWatcherFactory::PROTOCOL_QUIC, address_list);
   }
 
+  // Wait for handshake confirmation before allowing streams to be created if
+  // either this session or the factory require confirmation.
+  if (require_confirmation_)
+    require_confirmation = true;
+
   *session = new QuicChromiumClientSession(
       connection, std::move(socket), this, quic_crypto_client_stream_factory_,
       clock_, transport_security_state_, std::move(server_info), server_id,
diff --git a/net/quic/chromium/quic_stream_factory_test.cc b/net/quic/chromium/quic_stream_factory_test.cc
index 1f474bfb..2fa53972 100644
--- a/net/quic/chromium/quic_stream_factory_test.cc
+++ b/net/quic/chromium/quic_stream_factory_test.cc
@@ -222,7 +222,6 @@
         allow_server_migration_, force_hol_blocking_, race_cert_verification_,
         estimate_initial_rtt_, connection_options_, client_connection_options_,
         /*enable_token_binding*/ false));
-    factory_->set_require_confirmation(false);
   }
 
   void InitializeConnectionMigrationTest(
@@ -469,6 +468,7 @@
     store_server_configs_in_properties_ = true;
     idle_connection_timeout_seconds_ = 500;
     Initialize();
+    factory_->set_require_confirmation(false);
     ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
     crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
     crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
@@ -781,8 +781,8 @@
   EXPECT_EQ(OK, request3.Request(host_port_pair_, version_, privacy_mode_,
                                  /*cert_verify_flags=*/0, url_, "GET", net_log_,
                                  callback_.callback()));
-  stream = request3.CreateStream();   // Will reset stream 5.
-  stream.reset();                     // Will reset stream 7.
+  stream = request3.CreateStream();  // Will reset stream 5.
+  stream.reset();                    // Will reset stream 7.
 
   EXPECT_TRUE(socket_data.AllReadDataConsumed());
   EXPECT_TRUE(socket_data.AllWriteDataConsumed());
@@ -790,6 +790,7 @@
 
 TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
   Initialize();
+  factory_->set_require_confirmation(false);
   ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
@@ -816,6 +817,7 @@
 
 TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
   Initialize();
+  factory_->set_require_confirmation(false);
   ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
@@ -861,10 +863,75 @@
   EXPECT_TRUE(stream.get());
 
   QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
+  EXPECT_TRUE(session->require_confirmation());
   EXPECT_EQ(100000u, session->connection()->GetStats().srtt_us);
   ASSERT_FALSE(session->config()->HasInitialRoundTripTimeUsToSend());
 }
 
+TEST_P(QuicStreamFactoryTest, RequireConfirmation) {
+  crypto_client_stream_factory_.set_handshake_mode(
+      MockCryptoClientStream::ZERO_RTT);
+  host_resolver_.set_synchronous_mode(true);
+  host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
+                                           "192.168.0.1", "");
+  Initialize();
+  factory_->set_require_confirmation(true);
+  ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
+  crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+
+  MockQuicData socket_data;
+  socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
+  socket_data.AddWrite(ConstructInitialSettingsPacket());
+  socket_data.AddSocketDataToFactory(&socket_factory_);
+
+  QuicStreamRequest request(factory_.get());
+  EXPECT_EQ(ERR_IO_PENDING,
+            request.Request(host_port_pair_, version_, privacy_mode_,
+                            /*cert_verify_flags=*/0, url_, "GET", net_log_,
+                            callback_.callback()));
+
+  crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
+      QuicSession::HANDSHAKE_CONFIRMED);
+
+  EXPECT_THAT(callback_.WaitForResult(), IsOk());
+  std::unique_ptr<HttpStream> stream = request.CreateStream();
+  EXPECT_TRUE(stream.get());
+
+  QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
+  EXPECT_TRUE(session->require_confirmation());
+}
+
+TEST_P(QuicStreamFactoryTest, DontRequireConfirmationFromSameIP) {
+  crypto_client_stream_factory_.set_handshake_mode(
+      MockCryptoClientStream::ZERO_RTT);
+  host_resolver_.set_synchronous_mode(true);
+  host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
+                                           "192.168.0.1", "");
+  Initialize();
+  factory_->set_require_confirmation(true);
+  http_server_properties_.SetSupportsQuic(IPAddress(192, 0, 2, 33));
+
+  ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
+  crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+
+  MockQuicData socket_data;
+  socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
+  socket_data.AddWrite(ConstructInitialSettingsPacket());
+  socket_data.AddSocketDataToFactory(&socket_factory_);
+
+  QuicStreamRequest request(factory_.get());
+  EXPECT_THAT(request.Request(host_port_pair_, version_, privacy_mode_,
+                              /*cert_verify_flags=*/0, url_, "GET", net_log_,
+                              callback_.callback()),
+              IsOk());
+
+  std::unique_ptr<HttpStream> stream = request.CreateStream();
+  EXPECT_TRUE(stream.get());
+
+  QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
+  EXPECT_FALSE(session->require_confirmation());
+}
+
 TEST_P(QuicStreamFactoryTest, CachedInitialRtt) {
   ServerNetworkStats stats;
   stats.srtt = base::TimeDelta::FromMilliseconds(10);
@@ -4269,6 +4336,7 @@
 
 TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
   Initialize();
+  factory_->set_require_confirmation(false);
   ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
@@ -4453,6 +4521,7 @@
 
 TEST_P(QuicStreamFactoryTest, YieldAfterPackets) {
   Initialize();
+  factory_->set_require_confirmation(false);
   ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
   QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0);
@@ -4497,6 +4566,7 @@
 
 TEST_P(QuicStreamFactoryTest, YieldAfterDuration) {
   Initialize();
+  factory_->set_require_confirmation(false);
   ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
   QuicStreamFactoryPeer::SetYieldAfterDuration(
diff --git a/remoting/host/BUILD.gn b/remoting/host/BUILD.gn
index 1bcad96..f14db57 100644
--- a/remoting/host/BUILD.gn
+++ b/remoting/host/BUILD.gn
@@ -137,6 +137,8 @@
     "dns_blackhole_checker.h",
     "evaluate_capability.cc",
     "evaluate_capability.h",
+    "file_proxy_wrapper.cc",
+    "file_proxy_wrapper.h",
     "file_transfer_message_handler.cc",
     "file_transfer_message_handler.h",
     "file_transfer_message_handler_factory.cc",
diff --git a/remoting/host/file_proxy_wrapper.cc b/remoting/host/file_proxy_wrapper.cc
new file mode 100644
index 0000000..6e1aabc
--- /dev/null
+++ b/remoting/host/file_proxy_wrapper.cc
@@ -0,0 +1,13 @@
+// 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 "remoting/host/file_proxy_wrapper.h"
+
+namespace remoting {
+
+FileProxyWrapper::FileProxyWrapper() = default;
+
+FileProxyWrapper::~FileProxyWrapper() = default;
+
+}  // namespace remoting
diff --git a/remoting/host/file_proxy_wrapper.h b/remoting/host/file_proxy_wrapper.h
new file mode 100644
index 0000000..3065b3f
--- /dev/null
+++ b/remoting/host/file_proxy_wrapper.h
@@ -0,0 +1,39 @@
+// 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 REMOTING_HOST_FILE_PROXY_WRAPPER_H_
+#define REMOTING_HOST_FILE_PROXY_WRAPPER_H_
+
+#include "base/callback.h"
+#include "base/files/file_proxy.h"
+#include "remoting/proto/file_transfer.pb.h"
+
+namespace remoting {
+
+class CompoundBuffer;
+
+// FileProxyWrapper is an interface for implementing platform-specific file
+// writers for file transfers. Each operation is posted to a separate file IO
+// thread, and possibly a different process depending on the platform.
+class FileProxyWrapper {
+ public:
+  typedef base::Callback<void(protocol::FileTransferResponse_ErrorCode)>
+      ErrorCallback;
+  typedef base::Callback<void()> SuccessCallback;
+
+  FileProxyWrapper();
+  virtual ~FileProxyWrapper();
+
+  virtual void Init(const ErrorCallback& error_callback) = 0;
+  virtual void CreateFile(const std::string& filename,
+                          uint64_t filesize,
+                          const SuccessCallback& success_callback) = 0;
+  virtual void WriteChunk(std::unique_ptr<CompoundBuffer> buffer) = 0;
+  virtual void Close(const SuccessCallback& success_callback) = 0;
+  virtual void Cancel() = 0;
+};
+
+}  // namespace remoting
+
+#endif  // REMOTING_HOST_FILE_PROXY_WRAPPER_H_
diff --git a/services/device/generic_sensor/absolute_orientation_euler_angles_fusion_algorithm_using_accelerometer_and_magnetometer.cc b/services/device/generic_sensor/absolute_orientation_euler_angles_fusion_algorithm_using_accelerometer_and_magnetometer.cc
index c6f2866..7d6b45c 100644
--- a/services/device/generic_sensor/absolute_orientation_euler_angles_fusion_algorithm_using_accelerometer_and_magnetometer.cc
+++ b/services/device/generic_sensor/absolute_orientation_euler_angles_fusion_algorithm_using_accelerometer_and_magnetometer.cc
@@ -118,10 +118,8 @@
   // angles.
   DCHECK(fusion_sensor_);
 
-  // Not generating a new sensor value when the |fusion_sensor_|'s reporting
-  // mode is ON_CHANGE and the accelerometer reading doesn't change.
-  if (fusion_sensor_->GetReportingMode() == mojom::ReportingMode::ON_CHANGE &&
-      which_sensor_changed != mojom::SensorType::ACCELEROMETER) {
+  // Only generate a new sensor value when the accelerometer reading changes.
+  if (which_sensor_changed != mojom::SensorType::ACCELEROMETER) {
     return false;
   }
 
diff --git a/services/device/generic_sensor/generic_sensor_service_unittest.cc b/services/device/generic_sensor/generic_sensor_service_unittest.cc
index 79147698..f3ae3d98 100644
--- a/services/device/generic_sensor/generic_sensor_service_unittest.cc
+++ b/services/device/generic_sensor/generic_sensor_service_unittest.cc
@@ -53,7 +53,7 @@
     if (GetType() == SensorType::AMBIENT_LIGHT) {
       // Set the shared buffer value as frequency for testing purpose.
       reading.als.value = configuration.frequency();
-      UpdateSensorReading(reading, true);
+      UpdateSensorReading(reading);
     }
     return true;
   }
diff --git a/services/device/generic_sensor/platform_sensor.cc b/services/device/generic_sensor/platform_sensor.cc
index 7bdf40c..c77be98 100644
--- a/services/device/generic_sensor/platform_sensor.cc
+++ b/services/device/generic_sensor/platform_sensor.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "services/device/generic_sensor/platform_sensor_provider.h"
@@ -103,8 +104,7 @@
   return shared_buffer_reader_->GetReading(result);
 }
 
-void PlatformSensor::UpdateSensorReading(const SensorReading& reading,
-                                         bool notify_clients) {
+void PlatformSensor::UpdateSensorReading(const SensorReading& reading) {
   ReadingBuffer* buffer =
       static_cast<ReadingBuffer*>(shared_buffer_mapping_.get());
   auto& seqlock = buffer->seqlock.value();
@@ -112,10 +112,9 @@
   buffer->reading = reading;
   seqlock.WriteEnd();
 
-  if (notify_clients)
-    task_runner_->PostTask(
-        FROM_HERE, base::Bind(&PlatformSensor::NotifySensorReadingChanged,
-                              weak_factory_.GetWeakPtr()));
+  task_runner_->PostTask(FROM_HERE,
+                         base::Bind(&PlatformSensor::NotifySensorReadingChanged,
+                                    weak_factory_.GetWeakPtr()));
 }
 
 void PlatformSensor::NotifySensorReadingChanged() {
diff --git a/services/device/generic_sensor/platform_sensor.h b/services/device/generic_sensor/platform_sensor.h
index 2bcf963c04..9e466ff 100644
--- a/services/device/generic_sensor/platform_sensor.h
+++ b/services/device/generic_sensor/platform_sensor.h
@@ -84,7 +84,7 @@
 
   // Updates shared buffer with new sensor reading data.
   // Note: this method is thread-safe.
-  void UpdateSensorReading(const SensorReading& reading, bool notify_clients);
+  void UpdateSensorReading(const SensorReading& reading);
 
   void NotifySensorReadingChanged();
   void NotifySensorError();
diff --git a/services/device/generic_sensor/platform_sensor_accelerometer_mac.cc b/services/device/generic_sensor/platform_sensor_accelerometer_mac.cc
index bc0700e7..2eaa9c9 100644
--- a/services/device/generic_sensor/platform_sensor_accelerometer_mac.cc
+++ b/services/device/generic_sensor/platform_sensor_accelerometer_mac.cc
@@ -98,7 +98,7 @@
 
   if (IsSignificantlyDifferent(reading_, reading)) {
     reading_ = reading;
-    UpdateSensorReading(reading, true);
+    UpdateSensorReading(reading);
   }
 }
 
diff --git a/services/device/generic_sensor/platform_sensor_ambient_light_mac.cc b/services/device/generic_sensor/platform_sensor_ambient_light_mac.cc
index bb9208f..bd44766 100644
--- a/services/device/generic_sensor/platform_sensor_ambient_light_mac.cc
+++ b/services/device/generic_sensor/platform_sensor_ambient_light_mac.cc
@@ -171,7 +171,7 @@
   reading.als.timestamp =
       (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
   reading.als.value = current_lux_;
-  UpdateSensorReading(reading, true);
+  UpdateSensorReading(reading);
   return true;
 }
 
diff --git a/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc b/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc
index 1668e8e..871316c 100644
--- a/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc
+++ b/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc
@@ -35,6 +35,8 @@
 // Zero value can mean whether value is not being not used or zero value.
 constexpr double kZero = 0.0;
 
+constexpr double kAmbientLightFrequencyValue = 10.0;
+
 constexpr double kAccelerometerFrequencyValue = 10.0;
 constexpr double kAccelerometerOffsetValue = 1.0;
 constexpr double kAccelerometerScalingValue = 0.009806;
@@ -655,4 +657,43 @@
               scaling * (sensor_values[2] + kMagnetometerOffsetValue));
 }
 
+// Tests that Ambient Light sensor client's OnSensorReadingChanged() is called
+// when the Ambient Light sensor's reporting mode is
+// mojom::ReportingMode::CONTINUOUS.
+TEST_F(PlatformSensorAndProviderLinuxTest,
+       SensorClientGetReadingChangedNotificationWhenSensorIsInContinuousMode) {
+  mojo::ScopedSharedBufferHandle handle = provider_->CloneSharedBufferHandle();
+  mojo::ScopedSharedBufferMapping mapping = handle->MapAtOffset(
+      sizeof(SensorReadingSharedBuffer),
+      SensorReadingSharedBuffer::GetOffset(SensorType::AMBIENT_LIGHT));
+
+  double sensor_value[3] = {22};
+  // Set a non-zero frequency here and sensor's reporting mode will be
+  // mojom::ReportingMode::CONTINUOUS.
+  InitializeSupportedSensor(SensorType::AMBIENT_LIGHT,
+                            kAmbientLightFrequencyValue, kZero, kZero,
+                            sensor_value);
+
+  InitializeMockUdevMethods(sensors_dir_.GetPath());
+  SetServiceStart();
+
+  auto sensor = CreateSensor(SensorType::AMBIENT_LIGHT);
+  EXPECT_TRUE(sensor);
+  EXPECT_EQ(mojom::ReportingMode::CONTINUOUS, sensor->GetReportingMode());
+
+  auto client = base::MakeUnique<NiceMock<MockPlatformSensorClient>>(sensor);
+
+  PlatformSensorConfiguration configuration(
+      sensor->GetMaximumSupportedFrequency());
+  EXPECT_TRUE(sensor->StartListening(client.get(), configuration));
+
+  WaitOnSensorReadingChangedEvent(client.get(), sensor->GetType());
+
+  EXPECT_TRUE(sensor->StopListening(client.get(), configuration));
+
+  SensorReadingSharedBuffer* buffer =
+      static_cast<SensorReadingSharedBuffer*>(mapping.get());
+  EXPECT_THAT(buffer->reading.als.value, sensor_value[0]);
+}
+
 }  // namespace device
diff --git a/services/device/generic_sensor/platform_sensor_android.cc b/services/device/generic_sensor/platform_sensor_android.cc
index 5c611763..daf4d2e 100644
--- a/services/device/generic_sensor/platform_sensor_android.cc
+++ b/services/device/generic_sensor/platform_sensor_android.cc
@@ -93,8 +93,7 @@
   reading.raw.values[2] = value3;
   reading.raw.values[3] = value4;
 
-  bool needNotify = (GetReportingMode() == mojom::ReportingMode::ON_CHANGE);
-  UpdateSensorReading(reading, needNotify);
+  UpdateSensorReading(reading);
 }
 
 }  // namespace device
diff --git a/services/device/generic_sensor/platform_sensor_fusion.cc b/services/device/generic_sensor/platform_sensor_fusion.cc
index b4d49ab..15b5173 100644
--- a/services/device/generic_sensor/platform_sensor_fusion.cc
+++ b/services/device/generic_sensor/platform_sensor_fusion.cc
@@ -55,17 +55,7 @@
       return false;
   }
 
-  if (GetReportingMode() == mojom::ReportingMode::CONTINUOUS) {
-    timer_.Start(
-        FROM_HERE,
-        base::TimeDelta::FromMicroseconds(base::Time::kMicrosecondsPerSecond /
-                                          configuration.frequency()),
-        base::Bind(&PlatformSensorFusion::OnSensorReadingChanged,
-                   base::Unretained(this), GetType()));
-  }
-
   fusion_algorithm_->SetFrequency(configuration.frequency());
-
   return true;
 }
 
@@ -73,9 +63,6 @@
   for (const auto& sensor : source_sensors_)
     sensor->StopSensor();
 
-  if (timer_.IsRunning())
-    timer_.Stop();
-
   fusion_algorithm_->Reset();
 }
 
@@ -102,8 +89,7 @@
   }
 
   reading_ = reading;
-  UpdateSensorReading(reading_,
-                      GetReportingMode() == mojom::ReportingMode::ON_CHANGE);
+  UpdateSensorReading(reading_);
 }
 
 void PlatformSensorFusion::OnSensorError() {
diff --git a/services/device/generic_sensor/platform_sensor_fusion.h b/services/device/generic_sensor/platform_sensor_fusion.h
index fe9ea8d5..7d3331c 100644
--- a/services/device/generic_sensor/platform_sensor_fusion.h
+++ b/services/device/generic_sensor/platform_sensor_fusion.h
@@ -70,9 +70,6 @@
   SensorReading reading_;
   std::vector<scoped_refptr<PlatformSensor>> source_sensors_;
   std::unique_ptr<PlatformSensorFusionAlgorithm> fusion_algorithm_;
-  // Repeating timer for data polling if all source sensors are CONTINUOUS
-  // reporting mode.
-  base::RepeatingTimer timer_;
   mojom::ReportingMode reporting_mode_;
 
   DISALLOW_COPY_AND_ASSIGN(PlatformSensorFusion);
diff --git a/services/device/generic_sensor/platform_sensor_linux.cc b/services/device/generic_sensor/platform_sensor_linux.cc
index 27907348..f501ba6 100644
--- a/services/device/generic_sensor/platform_sensor_linux.cc
+++ b/services/device/generic_sensor/platform_sensor_linux.cc
@@ -51,16 +51,14 @@
 
 void PlatformSensorLinux::UpdatePlatformSensorReading(SensorReading reading) {
   DCHECK(task_runner_->BelongsToCurrentThread());
-  bool notifyNeeded = false;
-  if (GetReportingMode() == mojom::ReportingMode::ON_CHANGE) {
-    if (!HaveValuesChanged(reading, old_values_))
-      return;
-    notifyNeeded = true;
+  if (GetReportingMode() == mojom::ReportingMode::ON_CHANGE &&
+      !HaveValuesChanged(reading, old_values_)) {
+    return;
   }
   old_values_ = reading;
   reading.raw.timestamp =
       (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
-  UpdateSensorReading(reading, notifyNeeded);
+  UpdateSensorReading(reading);
 }
 
 void PlatformSensorLinux::NotifyPlatformSensorError() {
diff --git a/services/device/generic_sensor/platform_sensor_win.cc b/services/device/generic_sensor/platform_sensor_win.cc
index fd521ddd..48dac1b 100644
--- a/services/device/generic_sensor/platform_sensor_win.cc
+++ b/services/device/generic_sensor/platform_sensor_win.cc
@@ -45,9 +45,7 @@
 }
 
 void PlatformSensorWin::OnReadingUpdated(const SensorReading& reading) {
-  // Default reporting mode is ON_CHANGE, thus, set notify_clients parameter
-  // to true.
-  UpdateSensorReading(reading, true);
+  UpdateSensorReading(reading);
 }
 
 void PlatformSensorWin::OnSensorError() {
diff --git a/services/device/generic_sensor/sensor_impl.cc b/services/device/generic_sensor/sensor_impl.cc
index 97f5800..1b91f12 100644
--- a/services/device/generic_sensor/sensor_impl.cc
+++ b/services/device/generic_sensor/sensor_impl.cc
@@ -60,8 +60,10 @@
 
 void SensorImpl::OnSensorReadingChanged(mojom::SensorType type) {
   DCHECK(!suspended_);
-  if (client_ && reading_notification_enabled_)
+  if (client_ && reading_notification_enabled_ &&
+      sensor_->GetReportingMode() == mojom::ReportingMode::ON_CHANGE) {
     client_->SensorReadingChanged();
+  }
 }
 
 void SensorImpl::OnSensorError() {
diff --git a/services/network/DEPS b/services/network/DEPS
new file mode 100644
index 0000000..8fa9d48
--- /dev/null
+++ b/services/network/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+net",
+]
diff --git a/services/network/public/cpp/BUILD.gn b/services/network/public/cpp/BUILD.gn
new file mode 100644
index 0000000..cc13936
--- /dev/null
+++ b/services/network/public/cpp/BUILD.gn
@@ -0,0 +1,16 @@
+# 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.
+
+static_library("cpp") {
+  sources = [
+    "net_adapters.cc",
+    "net_adapters.h",
+  ]
+
+  deps = [
+    "//base",
+    "//mojo/common",
+    "//net",
+  ]
+}
diff --git a/content/common/net_adapters.cc b/services/network/public/cpp/net_adapters.cc
similarity index 96%
rename from content/common/net_adapters.cc
rename to services/network/public/cpp/net_adapters.cc
index 504f389..da516f2 100644
--- a/content/common/net_adapters.cc
+++ b/services/network/public/cpp/net_adapters.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/common/net_adapters.h"
+#include "services/network/public/cpp/net_adapters.h"
 
 #include "net/base/net_errors.h"
 
-namespace content {
+namespace network {
 
 namespace {
 const uint32_t kMaxBufSize = 64 * 1024;
@@ -99,4 +99,4 @@
   pending_buffer_->CompleteRead(bytes_to_be_read_);
 }
 
-}  // namespace content
+}  // namespace network
diff --git a/content/common/net_adapters.h b/services/network/public/cpp/net_adapters.h
similarity index 95%
rename from content/common/net_adapters.h
rename to services/network/public/cpp/net_adapters.h
index f9955c13..1008a64 100644
--- a/content/common/net_adapters.h
+++ b/services/network/public/cpp/net_adapters.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 CONTENT_COMMON_NET_ADAPTERS_
-#define CONTENT_COMMON_NET_ADAPTERS_
+#ifndef SERVICES_NETWORK_PUBLIC_CPP_NET_ADAPTERS_
+#define SERVICES_NETWORK_PUBLIC_CPP_NET_ADAPTERS_
 
 #include <stdint.h>
 
@@ -11,7 +11,7 @@
 #include "mojo/public/cpp/system/data_pipe.h"
 #include "net/base/io_buffer.h"
 
-namespace content {
+namespace network {
 
 // These adapters are used to transfer data between a Mojo pipe and the net
 // library.
@@ -131,6 +131,6 @@
   int bytes_to_be_read_;
 };
 
-}  // namespace content
+}  // namespace network
 
-#endif  // CONTENT_COMMON_NET_ADAPTERS_
+#endif  // SERVICES_NETWORK_PUBLIC_CPP_NET_ADAPTERS_
diff --git a/services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h b/services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h
index 95d7e2d6..804c8697 100644
--- a/services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h
+++ b/services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h
@@ -4,12 +4,17 @@
 #ifndef SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_MEMORY_INSTRUMENTATION_OS_METRICS_H_
 #define SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_MEMORY_INSTRUMENTATION_OS_METRICS_H_
 
+#include "base/gtest_prod_util.h"
 #include "base/process/process_handle.h"
 #include "base/trace_event/process_memory_dump.h"
 #include "build/build_config.h"
 #include "services/resource_coordinator/public/cpp/resource_coordinator_export.h"
 #include "services/resource_coordinator/public/interfaces/memory_instrumentation/memory_instrumentation.mojom.h"
 
+namespace profiling {
+FORWARD_DECLARE_TEST(ProfilingJsonExporterTest, MemoryMaps);
+};
+
 namespace memory_instrumentation {
 
 class SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_EXPORT OSMetrics {
@@ -21,6 +26,7 @@
   FRIEND_TEST_ALL_PREFIXES(OSMetricsTest, ParseProcSmaps);
   FRIEND_TEST_ALL_PREFIXES(OSMetricsTest, TestWinModuleReading);
   FRIEND_TEST_ALL_PREFIXES(OSMetricsTest, TestMachOReading);
+  FRIEND_TEST_ALL_PREFIXES(profiling::ProfilingJsonExporterTest, MemoryMaps);
   static std::vector<mojom::VmRegionPtr> GetProcessMemoryMaps(base::ProcessId);
 
 #if defined(OS_LINUX) || defined(OS_ANDROID)
diff --git a/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.cc b/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.cc
index aadb8a7..74941237 100644
--- a/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.cc
+++ b/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.cc
@@ -37,48 +37,6 @@
       base::StringPrintf("%" PRIx32, os_dump.private_footprint_kb * 1024));
 }
 
-void MemoryMapsAsValueInto(TracedValue* value,
-                           const std::vector<mojom::VmRegionPtr>& memory_maps) {
-  static const char kHexFmt[] = "%" PRIx64;
-
-  // Refer to the design doc goo.gl/sxfFY8 for the semantics of these fields.
-  value->BeginArray("vm_regions");
-  for (const auto& region : memory_maps) {
-    value->BeginDictionary();
-
-    value->SetString("sa", base::StringPrintf(kHexFmt, region->start_address));
-    value->SetString("sz", base::StringPrintf(kHexFmt, region->size_in_bytes));
-    if (region->module_timestamp)
-      value->SetString("ts",
-                       base::StringPrintf(kHexFmt, region->module_timestamp));
-    value->SetInteger("pf", region->protection_flags);
-    value->SetString("mf", region->mapped_file);
-
-    value->BeginDictionary("bs");  // byte stats
-    value->SetString(
-        "pss",
-        base::StringPrintf(kHexFmt, region->byte_stats_proportional_resident));
-    value->SetString(
-        "pd",
-        base::StringPrintf(kHexFmt, region->byte_stats_private_dirty_resident));
-    value->SetString(
-        "pc",
-        base::StringPrintf(kHexFmt, region->byte_stats_private_clean_resident));
-    value->SetString(
-        "sd",
-        base::StringPrintf(kHexFmt, region->byte_stats_shared_dirty_resident));
-    value->SetString(
-        "sc",
-        base::StringPrintf(kHexFmt, region->byte_stats_shared_clean_resident));
-    value->SetString("sw",
-                     base::StringPrintf(kHexFmt, region->byte_stats_swapped));
-    value->EndDictionary();
-
-    value->EndDictionary();
-  }
-  value->EndArray();
-}
-
 };  // namespace
 
 TracingObserver::TracingObserver(
@@ -202,7 +160,7 @@
 
   if (memory_maps->size()) {
     traced_value->BeginDictionary("process_mmaps");
-    MemoryMapsAsValueInto(traced_value.get(), *memory_maps);
+    MemoryMapsAsValueInto(*memory_maps, traced_value.get());
     traced_value->EndDictionary();
   }
 
@@ -210,6 +168,50 @@
   return true;
 }
 
+// static
+void TracingObserver::MemoryMapsAsValueInto(
+    const std::vector<mojom::VmRegionPtr>& memory_maps,
+    TracedValue* value) {
+  static const char kHexFmt[] = "%" PRIx64;
+
+  // Refer to the design doc goo.gl/sxfFY8 for the semantics of these fields.
+  value->BeginArray("vm_regions");
+  for (const auto& region : memory_maps) {
+    value->BeginDictionary();
+
+    value->SetString("sa", base::StringPrintf(kHexFmt, region->start_address));
+    value->SetString("sz", base::StringPrintf(kHexFmt, region->size_in_bytes));
+    if (region->module_timestamp)
+      value->SetString("ts",
+                       base::StringPrintf(kHexFmt, region->module_timestamp));
+    value->SetInteger("pf", region->protection_flags);
+    value->SetString("mf", region->mapped_file);
+
+    value->BeginDictionary("bs");  // byte stats
+    value->SetString(
+        "pss",
+        base::StringPrintf(kHexFmt, region->byte_stats_proportional_resident));
+    value->SetString(
+        "pd",
+        base::StringPrintf(kHexFmt, region->byte_stats_private_dirty_resident));
+    value->SetString(
+        "pc",
+        base::StringPrintf(kHexFmt, region->byte_stats_private_clean_resident));
+    value->SetString(
+        "sd",
+        base::StringPrintf(kHexFmt, region->byte_stats_shared_dirty_resident));
+    value->SetString(
+        "sc",
+        base::StringPrintf(kHexFmt, region->byte_stats_shared_clean_resident));
+    value->SetString("sw",
+                     base::StringPrintf(kHexFmt, region->byte_stats_swapped));
+    value->EndDictionary();
+
+    value->EndDictionary();
+  }
+  value->EndArray();
+}
+
 bool TracingObserver::IsDumpModeAllowed(
     base::trace_event::MemoryDumpLevelOfDetail dump_mode) const {
   if (!memory_dump_config_)
diff --git a/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.h b/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.h
index 1533365..b21866f 100644
--- a/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.h
+++ b/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.h
@@ -36,6 +36,10 @@
       const mojom::OSMemDump*,
       const std::vector<mojom::VmRegionPtr>*);
 
+  static void MemoryMapsAsValueInto(
+      const std::vector<mojom::VmRegionPtr>& memory_maps,
+      base::trace_event::TracedValue* value);
+
  private:
   // Returns true if the dump mode is allowed for current tracing session.
   bool IsDumpModeAllowed(base::trace_event::MemoryDumpLevelOfDetail) const;
diff --git a/services/service_manager/embedder/BUILD.gn b/services/service_manager/embedder/BUILD.gn
index 126bb9a..6511fc7 100644
--- a/services/service_manager/embedder/BUILD.gn
+++ b/services/service_manager/embedder/BUILD.gn
@@ -15,6 +15,7 @@
     "embedded_service_info.cc",
     "embedded_service_runner.cc",
     "manifest_utils.cc",
+    "service_manager_embedder_export.h",
   ]
 
   # iOS embeds the Service Manager but does not use service_manager::Main() (and
@@ -32,7 +33,6 @@
     sources += [
       "main.cc",
       "main_delegate.cc",
-      "service_manager_embedder_export.h",
       "set_process_title.cc",
       "set_process_title_linux.cc",
       "shared_file_util.cc",
@@ -82,12 +82,22 @@
   testonly = true
 
   sources = [
+    "embedded_instance_manager_unittest.cc",
     "manifest_utils_unittest.cc",
   ]
 
+  # These headers are duplicated here so that they can remain private in the
+  # "embedder" target. See http://crbug.com/732993 for a way to make it
+  # unnecessary to do this.
+  sources += [
+    "embedded_instance_manager.h",
+    "service_manager_embedder_export.h",
+  ]
+
   deps = [
     ":embedder",
     "//base",
+    "//base/test:test_support",
     "//testing/gtest",
   ]
 }
diff --git a/services/service_manager/embedder/embedded_instance_manager.cc b/services/service_manager/embedder/embedded_instance_manager.cc
index b5c41048..16d2b7e 100644
--- a/services/service_manager/embedder/embedded_instance_manager.cc
+++ b/services/service_manager/embedder/embedded_instance_manager.cc
@@ -61,6 +61,7 @@
         FROM_HERE,
         base::Bind(&EmbeddedInstanceManager::QuitOnServiceSequence, this));
   }
+  thread_.reset();
 }
 
 EmbeddedInstanceManager::~EmbeddedInstanceManager() {
diff --git a/services/service_manager/embedder/embedded_instance_manager.h b/services/service_manager/embedder/embedded_instance_manager.h
index 4a9519d..c1755a66 100644
--- a/services/service_manager/embedder/embedded_instance_manager.h
+++ b/services/service_manager/embedder/embedded_instance_manager.h
@@ -29,6 +29,8 @@
 
 namespace service_manager {
 
+class EmbeddedInstanceManagerTestApi;
+
 // EmbeddedInstanceManager is an implementation detail of EmbeddedServiceRunner.
 // Outside of tests there is no need to use it directly.
 class SERVICE_MANAGER_EMBEDDER_EXPORT EmbeddedInstanceManager
@@ -44,6 +46,7 @@
 
  private:
   friend class base::RefCountedThreadSafe<EmbeddedInstanceManager>;
+  friend class EmbeddedInstanceManagerTestApi;
 
   ~EmbeddedInstanceManager();
 
diff --git a/services/service_manager/embedder/embedded_instance_manager_unittest.cc b/services/service_manager/embedder/embedded_instance_manager_unittest.cc
new file mode 100644
index 0000000..dc011ed
--- /dev/null
+++ b/services/service_manager/embedder/embedded_instance_manager_unittest.cc
@@ -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 "services/service_manager/embedder/embedded_instance_manager.h"
+
+#include <memory>
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/memory/ptr_util.h"
+#include "base/single_thread_task_runner.h"
+#include "base/test/scoped_task_environment.h"
+#include "base/threading/thread.h"
+#include "services/service_manager/embedder/embedded_service_info.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace service_manager {
+namespace {
+
+void OnQuit(bool* quit_called) {
+  *quit_called = true;
+}
+
+std::unique_ptr<Service> CreateTestService() {
+  return base::MakeUnique<Service>();
+}
+
+}  // namespace
+
+class EmbeddedInstanceManagerTestApi {
+ public:
+  EmbeddedInstanceManagerTestApi(EmbeddedInstanceManager* instance)
+      : instance_(instance) {}
+
+  base::Thread* GetThread() { return instance_->thread_.get(); }
+
+ private:
+  EmbeddedInstanceManager* instance_;
+
+  DISALLOW_COPY_AND_ASSIGN(EmbeddedInstanceManagerTestApi);
+};
+
+TEST(EmbeddedInstanceManager, ShutdownWaitsForThreadToQuit) {
+  base::test::ScopedTaskEnvironment scoped_task_environment;
+  EmbeddedServiceInfo embedded_service_info;
+  embedded_service_info.use_own_thread = true;
+  embedded_service_info.factory = base::Bind(&CreateTestService);
+  bool quit_called = false;
+  scoped_refptr<EmbeddedInstanceManager> instance_manager =
+      new EmbeddedInstanceManager("test", embedded_service_info,
+                                  base::Bind(&OnQuit, &quit_called));
+  instance_manager->BindServiceRequest(nullptr);
+  EmbeddedInstanceManagerTestApi test_api(instance_manager.get());
+  ASSERT_TRUE(test_api.GetThread());
+  scoped_refptr<base::SingleThreadTaskRunner> thread_task_runner =
+      test_api.GetThread()->task_runner();
+  instance_manager->ShutDown();
+  EXPECT_FALSE(test_api.GetThread());
+  // Further verification the thread was shutdown.
+  EXPECT_FALSE(
+      thread_task_runner->PostTask(FROM_HERE, base::Bind(&base::DoNothing)));
+  // Because Shutdown() was explicitly called with the thread running the
+  // quit closure should not have run.
+  EXPECT_FALSE(quit_called);
+}
+
+}  // namespace service_manager
diff --git a/services/service_manager/public/cpp/test/BUILD.gn b/services/service_manager/public/cpp/test/BUILD.gn
index ee7880c..3d231b2 100644
--- a/services/service_manager/public/cpp/test/BUILD.gn
+++ b/services/service_manager/public/cpp/test/BUILD.gn
@@ -46,3 +46,20 @@
     "//base/test:test_support",
   ]
 }
+
+source_set("test_support") {
+  sources = [
+    "test_connector_factory.cc",
+    "test_connector_factory.h",
+  ]
+
+  public_deps = [
+    "//base",
+    "//services/service_manager/public/cpp",
+    "//services/service_manager/public/interfaces",
+  ]
+
+  deps = [
+    "//mojo/public/cpp/bindings",
+  ]
+}
diff --git a/services/service_manager/public/cpp/test/test_connector_factory.cc b/services/service_manager/public/cpp/test/test_connector_factory.cc
new file mode 100644
index 0000000..6d3e2b8e
--- /dev/null
+++ b/services/service_manager/public/cpp/test/test_connector_factory.cc
@@ -0,0 +1,79 @@
+// 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 "services/service_manager/public/cpp/test/test_connector_factory.h"
+
+#include "base/macros.h"
+#include "mojo/public/cpp/bindings/binding_set.h"
+#include "services/service_manager/public/cpp/service.h"
+#include "services/service_manager/public/interfaces/connector.mojom.h"
+
+namespace service_manager {
+
+namespace {
+
+class TestConnectorImpl : public mojom::Connector {
+ public:
+  TestConnectorImpl(TestConnectorFactory* factory, Service* service)
+      : factory_(factory), service_(service) {}
+
+  ~TestConnectorImpl() override = default;
+
+  void BindInterface(const Identity& target,
+                     const std::string& interface_name,
+                     mojo::ScopedMessagePipeHandle interface_pipe,
+                     BindInterfaceCallback callback) override {
+    service_->OnBindInterface(
+        BindSourceInfo(factory_->source_identity(), CapabilitySet()),
+        interface_name, std::move(interface_pipe));
+    std::move(callback).Run(mojom::ConnectResult::SUCCEEDED, Identity());
+  }
+
+  void StartService(const Identity& target,
+                    StartServiceCallback callback) override {
+    NOTREACHED();
+  }
+
+  void StartServiceWithProcess(
+      const Identity& identity,
+      mojo::ScopedMessagePipeHandle service,
+      mojom::PIDReceiverRequest pid_receiver_request,
+      StartServiceWithProcessCallback callback) override {
+    NOTREACHED();
+  }
+
+  void Clone(mojom::ConnectorRequest request) override {
+    bindings_.AddBinding(this, std::move(request));
+  }
+
+  void FilterInterfaces(const std::string& spec,
+                        const Identity& source,
+                        mojom::InterfaceProviderRequest source_request,
+                        mojom::InterfaceProviderPtr target) override {
+    NOTREACHED();
+  }
+
+ private:
+  TestConnectorFactory* const factory_;
+  Service* const service_;
+  mojo::BindingSet<mojom::Connector> bindings_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestConnectorImpl);
+};
+
+}  // namespace
+
+TestConnectorFactory::TestConnectorFactory(Service* service)
+    : source_identity_("TestConnectorFactory"),
+      impl_(base::MakeUnique<TestConnectorImpl>(this, service)) {}
+
+TestConnectorFactory::~TestConnectorFactory() = default;
+
+std::unique_ptr<Connector> TestConnectorFactory::CreateConnector() {
+  mojom::ConnectorPtr proxy;
+  impl_->Clone(mojo::MakeRequest(&proxy));
+  return base::MakeUnique<Connector>(std::move(proxy));
+}
+
+}  // namespace service_manager
diff --git a/services/service_manager/public/cpp/test/test_connector_factory.h b/services/service_manager/public/cpp/test/test_connector_factory.h
new file mode 100644
index 0000000..6573893
--- /dev/null
+++ b/services/service_manager/public/cpp/test/test_connector_factory.h
@@ -0,0 +1,71 @@
+// 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 SERVICES_SERVICE_MANAGER_PUBLIC_CPP_TEST_TEST_CONNECTOR_FACTORY_H_
+#define SERVICES_SERVICE_MANAGER_PUBLIC_CPP_TEST_TEST_CONNECTOR_FACTORY_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "services/service_manager/public/cpp/connector.h"
+#include "services/service_manager/public/interfaces/connector.mojom.h"
+
+namespace service_manager {
+
+class Service;
+
+// Creates Connector instances which route BindInterface requests directly to
+// a given Service implementation. Useful for testing production code which is
+// parameterized over a Connector, while bypassing all the Service Manager
+// machinery. Typical usage should look something like:
+//
+//     TEST(MyTest, Foo) {
+//       MyServiceImpl impl;  // Your implementation of service_manager::Service
+//       TestConnectorFactory connector_factory(&impl);
+//       std::unique_ptr<service_manager::Connector> connector =
+//           connector_factory.CreateConnector();
+//       RunSomeClientCode(connector.get());
+//     }
+//
+// Where |RunSomeClientCode()| would typically be some production code that
+// expects a functioning Connector and uses it to connect to the service you're
+// testing.
+//
+// Note that Connectors created by this factory ignore the target service name
+// in BindInterface calls: interface requests are always routed to a single
+// target Service instance.
+class TestConnectorFactory {
+ public:
+  // Constructs a new TestConnectorFactory which creates Connectors whose
+  // requests are routed directly to |service|. |service| is not owned and must
+  // outlive this TestConnectorFactory instance.
+  explicit TestConnectorFactory(Service* service);
+  ~TestConnectorFactory();
+
+  // Allows a test to override the default Identity seen by the target service
+  // when it receives OnBindInterface requests from this factory's Connectors.
+  //
+  // This is useful if a Service implementation cares about the source identity
+  // services making incoming interface requests. Otherwise it can be ignored.
+  void set_source_identity(const Identity& identity) {
+    source_identity_ = identity;
+  }
+
+  const Identity& source_identity() const { return source_identity_; }
+
+  // Creates a new connector which routes BindInterfaces requests directly to
+  // the Service instance associated with this factory.
+  std::unique_ptr<Connector> CreateConnector();
+
+ private:
+  Identity source_identity_;
+
+  std::unique_ptr<mojom::Connector> impl_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestConnectorFactory);
+};
+
+}  // namespace service_manager
+
+#endif  // SERVICES_SERVICE_MANAGER_PUBLIC_CPP_TEST_TEST_CONNECTOR_FACTORY_H_
diff --git a/services/service_manager/tests/BUILD.gn b/services/service_manager/tests/BUILD.gn
index ebd0dcdc..9a3ea075 100644
--- a/services/service_manager/tests/BUILD.gn
+++ b/services/service_manager/tests/BUILD.gn
@@ -18,6 +18,10 @@
 service_test("service_manager_unittests") {
   catalog = ":service_manager_unittests_catalog"
 
+  sources = [
+    "test_support_unittest.cc",
+  ]
+
   deps = [
     ":interfaces",
     "//base",
@@ -32,6 +36,7 @@
     "//services/service_manager/background/tests:unittests",
     "//services/service_manager/embedder:unittests",
     "//services/service_manager/public/cpp",
+    "//services/service_manager/public/cpp/test:test_support",
     "//services/service_manager/public/interfaces",
     "//services/service_manager/runner/host:unittests",
     "//services/service_manager/tests/connect",
diff --git a/services/service_manager/tests/test_support_unittest.cc b/services/service_manager/tests/test_support_unittest.cc
new file mode 100644
index 0000000..add4038
--- /dev/null
+++ b/services/service_manager/tests/test_support_unittest.cc
@@ -0,0 +1,108 @@
+// 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 "base/bind.h"
+#include "base/callback.h"
+#include "base/macros.h"
+#include "base/run_loop.h"
+#include "base/test/scoped_task_environment.h"
+#include "mojo/public/cpp/bindings/binding_set.h"
+#include "services/service_manager/public/cpp/connector.h"
+#include "services/service_manager/public/cpp/service.h"
+#include "services/service_manager/public/cpp/test/test_connector_factory.h"
+#include "services/service_manager/tests/test.mojom.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace service_manager {
+
+namespace {
+
+// This is a test service used to demonstrate usage of TestConnectorFactory.
+// See documentation on TestConnectorFactory for more details about usage.
+class TestServiceImpl : public Service {
+ public:
+  using OnBindInterfaceCallback = base::Callback<void(const Identity&)>;
+
+  TestServiceImpl() = default;
+  ~TestServiceImpl() override = default;
+
+  void set_on_bind_interface_callback(const OnBindInterfaceCallback& callback) {
+    on_bind_interface_callback_ = callback;
+  }
+
+  // Service:
+  void OnBindInterface(const BindSourceInfo& source_info,
+                       const std::string& interface_name,
+                       mojo::ScopedMessagePipeHandle interface_pipe) override {
+    if (interface_name == TestC::Name_)
+      c_bindings_.AddBinding(&c_impl_, TestCRequest(std::move(interface_pipe)));
+
+    if (on_bind_interface_callback_)
+      on_bind_interface_callback_.Run(source_info.identity);
+  }
+
+ private:
+  // A simple test interface on the service, which can be pinged by test code
+  // to verify a working service connection.
+  class TestCImpl : public TestC {
+   public:
+    TestCImpl() = default;
+    ~TestCImpl() override = default;
+
+    // TestC:
+    void C(CCallback callback) override { std::move(callback).Run(); }
+
+   private:
+    DISALLOW_COPY_AND_ASSIGN(TestCImpl);
+  };
+
+  TestCImpl c_impl_;
+  mojo::BindingSet<TestC> c_bindings_;
+  OnBindInterfaceCallback on_bind_interface_callback_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestServiceImpl);
+};
+
+}  // namespace
+
+TEST(ServiceManagerTestSupport, TestConnectorFactory) {
+  base::test::ScopedTaskEnvironment task_environment;
+
+  TestServiceImpl service;
+  TestConnectorFactory factory(&service);
+  std::unique_ptr<Connector> connector = factory.CreateConnector();
+
+  TestCPtr c;
+  connector->BindInterface("ignored", &c);
+
+  base::RunLoop loop;
+  c->C(loop.QuitClosure());
+  loop.Run();
+}
+
+TEST(ServiceManagerTestSupport, TestConnectorFactoryOverrideSourceIdentity) {
+  base::test::ScopedTaskEnvironment task_environment;
+
+  TestServiceImpl service;
+
+  static const std::string kTestSourceIdentity = "worst. service. ever.";
+  TestConnectorFactory factory(&service);
+  factory.set_source_identity(Identity(kTestSourceIdentity));
+  std::unique_ptr<Connector> connector = factory.CreateConnector();
+
+  // Verify that the test service sees our overridden source identity.
+  service.set_on_bind_interface_callback(
+      base::Bind([](const Identity& source_identity) {
+        EXPECT_EQ(kTestSourceIdentity, source_identity.name());
+      }));
+
+  TestCPtr c;
+  connector->BindInterface("ignored", &c);
+
+  base::RunLoop loop;
+  c->C(loop.QuitClosure());
+  loop.Run();
+}
+
+}  // namespace service_manager
diff --git a/services/ui/public/interfaces/ime/ime.mojom b/services/ui/public/interfaces/ime/ime.mojom
index 8251ac6..e9383ea5 100644
--- a/services/ui/public/interfaces/ime/ime.mojom
+++ b/services/ui/public/interfaces/ime/ime.mojom
@@ -57,8 +57,8 @@
 };
 
 // Represents an underlined segment of text currently composed by IME.
-// Corresponds to ui::CompositionUnderline.
-struct CompositionUnderline {
+// Corresponds to ui::ImeTextSpan.
+struct ImeTextSpan {
   uint32 start_offset;
   uint32 end_offset;
   bool thick;
@@ -70,7 +70,7 @@
 // ui::CompositionText.
 struct CompositionText {
   string text;
-  array<CompositionUnderline> underlines;
+  array<ImeTextSpan> ime_text_spans;
   gfx.mojom.Range selection;
 };
 
@@ -167,7 +167,7 @@
   // Sets composition text and attributes. See comments for
   // ui::TextInputClient::SetCompositionText() for more details.
   SetCompositionText(CompositionText composition);
-  
+
   // Converts current composition text into final content.
   ConfirmCompositionText();
 
diff --git a/services/ui/public/interfaces/ime/ime.typemap b/services/ui/public/interfaces/ime/ime.typemap
index 0327e43..51ee8a4 100644
--- a/services/ui/public/interfaces/ime/ime.typemap
+++ b/services/ui/public/interfaces/ime/ime.typemap
@@ -6,7 +6,7 @@
 public_headers = [
   "//ui/base/ime/candidate_window.h",
   "//ui/base/ime/composition_text.h",
-  "//ui/base/ime/composition_underline.h",
+  "//ui/base/ime/ime_text_span.h",
   "//ui/base/ime/text_input_mode.h",
   "//ui/base/ime/text_input_type.h",
 ]
@@ -25,7 +25,7 @@
   "ui.mojom.CandidateWindowEntry=ui::CandidateWindow::Entry",
   "ui.mojom.CandidateWindowProperties=ui::CandidateWindow::CandidateWindowProperty",
   "ui.mojom.CompositionText=ui::CompositionText",
-  "ui.mojom.CompositionUnderline=ui::CompositionUnderline",
+  "ui.mojom.ImeTextSpan=ui::ImeTextSpan",
   "ui.mojom.TextInputMode=ui::TextInputMode",
   "ui.mojom.TextInputType=ui::TextInputType",
 ]
diff --git a/services/ui/public/interfaces/ime/ime_struct_traits.cc b/services/ui/public/interfaces/ime/ime_struct_traits.cc
index a184652..1e729dd 100644
--- a/services/ui/public/interfaces/ime/ime_struct_traits.cc
+++ b/services/ui/public/interfaces/ime/ime_struct_traits.cc
@@ -40,10 +40,9 @@
 }
 
 // static
-bool StructTraits<ui::mojom::CompositionUnderlineDataView,
-                  ui::CompositionUnderline>::
-    Read(ui::mojom::CompositionUnderlineDataView data,
-         ui::CompositionUnderline* out) {
+bool StructTraits<ui::mojom::ImeTextSpanDataView, ui::ImeTextSpan>::Read(
+    ui::mojom::ImeTextSpanDataView data,
+    ui::ImeTextSpan* out) {
   if (data.is_null())
     return false;
   out->start_offset = data.start_offset();
@@ -58,7 +57,7 @@
 bool StructTraits<ui::mojom::CompositionTextDataView, ui::CompositionText>::
     Read(ui::mojom::CompositionTextDataView data, ui::CompositionText* out) {
   return !data.is_null() && data.ReadText(&out->text) &&
-         data.ReadUnderlines(&out->underlines) &&
+         data.ReadImeTextSpans(&out->ime_text_spans) &&
          data.ReadSelection(&out->selection);
 }
 
diff --git a/services/ui/public/interfaces/ime/ime_struct_traits.h b/services/ui/public/interfaces/ime/ime_struct_traits.h
index 616f3f2..100d1c4 100644
--- a/services/ui/public/interfaces/ime/ime_struct_traits.h
+++ b/services/ui/public/interfaces/ime/ime_struct_traits.h
@@ -9,7 +9,7 @@
 #include "services/ui/public/interfaces/ime/ime.mojom-shared.h"
 #include "ui/base/ime/candidate_window.h"
 #include "ui/base/ime/composition_text.h"
-#include "ui/base/ime/composition_underline.h"
+#include "ui/base/ime/ime_text_span.h"
 #include "ui/base/ime/text_input_mode.h"
 #include "ui/base/ime/text_input_type.h"
 
@@ -74,30 +74,12 @@
 };
 
 template <>
-struct StructTraits<ui::mojom::CompositionUnderlineDataView,
-                    ui::CompositionUnderline> {
-  static uint32_t start_offset(const ui::CompositionUnderline& c) {
-    return c.start_offset;
-  }
-  static uint32_t end_offset(const ui::CompositionUnderline& c) {
-    return c.end_offset;
-  }
-  static uint32_t color(const ui::CompositionUnderline& c) { return c.color; }
-  static uint32_t thick(const ui::CompositionUnderline& c) { return c.thick; }
-  static uint32_t background_color(const ui::CompositionUnderline& c) {
-    return c.background_color;
-  }
-  static bool Read(ui::mojom::CompositionUnderlineDataView data,
-                   ui::CompositionUnderline* out);
-};
-
-template <>
 struct StructTraits<ui::mojom::CompositionTextDataView, ui::CompositionText> {
   static std::string text(const ui::CompositionText& c) {
     return base::UTF16ToUTF8(c.text);
   }
-  static ui::CompositionUnderlines underlines(const ui::CompositionText& c) {
-    return c.underlines;
+  static ui::ImeTextSpans ime_text_spans(const ui::CompositionText& c) {
+    return c.ime_text_spans;
   }
   static gfx::Range selection(const ui::CompositionText& c) {
     return c.selection;
@@ -107,6 +89,20 @@
 };
 
 template <>
+struct StructTraits<ui::mojom::ImeTextSpanDataView, ui::ImeTextSpan> {
+  static uint32_t start_offset(const ui::ImeTextSpan& c) {
+    return c.start_offset;
+  }
+  static uint32_t end_offset(const ui::ImeTextSpan& c) { return c.end_offset; }
+  static uint32_t color(const ui::ImeTextSpan& c) { return c.color; }
+  static uint32_t thick(const ui::ImeTextSpan& c) { return c.thick; }
+  static uint32_t background_color(const ui::ImeTextSpan& c) {
+    return c.background_color;
+  }
+  static bool Read(ui::mojom::ImeTextSpanDataView data, ui::ImeTextSpan* out);
+};
+
+template <>
 struct EnumTraits<ui::mojom::TextInputMode, ui::TextInputMode> {
   static ui::mojom::TextInputMode ToMojom(ui::TextInputMode text_input_mode);
   static bool FromMojom(ui::mojom::TextInputMode input, ui::TextInputMode* out);
diff --git a/services/ui/public/interfaces/ime/ime_struct_traits_unittest.cc b/services/ui/public/interfaces/ime/ime_struct_traits_unittest.cc
index cfaec6f8..c718f82 100644
--- a/services/ui/public/interfaces/ime/ime_struct_traits_unittest.cc
+++ b/services/ui/public/interfaces/ime/ime_struct_traits_unittest.cc
@@ -12,7 +12,7 @@
 #include "services/ui/public/interfaces/ime/ime_struct_traits_test.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/ime/composition_text.h"
-#include "ui/base/ime/composition_underline.h"
+#include "ui/base/ime/ime_text_span.h"
 #include "ui/gfx/range/mojo/range_struct_traits.h"
 
 namespace ui {
@@ -110,9 +110,9 @@
 TEST_F(IMEStructTraitsTest, CompositionText) {
   CompositionText input;
   input.text = base::UTF8ToUTF16("abcdefghij");
-  input.underlines.push_back(CompositionUnderline(0, 2, SK_ColorGRAY, false));
-  input.underlines.push_back(
-      CompositionUnderline(3, 6, SK_ColorRED, true, SK_ColorGREEN));
+  input.ime_text_spans.push_back(ImeTextSpan(0, 2, SK_ColorGRAY, false));
+  input.ime_text_spans.push_back(
+      ImeTextSpan(3, 6, SK_ColorRED, true, SK_ColorGREEN));
   input.selection = gfx::Range(1, 7);
 
   CompositionText output;
diff --git a/services/ui/ws/BUILD.gn b/services/ui/ws/BUILD.gn
index c6a9073..60ccaffcc 100644
--- a/services/ui/ws/BUILD.gn
+++ b/services/ui/ws/BUILD.gn
@@ -125,7 +125,6 @@
 
   deps = [
     "//components/viz/host",
-    "//components/viz/host/hit_test",
     "//gpu/command_buffer/client",
     "//gpu/command_buffer/client:gles2_interface",
     "//gpu/ipc/client",
diff --git a/services/viz/public/interfaces/compositing/BUILD.gn b/services/viz/public/interfaces/compositing/BUILD.gn
index e9c3bf6..c157364 100644
--- a/services/viz/public/interfaces/compositing/BUILD.gn
+++ b/services/viz/public/interfaces/compositing/BUILD.gn
@@ -12,6 +12,7 @@
     "render_pass.mojom",
     "resource_settings.mojom",
     "returned_resource.mojom",
+    "shared_bitmap_allocation_notifier.mojom",
     "surface_info.mojom",
     "surface_sequence.mojom",
   ]
diff --git a/cc/ipc/shared_bitmap_allocation_notifier.mojom b/services/viz/public/interfaces/compositing/shared_bitmap_allocation_notifier.mojom
similarity index 96%
rename from cc/ipc/shared_bitmap_allocation_notifier.mojom
rename to services/viz/public/interfaces/compositing/shared_bitmap_allocation_notifier.mojom
index a10eff2..d8017cd 100644
--- a/cc/ipc/shared_bitmap_allocation_notifier.mojom
+++ b/services/viz/public/interfaces/compositing/shared_bitmap_allocation_notifier.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 cc.mojom;
+module viz.mojom;
 
 import "gpu/ipc/common/mailbox.mojom";
 
diff --git a/services/viz/public/interfaces/hit_test/hit_test_region_list.mojom b/services/viz/public/interfaces/hit_test/hit_test_region_list.mojom
index ff251be..f368cd08 100644
--- a/services/viz/public/interfaces/hit_test/hit_test_region_list.mojom
+++ b/services/viz/public/interfaces/hit_test/hit_test_region_list.mojom
@@ -45,9 +45,6 @@
 };
 
 struct HitTestRegionList {
-  // SurfaceId corresponding to this HitTestData.
-  cc.mojom.SurfaceId surface_id;
-
   // Flags indicate how to handle events that match no sub-regions.
   // kHitTestMine routes un-matched events to this surface (opaque).
   // kHitTestIgnore keeps previous match in the parent (transparent).
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h
index 675126e..e734274 100644
--- a/skia/config/SkUserConfig.h
+++ b/skia/config/SkUserConfig.h
@@ -220,8 +220,8 @@
 #define SK_SUPPORT_LEGACY_DELTA_AA
 #endif
 
-#ifndef SK_SUPPORT_LEGACY_ROTATED_SHADERS
-#define SK_SUPPORT_LEGACY_ROTATED_SHADERS
+#ifndef SK_SUPPORT_LEGACY_RP_BLENDS
+#define SK_SUPPORT_LEGACY_RP_BLENDS
 #endif
 
 ///////////////////////// Imported from BUILD.gn and skia_common.gypi
diff --git a/storage/DEPS b/storage/DEPS
index 5d45d0bc..c4e59ed 100644
--- a/storage/DEPS
+++ b/storage/DEPS
@@ -1,6 +1,7 @@
 include_rules = [
   "+mojo",
   "+net",
+  "+services/network/public/cpp",
   "+sql",
   "+third_party/leveldatabase",
   "+third_party/sqlite",
diff --git a/storage/browser/BUILD.gn b/storage/browser/BUILD.gn
index b5f8a15..a64d797f 100644
--- a/storage/browser/BUILD.gn
+++ b/storage/browser/BUILD.gn
@@ -38,6 +38,8 @@
     "blob/blob_url_request_job.h",
     "blob/blob_url_request_job_factory.cc",
     "blob/blob_url_request_job_factory.h",
+    "blob/mojo_blob_reader.cc",
+    "blob/mojo_blob_reader.h",
     "blob/scoped_file.cc",
     "blob/scoped_file.h",
     "blob/shareable_blob_data_item.cc",
@@ -207,6 +209,7 @@
     "//base:i18n",
     "//base/third_party/dynamic_annotations",
     "//net",
+    "//services/network/public/cpp",
     "//sql",
     "//third_party/leveldatabase",
     "//third_party/sqlite",
@@ -293,6 +296,7 @@
     ":browser",
     ":test_support",
     "//base/test:test_support",
+    "//mojo/common",
     "//mojo/edk/system",
     "//net:test_support",
     "//sql:test_support",
diff --git a/storage/browser/blob/blob_impl.cc b/storage/browser/blob/blob_impl.cc
index ab41aba..6db0007 100644
--- a/storage/browser/blob/blob_impl.cc
+++ b/storage/browser/blob/blob_impl.cc
@@ -4,9 +4,42 @@
 
 #include "storage/browser/blob/blob_impl.h"
 
+#include <utility>
 #include "storage/browser/blob/blob_data_handle.h"
+#include "storage/browser/blob/mojo_blob_reader.h"
 
 namespace storage {
+namespace {
+
+class ReaderDelegate : public MojoBlobReader::Delegate {
+ public:
+  ReaderDelegate(mojo::ScopedDataPipeProducerHandle handle,
+                 mojom::BlobReaderClientPtr client)
+      : handle_(std::move(handle)), client_(std::move(client)) {}
+
+  mojo::ScopedDataPipeProducerHandle PassDataPipe() override {
+    return std::move(handle_);
+  }
+
+  MojoBlobReader::Delegate::RequestSideData DidCalculateSize(
+      uint64_t total_size,
+      uint64_t content_size) override {
+    if (client_)
+      client_->OnCalculatedSize(total_size, content_size);
+    return MojoBlobReader::Delegate::DONT_REQUEST_SIDE_DATA;
+  }
+
+  void OnComplete(net::Error result, uint64_t total_written_bytes) override {
+    if (client_)
+      client_->OnComplete(result, total_written_bytes);
+  }
+
+ private:
+  mojo::ScopedDataPipeProducerHandle handle_;
+  mojom::BlobReaderClientPtr client_;
+};
+
+}  // namespace
 
 // static
 base::WeakPtr<BlobImpl> BlobImpl::Create(std::unique_ptr<BlobDataHandle> handle,
@@ -19,6 +52,23 @@
   bindings_.AddBinding(this, std::move(request));
 }
 
+void BlobImpl::ReadRange(uint64_t offset,
+                         uint64_t length,
+                         mojo::ScopedDataPipeProducerHandle handle,
+                         mojom::BlobReaderClientPtr client) {
+  MojoBlobReader::Create(
+      nullptr, handle_.get(),
+      net::HttpByteRange::Bounded(offset, offset + length - 1),
+      base::MakeUnique<ReaderDelegate>(std::move(handle), std::move(client)));
+}
+
+void BlobImpl::ReadAll(mojo::ScopedDataPipeProducerHandle handle,
+                       mojom::BlobReaderClientPtr client) {
+  MojoBlobReader::Create(
+      nullptr, handle_.get(), net::HttpByteRange(),
+      base::MakeUnique<ReaderDelegate>(std::move(handle), std::move(client)));
+}
+
 void BlobImpl::GetInternalUUID(GetInternalUUIDCallback callback) {
   std::move(callback).Run(handle_->uuid());
 }
diff --git a/storage/browser/blob/blob_impl.h b/storage/browser/blob/blob_impl.h
index 148ae96..9693504 100644
--- a/storage/browser/blob/blob_impl.h
+++ b/storage/browser/blob/blob_impl.h
@@ -20,6 +20,12 @@
                                         mojom::BlobRequest request);
 
   void Clone(mojom::BlobRequest request) override;
+  void ReadRange(uint64_t offset,
+                 uint64_t length,
+                 mojo::ScopedDataPipeProducerHandle handle,
+                 mojom::BlobReaderClientPtr client) override;
+  void ReadAll(mojo::ScopedDataPipeProducerHandle handle,
+               mojom::BlobReaderClientPtr client) override;
   void GetInternalUUID(GetInternalUUIDCallback callback) override;
 
   void FlushForTesting();
diff --git a/storage/browser/blob/blob_impl_unittest.cc b/storage/browser/blob/blob_impl_unittest.cc
index 051c715..19bdc45 100644
--- a/storage/browser/blob/blob_impl_unittest.cc
+++ b/storage/browser/blob/blob_impl_unittest.cc
@@ -4,7 +4,10 @@
 
 #include "storage/browser/blob/blob_impl.h"
 
+#include "base/task_scheduler/post_task.h"
 #include "base/test/scoped_task_environment.h"
+#include "mojo/common/data_pipe_drainer.h"
+#include "net/base/net_errors.h"
 #include "storage/browser/blob/blob_data_builder.h"
 #include "storage/browser/blob/blob_data_handle.h"
 #include "storage/browser/blob/blob_storage_context.h"
@@ -12,6 +15,49 @@
 
 namespace storage {
 
+namespace {
+
+class DataPipeReader : public mojo::common::DataPipeDrainer::Client {
+ public:
+  DataPipeReader(std::string* data_out, base::OnceClosure done_callback)
+      : data_out_(data_out), done_callback_(std::move(done_callback)) {}
+
+  void OnDataAvailable(const void* data, size_t num_bytes) override {
+    data_out_->append(static_cast<const char*>(data), num_bytes);
+  }
+
+  void OnDataComplete() override { std::move(done_callback_).Run(); }
+
+ private:
+  std::string* data_out_;
+  base::OnceClosure done_callback_;
+};
+
+class MockBlobReaderClient : public mojom::BlobReaderClient {
+ public:
+  void OnCalculatedSize(uint64_t total_size,
+                        uint64_t expected_content_size) override {
+    total_size_ = total_size;
+    expected_content_size_ = expected_content_size;
+    calculated_size_ = true;
+  }
+
+  void OnComplete(int32_t status, uint64_t data_length) override {
+    status_ = static_cast<net::Error>(status);
+    data_length_ = data_length;
+    completed_ = true;
+  }
+
+  bool calculated_size_ = false;
+  uint64_t total_size_ = 0;
+  uint64_t expected_content_size_ = 0;
+  bool completed_ = false;
+  net::Error status_ = net::OK;
+  uint64_t data_length_ = 0;
+};
+
+}  // namespace
+
 class BlobImplTest : public testing::Test {
  public:
   void SetUp() override { context_ = base::MakeUnique<BlobStorageContext>(); }
@@ -39,6 +85,15 @@
     return received_uuid;
   }
 
+  std::string ReadDataPipe(mojo::ScopedDataPipeConsumerHandle pipe) {
+    base::RunLoop loop;
+    std::string data;
+    DataPipeReader reader(&data, loop.QuitClosure());
+    mojo::common::DataPipeDrainer drainer(&reader, std::move(pipe));
+    loop.Run();
+    return data;
+  }
+
  protected:
   base::test::ScopedTaskEnvironment scoped_task_environment_;
   std::unique_ptr<BlobStorageContext> context_;
@@ -82,4 +137,198 @@
   EXPECT_FALSE(blob);
 }
 
+TEST_F(BlobImplTest, ReadAll) {
+  const std::string kId = "id";
+  const std::string kContents = "hello world";
+  auto handle = CreateBlobFromString(kId, kContents);
+
+  mojom::BlobPtr ptr;
+  BlobImpl::Create(std::move(handle), MakeRequest(&ptr));
+
+  MockBlobReaderClient client;
+  mojom::BlobReaderClientPtr client_ptr;
+  mojo::Binding<mojom::BlobReaderClient> client_binding(
+      &client, MakeRequest(&client_ptr));
+
+  mojo::DataPipe pipe;
+  ptr->ReadAll(std::move(pipe.producer_handle), std::move(client_ptr));
+  std::string received = ReadDataPipe(std::move(pipe.consumer_handle));
+  EXPECT_EQ(kContents, received);
+
+  client_binding.FlushForTesting();
+  EXPECT_TRUE(client.calculated_size_);
+  EXPECT_EQ(kContents.size(), client.total_size_);
+  EXPECT_EQ(kContents.size(), client.expected_content_size_);
+
+  EXPECT_TRUE(client.completed_);
+  EXPECT_EQ(net::OK, client.status_);
+  EXPECT_EQ(kContents.size(), client.data_length_);
+}
+
+TEST_F(BlobImplTest, ReadAll_WithoutClient) {
+  const std::string kId = "id";
+  const std::string kContents = "hello world";
+  auto handle = CreateBlobFromString(kId, kContents);
+
+  mojom::BlobPtr ptr;
+  BlobImpl::Create(std::move(handle), MakeRequest(&ptr));
+
+  mojo::DataPipe pipe;
+  ptr->ReadAll(std::move(pipe.producer_handle), nullptr);
+  std::string received = ReadDataPipe(std::move(pipe.consumer_handle));
+  EXPECT_EQ(kContents, received);
+}
+
+TEST_F(BlobImplTest, ReadAll_BrokenBlob) {
+  const std::string kId = "id";
+  auto handle = context_->AddBrokenBlob(
+      kId, "", "", BlobStatus::ERR_INVALID_CONSTRUCTION_ARGUMENTS);
+
+  mojom::BlobPtr ptr;
+  BlobImpl::Create(std::move(handle), MakeRequest(&ptr));
+
+  MockBlobReaderClient client;
+  mojom::BlobReaderClientPtr client_ptr;
+  mojo::Binding<mojom::BlobReaderClient> client_binding(
+      &client, MakeRequest(&client_ptr));
+
+  mojo::DataPipe pipe;
+  ptr->ReadAll(std::move(pipe.producer_handle), std::move(client_ptr));
+
+  std::string received = ReadDataPipe(std::move(pipe.consumer_handle));
+  EXPECT_EQ("", received);
+
+  client_binding.FlushForTesting();
+  EXPECT_FALSE(client.calculated_size_);
+  EXPECT_TRUE(client.completed_);
+  EXPECT_EQ(net::ERR_FAILED, client.status_);
+  EXPECT_EQ(0u, client.data_length_);
+}
+
+TEST_F(BlobImplTest, ReadRange) {
+  const std::string kId = "id";
+  const std::string kContents = "hello world";
+  auto handle = CreateBlobFromString(kId, kContents);
+
+  mojom::BlobPtr ptr;
+  BlobImpl::Create(std::move(handle), MakeRequest(&ptr));
+
+  MockBlobReaderClient client;
+  mojom::BlobReaderClientPtr client_ptr;
+  mojo::Binding<mojom::BlobReaderClient> client_binding(
+      &client, MakeRequest(&client_ptr));
+
+  mojo::DataPipe pipe;
+  ptr->ReadRange(2, 5, std::move(pipe.producer_handle), std::move(client_ptr));
+
+  std::string received = ReadDataPipe(std::move(pipe.consumer_handle));
+  EXPECT_EQ(kContents.substr(2, 5), received);
+
+  client_binding.FlushForTesting();
+  EXPECT_TRUE(client.calculated_size_);
+  EXPECT_EQ(kContents.size(), client.total_size_);
+  EXPECT_EQ(5u, client.expected_content_size_);
+
+  EXPECT_TRUE(client.completed_);
+  EXPECT_EQ(net::OK, client.status_);
+  EXPECT_EQ(5u, client.data_length_);
+}
+
+TEST_F(BlobImplTest, ReadRange_WithoutClient) {
+  const std::string kId = "id";
+  const std::string kContents = "hello world";
+  auto handle = CreateBlobFromString(kId, kContents);
+
+  mojom::BlobPtr ptr;
+  BlobImpl::Create(std::move(handle), MakeRequest(&ptr));
+
+  mojo::DataPipe pipe;
+  ptr->ReadRange(2, 5, std::move(pipe.producer_handle), nullptr);
+
+  std::string received = ReadDataPipe(std::move(pipe.consumer_handle));
+  EXPECT_EQ(kContents.substr(2, 5), received);
+}
+
+TEST_F(BlobImplTest, ReadRange_TooLargeLength) {
+  const std::string kId = "id";
+  const std::string kContents = "hello world";
+  auto handle = CreateBlobFromString(kId, kContents);
+
+  mojom::BlobPtr ptr;
+  BlobImpl::Create(std::move(handle), MakeRequest(&ptr));
+
+  MockBlobReaderClient client;
+  mojom::BlobReaderClientPtr client_ptr;
+  mojo::Binding<mojom::BlobReaderClient> client_binding(
+      &client, MakeRequest(&client_ptr));
+
+  mojo::DataPipe pipe;
+  ptr->ReadRange(2, 15, std::move(pipe.producer_handle), std::move(client_ptr));
+
+  std::string received = ReadDataPipe(std::move(pipe.consumer_handle));
+  EXPECT_EQ(kContents.substr(2, 15), received);
+
+  client_binding.FlushForTesting();
+  EXPECT_TRUE(client.calculated_size_);
+  EXPECT_EQ(kContents.size(), client.total_size_);
+  EXPECT_EQ(kContents.size() - 2, client.expected_content_size_);
+
+  EXPECT_TRUE(client.completed_);
+  EXPECT_EQ(net::OK, client.status_);
+  EXPECT_EQ(kContents.size() - 2, client.data_length_);
+}
+
+TEST_F(BlobImplTest, ReadRange_BrokenBlob) {
+  const std::string kId = "id";
+  auto handle = context_->AddBrokenBlob(
+      kId, "", "", BlobStatus::ERR_INVALID_CONSTRUCTION_ARGUMENTS);
+
+  mojom::BlobPtr ptr;
+  BlobImpl::Create(std::move(handle), MakeRequest(&ptr));
+
+  MockBlobReaderClient client;
+  mojom::BlobReaderClientPtr client_ptr;
+  mojo::Binding<mojom::BlobReaderClient> client_binding(
+      &client, MakeRequest(&client_ptr));
+
+  mojo::DataPipe pipe;
+  ptr->ReadRange(2, 5, std::move(pipe.producer_handle), std::move(client_ptr));
+
+  std::string received = ReadDataPipe(std::move(pipe.consumer_handle));
+  EXPECT_EQ("", received);
+
+  client_binding.FlushForTesting();
+  EXPECT_FALSE(client.calculated_size_);
+  EXPECT_TRUE(client.completed_);
+  EXPECT_EQ(net::ERR_FAILED, client.status_);
+  EXPECT_EQ(0u, client.data_length_);
+}
+
+TEST_F(BlobImplTest, ReadRange_InvalidRange) {
+  const std::string kId = "id";
+  const std::string kContents = "hello world";
+  auto handle = CreateBlobFromString(kId, kContents);
+
+  mojom::BlobPtr ptr;
+  BlobImpl::Create(std::move(handle), MakeRequest(&ptr));
+
+  MockBlobReaderClient client;
+  mojom::BlobReaderClientPtr client_ptr;
+  mojo::Binding<mojom::BlobReaderClient> client_binding(
+      &client, MakeRequest(&client_ptr));
+
+  base::RunLoop loop;
+  mojo::DataPipe pipe;
+  ptr->ReadRange(15, 4, std::move(pipe.producer_handle), std::move(client_ptr));
+
+  std::string received = ReadDataPipe(std::move(pipe.consumer_handle));
+  EXPECT_EQ("", received);
+
+  client_binding.FlushForTesting();
+  EXPECT_FALSE(client.calculated_size_);
+  EXPECT_TRUE(client.completed_);
+  EXPECT_EQ(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE, client.status_);
+  EXPECT_EQ(0u, client.data_length_);
+}
+
 }  // namespace storage
diff --git a/storage/browser/blob/blob_registry_impl_unittest.cc b/storage/browser/blob/blob_registry_impl_unittest.cc
index ee0e27d..0f0e3c8 100644
--- a/storage/browser/blob/blob_registry_impl_unittest.cc
+++ b/storage/browser/blob/blob_registry_impl_unittest.cc
@@ -41,6 +41,18 @@
                             std::move(request));
   }
 
+  void ReadRange(uint64_t offset,
+                 uint64_t size,
+                 mojo::ScopedDataPipeProducerHandle,
+                 mojom::BlobReaderClientPtr) override {
+    NOTREACHED();
+  }
+
+  void ReadAll(mojo::ScopedDataPipeProducerHandle,
+               mojom::BlobReaderClientPtr) override {
+    NOTREACHED();
+  }
+
   void GetInternalUUID(GetInternalUUIDCallback callback) override {
     std::move(callback).Run(uuid_);
   }
diff --git a/storage/browser/blob/blob_url_request_job.cc b/storage/browser/blob/blob_url_request_job.cc
index b1ac09e..03190ad 100644
--- a/storage/browser/blob/blob_url_request_job.cc
+++ b/storage/browser/blob/blob_url_request_job.cc
@@ -142,9 +142,9 @@
 scoped_refptr<net::HttpResponseHeaders> BlobURLRequestJob::GenerateHeaders(
     net::HttpStatusCode status_code,
     BlobDataHandle* blob_handle,
-    BlobReader* blob_reader,
     net::HttpByteRange* byte_range,
-    int64_t* content_size) {
+    uint64_t total_size,
+    uint64_t content_size) {
   std::string status("HTTP/1.1 ");
   status.append(base::IntToString(status_code));
   status.append(" ");
@@ -154,10 +154,9 @@
       new net::HttpResponseHeaders(status);
 
   if (status_code == net::HTTP_OK || status_code == net::HTTP_PARTIAL_CONTENT) {
-    *content_size = blob_reader->remaining_bytes();
     std::string content_length_header(net::HttpRequestHeaders::kContentLength);
     content_length_header.append(": ");
-    content_length_header.append(base::Int64ToString(*content_size));
+    content_length_header.append(base::Uint64ToString(content_size));
     headers->AddHeader(content_length_header);
     if (status_code == net::HTTP_PARTIAL_CONTENT) {
       DCHECK(byte_range->IsValid());
@@ -167,8 +166,7 @@
           "%" PRId64 "-%" PRId64, byte_range->first_byte_position(),
           byte_range->last_byte_position()));
       content_range_header.append("/");
-      content_range_header.append(
-          base::StringPrintf("%" PRId64, blob_reader->total_size()));
+      content_range_header.append(base::StringPrintf("%" PRId64, total_size));
       headers->AddHeader(content_range_header);
     }
     if (!blob_handle->content_type().empty()) {
@@ -323,12 +321,16 @@
 }
 
 void BlobURLRequestJob::HeadersCompleted(net::HttpStatusCode status_code) {
-  int64_t content_size = 0;
+  uint64_t content_size = 0;
+  uint64_t total_size = 0;
+  if (status_code == net::HTTP_OK || status_code == net::HTTP_PARTIAL_CONTENT) {
+    content_size = blob_reader_->remaining_bytes();
+    set_expected_content_size(content_size);
+    total_size = blob_reader_->total_size();
+  }
   response_info_.reset(new net::HttpResponseInfo());
-  response_info_->headers =
-      GenerateHeaders(status_code, blob_handle_.get(), blob_reader_.get(),
-                      &byte_range_, &content_size);
-  set_expected_content_size(content_size);
+  response_info_->headers = GenerateHeaders(
+      status_code, blob_handle_.get(), &byte_range_, total_size, content_size);
   if (blob_reader_)
     response_info_->metadata = blob_reader_->side_data();
 
diff --git a/storage/browser/blob/blob_url_request_job.h b/storage/browser/blob/blob_url_request_job.h
index b67aaef7..00649b8 100644
--- a/storage/browser/blob/blob_url_request_job.h
+++ b/storage/browser/blob/blob_url_request_job.h
@@ -48,14 +48,14 @@
   void SetExtraRequestHeaders(const net::HttpRequestHeaders& headers) override;
 
   // Helper method to create the HTTP headers for the response.
-  // |blob_handles|, |blob_reader|, |byte_range| and |content_size| are only
+  // |blob_handles|, |total_size|, |byte_range| and |content_size| are only
   // used if status_code isn't an error.
   static scoped_refptr<net::HttpResponseHeaders> GenerateHeaders(
       net::HttpStatusCode status_code,
       BlobDataHandle* blob_handle,
-      BlobReader* blob_reader,
       net::HttpByteRange* byte_range,
-      int64_t* content_size);
+      uint64_t total_size,
+      uint64_t content_size);
 
   // Helper method to map from a net error to an http status code.
   static net::HttpStatusCode NetErrorToHttpStatusCode(int error_code);
diff --git a/storage/browser/blob/mojo_blob_reader.cc b/storage/browser/blob/mojo_blob_reader.cc
new file mode 100644
index 0000000..0e29999
--- /dev/null
+++ b/storage/browser/blob/mojo_blob_reader.cc
@@ -0,0 +1,212 @@
+// 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 "storage/browser/blob/mojo_blob_reader.h"
+
+#include "net/base/io_buffer.h"
+#include "services/network/public/cpp/net_adapters.h"
+#include "storage/browser/blob/blob_data_handle.h"
+
+namespace storage {
+
+// static
+void MojoBlobReader::Create(FileSystemContext* file_system_context,
+                            const BlobDataHandle* handle,
+                            const net::HttpByteRange& range,
+                            std::unique_ptr<Delegate> delegate) {
+  new MojoBlobReader(file_system_context, handle, range, std::move(delegate));
+}
+
+MojoBlobReader::MojoBlobReader(FileSystemContext* file_system_context,
+                               const BlobDataHandle* handle,
+                               const net::HttpByteRange& range,
+                               std::unique_ptr<Delegate> delegate)
+    : delegate_(std::move(delegate)),
+      byte_range_(range),
+      blob_reader_(handle->CreateReader(file_system_context)),
+      writable_handle_watcher_(FROM_HERE,
+                               mojo::SimpleWatcher::ArmingPolicy::MANUAL),
+      peer_closed_handle_watcher_(FROM_HERE,
+                                  mojo::SimpleWatcher::ArmingPolicy::MANUAL),
+      weak_factory_(this) {
+  DCHECK(delegate_);
+  base::SequencedTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE,
+      base::Bind(&MojoBlobReader::Start, weak_factory_.GetWeakPtr()));
+}
+
+MojoBlobReader::~MojoBlobReader() {}
+
+void MojoBlobReader::Start() {
+  if (blob_reader_->net_error()) {
+    NotifyCompletedAndDeleteIfNeeded(blob_reader_->net_error());
+    return;
+  }
+
+  BlobReader::Status size_status = blob_reader_->CalculateSize(
+      base::Bind(&MojoBlobReader::DidCalculateSize, base::Unretained(this)));
+  switch (size_status) {
+    case BlobReader::Status::NET_ERROR:
+      NotifyCompletedAndDeleteIfNeeded(blob_reader_->net_error());
+      return;
+    case BlobReader::Status::IO_PENDING:
+      return;
+    case BlobReader::Status::DONE:
+      DidCalculateSize(net::OK);
+      return;
+  }
+
+  NOTREACHED();
+}
+
+void MojoBlobReader::NotifyCompletedAndDeleteIfNeeded(int result) {
+  if (!notified_completed_) {
+    delegate_->OnComplete(static_cast<net::Error>(result),
+                          total_written_bytes_);
+    notified_completed_ = true;
+  }
+
+  bool has_data_pipe = pending_write_ || response_body_stream_.is_valid();
+  if (!has_data_pipe)
+    delete this;
+}
+
+void MojoBlobReader::DidCalculateSize(int result) {
+  if (result != net::OK) {
+    NotifyCompletedAndDeleteIfNeeded(result);
+    return;
+  }
+
+  // Apply the range requirement.
+  if (!byte_range_.ComputeBounds(blob_reader_->total_size())) {
+    NotifyCompletedAndDeleteIfNeeded(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE);
+    return;
+  }
+
+  DCHECK_LE(byte_range_.first_byte_position(),
+            byte_range_.last_byte_position() + 1);
+  uint64_t length = base::checked_cast<uint64_t>(
+      byte_range_.last_byte_position() - byte_range_.first_byte_position() + 1);
+
+  if (blob_reader_->SetReadRange(byte_range_.first_byte_position(), length) !=
+      BlobReader::Status::DONE) {
+    NotifyCompletedAndDeleteIfNeeded(blob_reader_->net_error());
+    return;
+  }
+
+  if (delegate_->DidCalculateSize(blob_reader_->total_size(),
+                                  blob_reader_->remaining_bytes()) ==
+      Delegate::REQUEST_SIDE_DATA) {
+    if (!blob_reader_->has_side_data()) {
+      DidReadSideData(BlobReader::Status::DONE);
+    } else {
+      BlobReader::Status read_status = blob_reader_->ReadSideData(
+          base::Bind(&MojoBlobReader::DidReadSideData, base::Unretained(this)));
+      if (read_status != BlobReader::Status::IO_PENDING)
+        DidReadSideData(BlobReader::Status::DONE);
+    }
+  } else {
+    StartReading();
+  }
+}
+
+void MojoBlobReader::DidReadSideData(BlobReader::Status status) {
+  if (status != BlobReader::Status::DONE) {
+    NotifyCompletedAndDeleteIfNeeded(blob_reader_->net_error());
+    return;
+  }
+  delegate_->DidReadSideData(blob_reader_->side_data());
+  StartReading();
+}
+
+void MojoBlobReader::StartReading() {
+  response_body_stream_ = delegate_->PassDataPipe();
+  peer_closed_handle_watcher_.Watch(
+      response_body_stream_.get(), MOJO_HANDLE_SIGNAL_PEER_CLOSED,
+      base::Bind(&MojoBlobReader::OnResponseBodyStreamClosed,
+                 base::Unretained(this)));
+  peer_closed_handle_watcher_.ArmOrNotify();
+
+  writable_handle_watcher_.Watch(
+      response_body_stream_.get(), MOJO_HANDLE_SIGNAL_WRITABLE,
+      base::Bind(&MojoBlobReader::OnResponseBodyStreamReady,
+                 base::Unretained(this)));
+
+  // Start reading...
+  ReadMore();
+}
+
+void MojoBlobReader::ReadMore() {
+  DCHECK(!pending_write_.get());
+
+  uint32_t num_bytes;
+  // TODO: we should use the abstractions in MojoAsyncResourceHandler.
+  MojoResult result = network::NetToMojoPendingBuffer::BeginWrite(
+      &response_body_stream_, &pending_write_, &num_bytes);
+  if (result == MOJO_RESULT_SHOULD_WAIT) {
+    // The pipe is full. We need to wait for it to have more space.
+    writable_handle_watcher_.ArmOrNotify();
+    return;
+  } else if (result != MOJO_RESULT_OK) {
+    // The response body stream is in a bad state. Bail.
+    writable_handle_watcher_.Cancel();
+    response_body_stream_.reset();
+    NotifyCompletedAndDeleteIfNeeded(net::ERR_UNEXPECTED);
+    return;
+  }
+
+  CHECK_GT(static_cast<uint32_t>(std::numeric_limits<int>::max()), num_bytes);
+  auto buf =
+      base::MakeRefCounted<network::NetToMojoIOBuffer>(pending_write_.get());
+  int bytes_read;
+  BlobReader::Status read_status = blob_reader_->Read(
+      buf.get(), static_cast<int>(num_bytes), &bytes_read,
+      base::Bind(&MojoBlobReader::DidRead, base::Unretained(this), false));
+  switch (read_status) {
+    case BlobReader::Status::NET_ERROR:
+      NotifyCompletedAndDeleteIfNeeded(blob_reader_->net_error());
+      return;
+    case BlobReader::Status::IO_PENDING:
+      // Wait for DidRead.
+      return;
+    case BlobReader::Status::DONE:
+      if (bytes_read > 0) {
+        DidRead(true, bytes_read);
+      } else {
+        writable_handle_watcher_.Cancel();
+        pending_write_->Complete(0);
+        pending_write_ = nullptr;  // This closes the data pipe.
+        NotifyCompletedAndDeleteIfNeeded(net::OK);
+        return;
+      }
+  }
+}
+
+void MojoBlobReader::DidRead(bool completed_synchronously, int num_bytes) {
+  delegate_->DidRead(num_bytes);
+  response_body_stream_ = pending_write_->Complete(num_bytes);
+  total_written_bytes_ += num_bytes;
+  pending_write_ = nullptr;
+  if (completed_synchronously) {
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::Bind(&MojoBlobReader::ReadMore, weak_factory_.GetWeakPtr()));
+  } else {
+    ReadMore();
+  }
+}
+
+void MojoBlobReader::OnResponseBodyStreamClosed(MojoResult result) {
+  response_body_stream_.reset();
+  pending_write_ = nullptr;
+  NotifyCompletedAndDeleteIfNeeded(net::ERR_ABORTED);
+}
+
+void MojoBlobReader::OnResponseBodyStreamReady(MojoResult result) {
+  // TODO(jam): Handle a bad |result| value.
+  DCHECK_EQ(result, MOJO_RESULT_OK);
+  ReadMore();
+}
+
+}  // namespace storage
diff --git a/storage/browser/blob/mojo_blob_reader.h b/storage/browser/blob/mojo_blob_reader.h
new file mode 100644
index 0000000..04221e1
--- /dev/null
+++ b/storage/browser/blob/mojo_blob_reader.h
@@ -0,0 +1,143 @@
+// 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 STORAGE_BROWSER_BLOB_MOJO_BLOB_READER_H_
+#define STORAGE_BROWSER_BLOB_MOJO_BLOB_READER_H_
+
+#include <memory>
+#include "base/memory/ref_counted.h"
+#include "mojo/public/cpp/system/data_pipe.h"
+#include "mojo/public/cpp/system/simple_watcher.h"
+#include "net/base/net_errors.h"
+#include "net/http/http_byte_range.h"
+#include "storage/browser/blob/blob_reader.h"
+#include "storage/browser/storage_browser_export.h"
+
+namespace net {
+class IOBufferWithSize;
+}
+
+namespace network {
+class NetToMojoPendingBuffer;
+}
+
+namespace storage {
+class BlobDataHandle;
+class FileSystemContext;
+
+// Reads a blob into a data pipe. Owns itself, and owns its delegate. Self
+// destructs when reading is complete.
+class STORAGE_EXPORT MojoBlobReader {
+ public:
+  // Methods on this delegate are called in the order they are defined here.
+  // With the exception of DidRead, each method is called at most once.
+  // OnComplete is always called, and is always the last method to be called,
+  // every other method could be skipped in case of errors, or if the method is
+  // otherwise not applicable.
+  class Delegate {
+   public:
+    enum RequestSideData { REQUEST_SIDE_DATA, DONT_REQUEST_SIDE_DATA };
+
+    virtual ~Delegate() {}
+
+    // Called when the blob being read has been fully constructed and its size
+    // is known. |total_size| is the total size of the blob, while
+    // |content_size| is the size of the subset of this blob that matches the
+    // range passed to Create.
+    // Return |REQUEST_SIDE_DATA| if the blob's side data should be returned,
+    // otherwise MojoBlobReader will skip reading side data and immediately
+    // start reading the actual blob contents. Side data is used for example by
+    // service worker code to store compiled javascript alongside the script
+    // source in the cache.
+    virtual RequestSideData DidCalculateSize(uint64_t total_size,
+                                             uint64_t content_size) = 0;
+
+    // Called if DidCalculateSize returned |REQUEST_SIDE_DATA|, with the side
+    // data associated with the blob being read. If the blob doesn't have side
+    // data this method is called with null.
+    virtual void DidReadSideData(net::IOBufferWithSize* data) {}
+
+    // Called when the MojoBlobReader actually starts reading data from the
+    // blob. Should return a data pipe to which all the data read from the blob
+    // should be written.
+    virtual mojo::ScopedDataPipeProducerHandle PassDataPipe() = 0;
+
+    // Called whenever some amount of data is read from the blob and about to be
+    // written to the data pipe.
+    virtual void DidRead(int num_bytes) {}
+
+    // Called when reading the blob has finished. If an error occurs this could
+    // be the only method that gets called, but either way this method is always
+    // the last to be called, shortly before the delegate is deleted.
+    // |total_written_bytes| indicated the total number of bytes that were read
+    // from the blob, and written to the data pipe. When successful this should
+    // always be equal to the |content_size| that was passed to
+    // DidCalculateSize.
+    virtual void OnComplete(net::Error result,
+                            uint64_t total_written_bytes) = 0;
+  };
+
+  static void Create(FileSystemContext* file_system_context,
+                     const BlobDataHandle* handle,
+                     const net::HttpByteRange& range,
+                     std::unique_ptr<Delegate> delegate);
+
+ private:
+  MojoBlobReader(FileSystemContext* file_system_context,
+                 const BlobDataHandle* handle,
+                 const net::HttpByteRange& range,
+                 std::unique_ptr<Delegate> delegate);
+  ~MojoBlobReader();
+
+  void Start();
+
+  void NotifyCompletedAndDeleteIfNeeded(int result);
+
+  void DidCalculateSize(int result);
+  void DidReadSideData(BlobReader::Status status);
+  void StartReading();
+  void ReadMore();
+  void DidRead(bool completed_synchronously, int num_bytes);
+  void OnResponseBodyStreamClosed(MojoResult result);
+  void OnResponseBodyStreamReady(MojoResult result);
+
+  std::unique_ptr<Delegate> delegate_;
+
+  // The range of the blob that should be read. Could be unbounded if the entire
+  // blob is being read.
+  net::HttpByteRange byte_range_;
+
+  // Underlying BlobReader data is being read from.
+  std::unique_ptr<BlobReader> blob_reader_;
+
+  // Mojo data pipe where the data that is being read is written to. Will be
+  // null during write operations, at which time |pending_write_| owns the data
+  // pipe instead.
+  mojo::ScopedDataPipeProducerHandle response_body_stream_;
+
+  // During a write operation this owns the data pipe handle and gives access to
+  // the pipe's internal buffer where data should be written.
+  scoped_refptr<network::NetToMojoPendingBuffer> pending_write_;
+
+  // Watchers to keep track of the state of the data pipe. One watches for the
+  // pipe being writable, while the other watches for the pipe unexpectedly
+  // closing.
+  mojo::SimpleWatcher writable_handle_watcher_;
+  mojo::SimpleWatcher peer_closed_handle_watcher_;
+
+  // Total number of bytes written to the data pipe so far.
+  int64_t total_written_bytes_ = 0;
+
+  // Set to true when the delegate's OnComplete has been called. Used to make
+  // sure OnComplete isn't called more than once.
+  bool notified_completed_ = false;
+
+  base::WeakPtrFactory<MojoBlobReader> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(MojoBlobReader);
+};
+
+}  // namespace storage
+
+#endif
diff --git a/storage/public/interfaces/blobs.mojom b/storage/public/interfaces/blobs.mojom
index eb51dd8..90654ea2 100644
--- a/storage/public/interfaces/blobs.mojom
+++ b/storage/public/interfaces/blobs.mojom
@@ -9,11 +9,41 @@
 import "mojo/common/time.mojom";
 import "url/mojo/url.mojom";
 
+// Interface that can be implemented to be informed of certain information while
+// reading the data for a blob.
+interface BlobReaderClient {
+  // Called when the size of the blob being read has been calculated:
+  //   |total_size| is the total size of the blob.
+  //   |expected_content_size| is how many bytes should be sent over the data
+  //      pipe, taking into account a range if the blob was read with ReadRange.
+  // If an error occurs while reading the blob, this method might not get called.
+  OnCalculatedSize(uint64 total_size,
+                   uint64 expected_content_size);
+
+  // Called when reading the blob finished (with success or failure). Status is
+  // a net::Error indicating any potential error that might have occurred,
+  // |data_length| tells the reader how many bytes were written into the data
+  // pipe, and can be used as a sanity check to make sure all bytes were
+  // received.
+  OnComplete(int32 status, uint64 data_length);
+};
+
 // This interface provides access to a blob in the blob system.
 interface Blob {
   // Creates a copy of this Blob reference.
   Clone(Blob& blob);
 
+  // Causes the entire contents of this blob to be written into the given data
+  // pipe. An optional BlobReaderClient will be informed of the result of the
+  // read operation.
+  ReadAll(handle<data_pipe_producer> pipe, BlobReaderClient? client);
+
+  // Causes a subrange of the contents of this blob to be written into the given
+  // data pipe. An optional BlobReaderClient will be informed of the result of
+  // the read operation.
+  ReadRange(uint64 offset, uint64 length, handle<data_pipe_producer> pipe,
+            BlobReaderClient? client);
+
   // This method is an implementation detail of the blob system. You should not
   // ever need to call it directly.
   // This returns the internal UUID of the blob, used by the blob system to
diff --git a/testing/android/docs/instrumentation.md b/testing/android/docs/instrumentation.md
index 458e03f5..cfd9f0c 100644
--- a/testing/android/docs/instrumentation.md
+++ b/testing/android/docs/instrumentation.md
@@ -51,13 +51,20 @@
 In many cases, Chromium has extended the instrumentation test framework
 classes to implement additional features.
 
-### Test runners
+### Tracing
 
-[todo](/testing/android/docs/todo.md)
+Enabling tracing during a test run allows all the function calls involved to be
+observed in a visual display (using Chrome's built-in chrome://tracing feature).
+To run a test with tracing, add the `--trace-output` flag to the command used to
+call the instrumentation test (either running the test_runner.py script, or a
+generated binary such as `run_chrome_public_test_apk`). The `--trace-output` flag
+takes a filename, which, after the test run, will contain a JSON file readable
+by chrome://tracing.
 
-### Test cases
-
-[todo](/testing/android/docs/todo.md)
+By default, the trace includes only certain function calls important to the test
+run, both within the Python test runner framework and the Java code running on
+the device. For a more detailed look, add the (no-argument) `--trace-all` flag.
+This causes every function called on the Python side to be added to the trace.
 
 ### Annotations
 
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index 6e904f6..ffb4d42 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -24,16 +24,18 @@
   "Android Tests with Tracing": {
     "instrumentation_tests": [
       {
+        "args": [
+          "-f",
+          "ContextualSearchTapEventTest#*"
+        ],
         "test": "chrome_public_test_apk",
         "trace_output": true
       },
       {
-        "test": "chrome_sync_shell_test_apk",
-        "trace_output": true
+        "test": "chrome_sync_shell_test_apk"
       },
       {
-        "test": "content_shell_test_apk",
-        "trace_output": true
+        "test": "content_shell_test_apk"
       }
     ]
   },
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 27a41f4..cf86565 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -10472,8 +10472,7 @@
   },
   "Fuchsia": {
     "additional_compile_targets": [
-      "gl_unittests",
-      "net_unittests"
+      "gl_unittests"
     ],
     "gtest_tests": [
       {
@@ -10549,6 +10548,16 @@
         "test": "mojo_system_unittests"
       },
       {
+        "args": [
+          "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.net_unittests.filter",
+          "--test-launcher-batch-limit=200"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": false
+        },
+        "test": "net_unittests"
+      },
+      {
         "swarming": {
           "can_use_on_swarming_builders": false
         },
@@ -11263,18 +11272,6 @@
             }
           ]
         },
-        "test": "oop_heap_profiling_unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "device_type": "coho"
-            }
-          ]
-        },
         "test": "remoting_unittests"
       },
       {
@@ -11682,12 +11679,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "oop_heap_profiling_unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "pdf_unittests"
       },
       {
@@ -12000,12 +11991,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "oop_heap_profiling_unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "pdf_unittests"
       },
       {
@@ -12295,12 +12280,6 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
-        "test": "oop_heap_profiling_unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
         "test": "pdf_unittests"
       },
       {
@@ -13668,7 +13647,7 @@
             },
             {
               "gpu": "8086:0a2e",
-              "hidpi": 0,
+              "hidpi": "0",
               "os": "Mac-10.12.5"
             }
           ],
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index 78e420f..0540cb24 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -2408,413 +2408,6 @@
     "isolated_scripts": []
   },
   "Linux ChromiumOS Ozone Builder": {},
-  "Linux Debug (Intel HD 530)": {
-    "gtest_tests": [
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        },
-        "test": "angle_end2end_tests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0",
-          "--no-xvfb"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        },
-        "test": "angle_unittests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        },
-        "test": "audio_unittests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        },
-        "test": "gl_tests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--no-xvfb"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        },
-        "test": "gl_unittests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        },
-        "test": "gles2_conform_test",
-        "use_xvfb": false
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        },
-        "test": "swiftshader_unittests",
-        "use_xvfb": false
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "args": [
-          "context_lost",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "context_lost_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "depth_capture",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "depth_capture_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "gpu_process",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "gpu_process_launch_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "hardware_accelerated_feature",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "hardware_accelerated_feature_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "info_collection",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--expected-vendor-id",
-          "8086",
-          "--expected-device-id",
-          "1912"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "info_collection_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "maps",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--os-type",
-          "linux",
-          "--build-revision",
-          "${got_revision}",
-          "--test-machine-name",
-          "${buildername}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "maps_pixel_test",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "pixel",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--refimg-cloud-storage-bucket",
-          "chromium-gpu-archive/reference-images",
-          "--os-type",
-          "linux",
-          "--build-revision",
-          "${got_revision}",
-          "--test-machine-name",
-          "${buildername}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "pixel_test",
-        "non_precommit_args": [
-          "--upload-refimg-to-cloud-storage"
-        ],
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "precommit_args": [
-          "--download-refimg-from-cloud-storage"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "screenshot_sync",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "screenshot_sync_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "trace_test",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "trace_test",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-passthrough-cmd-decoder"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl_conformance_gl_passthrough_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl_conformance_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      }
-    ]
-  },
   "Linux Debug (NVIDIA)": {
     "gtest_tests": [
       {
@@ -3862,481 +3455,6 @@
       }
     ]
   },
-  "Linux Release (Intel HD 530)": {
-    "gtest_tests": [
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        },
-        "test": "angle_end2end_tests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0",
-          "--no-xvfb"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        },
-        "test": "angle_unittests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        },
-        "test": "audio_unittests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--enable-gpu",
-          "--no-xvfb",
-          "--test-launcher-jobs=1",
-          "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
-        ],
-        "name": "tab_capture_end2end_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "browser_tests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        },
-        "test": "gl_tests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--no-xvfb"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        },
-        "test": "gl_unittests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        },
-        "test": "gles2_conform_test",
-        "use_xvfb": false
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        },
-        "test": "swiftshader_unittests",
-        "use_xvfb": false
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "args": [
-          "context_lost",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "context_lost_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "depth_capture",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "depth_capture_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "gpu_process",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "gpu_process_launch_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "hardware_accelerated_feature",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "hardware_accelerated_feature_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "info_collection",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--expected-vendor-id",
-          "8086",
-          "--expected-device-id",
-          "1912"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "info_collection_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "maps",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--os-type",
-          "linux",
-          "--build-revision",
-          "${got_revision}",
-          "--test-machine-name",
-          "${buildername}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "maps_pixel_test",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "pixel",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--refimg-cloud-storage-bucket",
-          "chromium-gpu-archive/reference-images",
-          "--os-type",
-          "linux",
-          "--build-revision",
-          "${got_revision}",
-          "--test-machine-name",
-          "${buildername}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "pixel_test",
-        "non_precommit_args": [
-          "--upload-refimg-to-cloud-storage"
-        ],
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "precommit_args": [
-          "--download-refimg-from-cloud-storage"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "screenshot_sync",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "screenshot_sync_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "trace_test",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "trace_test",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-passthrough-cmd-decoder",
-          "--webgl-conformance-version=2.0.1",
-          "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl2_conformance_gl_passthrough_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ],
-          "shards": 15
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--webgl-conformance-version=2.0.1",
-          "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl2_conformance_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ],
-          "shards": 15
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-passthrough-cmd-decoder"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl_conformance_gl_passthrough_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl_conformance_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Ubuntu"
-            }
-          ]
-        }
-      }
-    ]
-  },
   "Linux Release (Intel HD 630)": {
     "gtest_tests": [
       {
@@ -11898,550 +11016,6 @@
       }
     ]
   },
-  "Win10 Debug (Intel HD 530)": {
-    "gtest_tests": [
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "angle_end2end_tests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "angle_unittests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--test-launcher-retry-limit=0"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "angle_white_box_tests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "audio_unittests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "gl_tests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "gl_unittests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--use-angle=d3d9"
-        ],
-        "name": "gles2_conform_d3d9_test",
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "gles2_conform_test",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--use-angle=gl",
-          "--disable-gpu-sandbox"
-        ],
-        "name": "gles2_conform_gl_test",
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "gles2_conform_test",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "gles2_conform_test",
-        "use_xvfb": false
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "swiftshader_unittests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-angle=d3d11",
-          "--use-test-data-path",
-          "--test_video_data=test-25fps.h264:320:240:250:258:::1"
-        ],
-        "name": "video_decode_accelerator_d3d11_unittest",
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "video_decode_accelerator_unittest",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-angle=d3d9",
-          "--use-test-data-path",
-          "--test_video_data=test-25fps.h264:320:240:250:258:::1"
-        ],
-        "name": "video_decode_accelerator_d3d9_unittest",
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "video_decode_accelerator_unittest",
-        "use_xvfb": false
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "args": [
-          "context_lost",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "context_lost_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "depth_capture",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "depth_capture_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "gpu_process",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "gpu_process_launch_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "hardware_accelerated_feature",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "hardware_accelerated_feature_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "info_collection",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--expected-vendor-id",
-          "8086",
-          "--expected-device-id",
-          "1912"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "info_collection_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "maps",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--os-type",
-          "win",
-          "--build-revision",
-          "${got_revision}",
-          "--test-machine-name",
-          "${buildername}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "maps_pixel_test",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "pixel",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--refimg-cloud-storage-bucket",
-          "chromium-gpu-archive/reference-images",
-          "--os-type",
-          "win",
-          "--build-revision",
-          "${got_revision}",
-          "--test-machine-name",
-          "${buildername}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "pixel_test",
-        "non_precommit_args": [
-          "--upload-refimg-to-cloud-storage"
-        ],
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "precommit_args": [
-          "--download-refimg-from-cloud-storage"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "screenshot_sync",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "screenshot_sync_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "trace_test",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "trace_test",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=d3d11 --use-passthrough-cmd-decoder"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl_conformance_d3d11_passthrough_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=d3d9"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl_conformance_d3d9_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=gl"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl_conformance_gl_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=debug",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl_conformance_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      }
-    ]
-  },
   "Win10 Debug (NVIDIA)": {
     "gtest_tests": [
       {
@@ -12528,6 +11102,24 @@
       },
       {
         "args": [
+          "--use-gpu-in-tests",
+          "--use-passthrough-cmd-decoder"
+        ],
+        "name": "gl_tests_passthrough",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:104a",
+              "os": "Windows-10"
+            }
+          ]
+        },
+        "test": "gl_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -13005,591 +11597,6 @@
       }
     ]
   },
-  "Win10 Release (Intel HD 530)": {
-    "gtest_tests": [
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "angle_end2end_tests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "angle_unittests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--test-launcher-retry-limit=0"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "angle_white_box_tests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "audio_unittests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--enable-gpu",
-          "--no-xvfb",
-          "--test-launcher-jobs=1",
-          "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
-        ],
-        "name": "tab_capture_end2end_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "browser_tests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "gl_tests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "gl_unittests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--use-angle=d3d9"
-        ],
-        "name": "gles2_conform_d3d9_test",
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "gles2_conform_test",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--use-angle=gl",
-          "--disable-gpu-sandbox"
-        ],
-        "name": "gles2_conform_gl_test",
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "gles2_conform_test",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "gles2_conform_test",
-        "use_xvfb": false
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "swiftshader_unittests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-angle=d3d11",
-          "--use-test-data-path",
-          "--test_video_data=test-25fps.h264:320:240:250:258:::1"
-        ],
-        "name": "video_decode_accelerator_d3d11_unittest",
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "video_decode_accelerator_unittest",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-angle=d3d9",
-          "--use-test-data-path",
-          "--test_video_data=test-25fps.h264:320:240:250:258:::1"
-        ],
-        "name": "video_decode_accelerator_d3d9_unittest",
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        },
-        "test": "video_decode_accelerator_unittest",
-        "use_xvfb": false
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "args": [
-          "context_lost",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "context_lost_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "depth_capture",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "depth_capture_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "gpu_process",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "gpu_process_launch_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "hardware_accelerated_feature",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "hardware_accelerated_feature_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "info_collection",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--expected-vendor-id",
-          "8086",
-          "--expected-device-id",
-          "1912"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "info_collection_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "maps",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--os-type",
-          "win",
-          "--build-revision",
-          "${got_revision}",
-          "--test-machine-name",
-          "${buildername}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "maps_pixel_test",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "pixel",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--refimg-cloud-storage-bucket",
-          "chromium-gpu-archive/reference-images",
-          "--os-type",
-          "win",
-          "--build-revision",
-          "${got_revision}",
-          "--test-machine-name",
-          "${buildername}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "pixel_test",
-        "non_precommit_args": [
-          "--upload-refimg-to-cloud-storage"
-        ],
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "precommit_args": [
-          "--download-refimg-from-cloud-storage"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "screenshot_sync",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "screenshot_sync_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "trace_test",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "trace_test",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--webgl-conformance-version=2.0.1",
-          "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl2_conformance_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ],
-          "shards": 15
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=d3d11 --use-passthrough-cmd-decoder"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl_conformance_d3d11_passthrough_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=d3d9"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl_conformance_d3d9_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=gl"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl_conformance_gl_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl_conformance_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1912",
-              "os": "Windows-10"
-            }
-          ]
-        }
-      }
-    ]
-  },
   "Win10 Release (Intel HD 630)": {
     "gtest_tests": [
       {
@@ -13690,6 +11697,24 @@
       },
       {
         "args": [
+          "--use-gpu-in-tests",
+          "--use-passthrough-cmd-decoder"
+        ],
+        "name": "gl_tests_passthrough",
+        "swarming": {
+          "can_use_on_swarming_builders": false,
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912",
+              "os": "Windows-10"
+            }
+          ]
+        },
+        "test": "gl_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -14275,6 +12300,24 @@
       },
       {
         "args": [
+          "--use-gpu-in-tests",
+          "--use-passthrough-cmd-decoder"
+        ],
+        "name": "gl_tests_passthrough",
+        "swarming": {
+          "can_use_on_swarming_builders": false,
+          "dimension_sets": [
+            {
+              "gpu": "10de:1cb3",
+              "os": "Windows-10"
+            }
+          ]
+        },
+        "test": "gl_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -14885,6 +12928,24 @@
       },
       {
         "args": [
+          "--use-gpu-in-tests",
+          "--use-passthrough-cmd-decoder"
+        ],
+        "name": "gl_tests_passthrough",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:104a",
+              "os": "Windows-10"
+            }
+          ]
+        },
+        "test": "gl_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -15557,6 +13618,24 @@
       },
       {
         "args": [
+          "--use-gpu-in-tests",
+          "--use-passthrough-cmd-decoder"
+        ],
+        "name": "gl_tests_passthrough",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "1002:6613",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "gl_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -16096,6 +14175,24 @@
       },
       {
         "args": [
+          "--use-gpu-in-tests",
+          "--use-passthrough-cmd-decoder"
+        ],
+        "name": "gl_tests_passthrough",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:104a",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "gl_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -16692,6 +14789,24 @@
       },
       {
         "args": [
+          "--use-gpu-in-tests",
+          "--use-passthrough-cmd-decoder"
+        ],
+        "name": "gl_tests_passthrough",
+        "swarming": {
+          "can_use_on_swarming_builders": false,
+          "dimension_sets": [
+            {
+              "gpu": "1002:6613",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "gl_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -17297,6 +15412,24 @@
       },
       {
         "args": [
+          "--use-gpu-in-tests",
+          "--use-passthrough-cmd-decoder"
+        ],
+        "name": "gl_tests_passthrough",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "1002:6613",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "gl_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -17975,6 +16108,24 @@
       },
       {
         "args": [
+          "--use-gpu-in-tests",
+          "--use-passthrough-cmd-decoder"
+        ],
+        "name": "gl_tests_passthrough",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:104a",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "gl_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -18632,6 +16783,24 @@
       },
       {
         "args": [
+          "--use-gpu-in-tests",
+          "--use-passthrough-cmd-decoder"
+        ],
+        "name": "gl_tests_passthrough",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:104a",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "gl_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -19250,6 +17419,24 @@
       },
       {
         "args": [
+          "--use-gpu-in-tests",
+          "--use-passthrough-cmd-decoder"
+        ],
+        "name": "gl_tests_passthrough",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:104a",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "gl_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
diff --git a/testing/buildbot/chromium.gpu.json b/testing/buildbot/chromium.gpu.json
index 5f677998..9231b165 100644
--- a/testing/buildbot/chromium.gpu.json
+++ b/testing/buildbot/chromium.gpu.json
@@ -2050,6 +2050,24 @@
       },
       {
         "args": [
+          "--use-gpu-in-tests",
+          "--use-passthrough-cmd-decoder"
+        ],
+        "name": "gl_tests_passthrough",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:104a",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "gl_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -2408,6 +2426,24 @@
       },
       {
         "args": [
+          "--use-gpu-in-tests",
+          "--use-passthrough-cmd-decoder"
+        ],
+        "name": "gl_tests_passthrough",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:104a",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "gl_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
diff --git a/testing/buildbot/filters/fuchsia.media_unittests.filter b/testing/buildbot/filters/fuchsia.media_unittests.filter
index bbe7692..4404e90d 100644
--- a/testing/buildbot/filters/fuchsia.media_unittests.filter
+++ b/testing/buildbot/filters/fuchsia.media_unittests.filter
@@ -4,8 +4,11 @@
 -Mojo*
 
 # These tests are slow and may flake under qemu. crbug.com/745094
--Pipeline*
+-*AesDecryptorTest.*
+-*SincResamplerTest*
+-AudioRendererAlgorithmTest.FillBuffer_LargeBufferSize
 -MediaRemotingIntegrationTest*
+-Pipeline*
 
 # These tests depend on base::CancelableSyncSocket, which is currently
 # broken, see https://crbug.com/741783
diff --git a/testing/buildbot/filters/fuchsia.net_unittests.filter b/testing/buildbot/filters/fuchsia.net_unittests.filter
index d7065d5..d18ec7f 100644
--- a/testing/buildbot/filters/fuchsia.net_unittests.filter
+++ b/testing/buildbot/filters/fuchsia.net_unittests.filter
@@ -1,5 +1,4 @@
 # TODO(fuchsia): Fix these tests and remove the filter. crbug.com/731302 .
-
 -*HTTPS*
 -*QuicEndToEndTest.Large*
 -*QuicEndToEndTest.TokenBinding*
@@ -8,18 +7,19 @@
 -*RootCert*
 -*Socket*
 -BbrSenderTest.SimpleTransferAckDecimation2
+-BidirectionalStreamTest.TestHonorAlternativeServiceHeader
 -CertNetFetcherImplTest*
 -CertVerifyProcInternalTest.*
 -CloseOnConnectHttpServerTest.ServerImmediatelyClosesConnection
 -DiskCache*
 -EffectiveConnectionTypeTest*
 -EmbeddedTestServer*
--FileStreamTest.*
 -HttpNetworkTransactionTest.UploadUnreadableFile
 -HttpServerTest.*
 -NetworkInterfacesTest.GetNetworkList
 -NetworkQualitiesPrefManager*
 -NetworkQualityEstimatorTest*
+-NetworkThrottleManager*
 -Proxy*
 -PythonUtils*
 -QuicSimpleClientTest*
@@ -32,3 +32,13 @@
 -TokenBindingURLRequest*
 -URLFetcher*
 -URLRequest*
+-HostResolverImplDnsTest.DnsTask
+
+# TODO(fuchsia): These run too slowly at present. crbug.com/745094
+-BbrSenderTest.*
+-CryptoServerTests/*
+-HttpNetworkTransactionTest.*
+-*Quic*
+-RangeOfTreeSizes/*
+-*Spdy*
+-*SendAlgorithmTests.*
diff --git a/testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter b/testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter
index b03eeb6a..d2e1074 100644
--- a/testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter
+++ b/testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter
@@ -143,8 +143,10 @@
 -TouchInputBrowserTest.MultiPointTouchPress
 -TouchInputBrowserTest.TouchHandlerNoConsume
 -WebContentsImplBrowserTest.ClearNonVisiblePendingOnFail
+-WebContentsImplBrowserTest.DidGetResourceResponseStartUpdatesWaitingState
 -WebContentsImplBrowserTest.DownloadImage_Deny_FileImage
 -WebContentsImplBrowserTest.GetSizeForNewRenderView
+-WebContentsImplBrowserTest.LoadingStateChangedForSameDocumentNavigation
 -WebContentsImplBrowserTest.UserAgentOverride
 -WebContentsViewAuraTest.ScreenshotForSwappedOutRenderViews
 -WebRtcGetUserMediaOldConstraintsBrowserTest.GetUserMediaWithInvalidMandatorySourceID
@@ -161,3 +163,7 @@
 # content/network/url_loader_impl.cc should handle failure in
 # URLLoaderImpl::OnResponseBodyStreamRead().
 -SRC_ClearKey/EncryptedMediaTest.FrameSizeChangeVideo/0
+
+# https://crbug.com/754827
+-ResourceDispatcherHostBrowserTest.SyncXMLHttpRequest_Cancelled
+-BrowserSideNavigationBrowserDisableWebSecurityTest.ValidateBaseUrlForDataUrl
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index f0c0957..71a4061 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -777,10 +777,6 @@
     "label": "//chrome/installer/mini_installer:next_version_mini_installer",
     "type": "additional_compile_target",
   },
-  "oop_heap_profiling_unit_tests": {
-    "label": "//chrome/profiling:unit_tests",
-    "type": "console_test_launcher",
-  },
   "ozone_unittests": {
     "label": "//ui/ozone:ozone_unittests",
     "type": "console_test_launcher",
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 22b5e67..639353f3 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -454,6 +454,22 @@
             ]
         }
     ],
+    "ClearOldOnDemandFavicons": [
+        {
+            "platforms": [
+                "android",
+                "ios"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "ClearOldOnDemandFavicons"
+                    ]
+                }
+            ]
+        }
+    ],
     "ClientSidePreviews": [
         {
             "platforms": [
@@ -1696,8 +1712,8 @@
                     "params": {
                         "availability": "any",
                         "event_new_tab_opened": "name:new_tab_opened;comparator:==0;window:3650;storage:3650",
+                        "event_new_tab_session_time_met": "name:new_tab_session_time_met;comparator:>=1;window:3650;storage:3650",
                         "event_omnibox_used": "name:omnibox_used;comparator:>=1;window:3650;storage:3650",
-                        "event_session_time": "name:session_time;comparator:>=1;window:3650;storage:3650",
                         "event_trigger": "name:new_tab_trigger;comparator:any;window:3650;storage:3650",
                         "event_used": "name:new_tab_clicked;comparator:any;window:3650;storage:3650",
                         "session_rate": "<=3",
diff --git a/third_party/.gitignore b/third_party/.gitignore
index 4213f70..94db067 100644
--- a/third_party/.gitignore
+++ b/third_party/.gitignore
@@ -24,7 +24,7 @@
 /apache-win32/modules/*.dll
 /apk-patch-size-estimator/lib/*.jar
 /asan
-/bazel/desugar/*.jar
+/bazel/desugar/Desugar.jar
 /bidichecker
 /bison
 /boringssl/src
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
index 2964525..0257867 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -346,7 +346,7 @@
 crbug.com/591099 compositing/gestures/gesture-tapHighlight-2-iframe.html [ Failure ]
 crbug.com/591099 compositing/gestures/gesture-tapHighlight-img-and-text-2.html [ Failure ]
 crbug.com/591099 compositing/gestures/gesture-tapHighlight-img-transformed.html [ Failure ]
-crbug.com/591099 compositing/gestures/gesture-tapHighlight-overflowing-text-crash.html [ Failure ]
+crbug.com/591099 compositing/gestures/gesture-tapHighlight-overflowing-text-crash.html [ Failure Pass ]
 crbug.com/591099 compositing/gestures/gesture-tapHighlight-with-box-shadow.html [ Failure ]
 crbug.com/591099 compositing/iframes/become-composited-nested-iframes.html [ Failure ]
 crbug.com/591099 compositing/iframes/become-overlapped-iframe.html [ Failure ]
@@ -1491,8 +1491,8 @@
 crbug.com/591099 css3/filters/filter-with-opacity-and-children.html [ Failure ]
 crbug.com/591099 css3/filters/filtered-compositing-descendant.html [ Failure ]
 crbug.com/591099 css3/filters/filtered-inline.html [ Failure ]
-crbug.com/591099 css3/filters/huge-region-composited.html [ Failure ]
-crbug.com/591099 css3/filters/huge-region.html [ Failure ]
+crbug.com/591099 css3/filters/huge-region-composited.html [ Failure Pass ]
+crbug.com/591099 css3/filters/huge-region.html [ Failure Pass ]
 crbug.com/591099 css3/filters/nested-filter.html [ Crash Failure ]
 crbug.com/591099 css3/filters/offscreen-filters-memory-usage.html [ Failure ]
 crbug.com/591099 css3/filters/regions-expanding.html [ Crash Failure ]
@@ -1514,7 +1514,6 @@
 crbug.com/591099 css3/flexbox/flex-flow-padding.html [ Failure ]
 crbug.com/591099 css3/flexbox/flex-item-contains-strict.html [ Crash Failure ]
 crbug.com/591099 css3/flexbox/flex-longhand-parsing.html [ Failure ]
-crbug.com/591099 css3/flexbox/flex-one-sets-flex-basis-to-zero-px.html [ Failure Pass ]
 crbug.com/591099 css3/flexbox/flex-property-parsing.html [ Failure ]
 crbug.com/591099 css3/flexbox/flexbox-baseline-margins.html [ Failure ]
 crbug.com/591099 css3/flexbox/flexbox-baseline.html [ Failure ]
@@ -2531,7 +2530,7 @@
 crbug.com/591099 editing/execCommand/clipboard-access-with-userGesture.html [ Failure ]
 crbug.com/591099 editing/execCommand/clipboard-access.html [ Failure ]
 crbug.com/591099 editing/execCommand/convert-style-elements-to-spans.html [ Failure ]
-crbug.com/591099 editing/execCommand/crash-line-break-after-outdent.html [ Crash Failure ]
+crbug.com/591099 editing/execCommand/crash-line-break-after-outdent.html [ Crash Failure Pass ]
 crbug.com/591099 editing/execCommand/default-paragraph-separator.html [ Failure ]
 crbug.com/591099 editing/execCommand/default-parameters.html [ Failure ]
 crbug.com/591099 editing/execCommand/delete-selection-has-style.html [ Failure ]
@@ -2565,7 +2564,7 @@
 crbug.com/591099 editing/execCommand/insert-image-on-top-of-directional-text.html [ Failure ]
 crbug.com/591099 editing/execCommand/insert-line-break-no-scroll.html [ Failure ]
 crbug.com/591099 editing/execCommand/insert-list-br-with-child-crash.html [ Crash Failure ]
-crbug.com/591099 editing/execCommand/insert-list-empty-div.html [ Failure ]
+crbug.com/591099 editing/execCommand/insert_list_empty_div.html [ Failure ]
 crbug.com/591099 editing/execCommand/insert-list-in-noneditable-list-parent.html [ Failure ]
 crbug.com/591099 editing/execCommand/insert-lists-inside-another-list.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/insert-ordered-list-crash.html [ Crash Failure ]
@@ -2574,9 +2573,11 @@
 crbug.com/591099 editing/execCommand/insertHTML.html [ Failure ]
 crbug.com/591099 editing/execCommand/insertImage-src.html [ Failure ]
 crbug.com/591099 editing/execCommand/insertImage.html [ Failure ]
+crbug.com/591099 editing/execCommand/insert_list/insert_list_no_hang.html [ Failure ]
 crbug.com/591099 editing/execCommand/inserting-ordered-list-crash.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/italicizeByCharacter.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/justify.html [ Failure Timeout ]
+crbug.com/591099 editing/execCommand/keep_typing_style.html [ Failure ]
 crbug.com/591099 editing/execCommand/merge-text-decoration-with-typing-style.html [ Failure ]
 crbug.com/591099 editing/execCommand/modifyForeColorByCharacter.html [ Crash Failure ]
 crbug.com/591099 editing/execCommand/move-selection-back-line-rtl.html [ Failure ]
@@ -2734,18 +2735,18 @@
 crbug.com/591099 editing/pasteboard/can-read-in-dragstart-event.html [ Failure ]
 crbug.com/591099 editing/pasteboard/clipboard-customData.html [ Failure ]
 crbug.com/591099 editing/pasteboard/copy-backslash-with-euc.html [ Crash Failure ]
-crbug.com/591099 editing/pasteboard/copy-crash.html [ Crash Timeout ]
+crbug.com/591099 editing/pasteboard/copy-crash.html [ Crash Failure Timeout ]
 crbug.com/591099 editing/pasteboard/copy-display-none.html [ Failure ]
 crbug.com/591099 editing/pasteboard/copy-element-with-conflicting-background-color-from-rule.html [ Failure ]
 crbug.com/591099 editing/pasteboard/copy-image-with-alt-text.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/copy-in-password-field.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/copy-null-characters.html [ Crash Failure ]
-crbug.com/591099 editing/pasteboard/copy-paste-bidi.html [ Crash Failure ]
+crbug.com/591099 editing/pasteboard/copy-paste-bidi.html [ Crash Failure Pass ]
 crbug.com/591099 editing/pasteboard/copy-paste-float.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/copy-paste-pre-line-content.html [ Failure ]
 crbug.com/591099 editing/pasteboard/copy-paste-ruby-text-with-block.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/copy-paste-ruby-text.html [ Crash Failure ]
-crbug.com/591099 editing/pasteboard/copy-paste-white-space.html [ Failure ]
+crbug.com/591099 editing/pasteboard/copy-paste-white-space.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/copy-resolves-urls.html [ Crash Failure ]
 crbug.com/591099 editing/pasteboard/copy-standalone-image-escaping.html [ Timeout ]
 crbug.com/591099 editing/pasteboard/copy-standalone-image.html [ Failure ]
@@ -2869,7 +2870,7 @@
 crbug.com/591099 editing/selection/anchor-focus1.html [ Crash Failure ]
 crbug.com/591099 editing/selection/anchor-focus2.html [ Crash Failure ]
 crbug.com/591099 editing/selection/anchor-focus3.html [ Crash Failure ]
-crbug.com/591099 editing/selection/applystyle-to-inline-in-block.html [ Failure ]
+crbug.com/591099 editing/selection/applystyle-to-inline-in-block.html [ Failure Pass ]
 crbug.com/591099 editing/selection/block-cursor-overtype-mode-rtl.html [ Failure ]
 crbug.com/591099 editing/selection/block-cursor-overtype-mode.html [ Failure ]
 crbug.com/591099 editing/selection/caret-after-keypress.html [ Failure ]
@@ -3023,7 +3024,7 @@
 crbug.com/591099 editing/selection/move-past-trailing-space.html [ Failure ]
 crbug.com/591099 editing/selection/move-vertically-with-paddings-borders.html [ Failure ]
 crbug.com/591099 editing/selection/no-range-canonicalization.html [ Failure ]
-crbug.com/591099 editing/selection/offset-from-point.html [ Crash Failure ]
+crbug.com/591099 editing/selection/offset-from-point.html [ Crash Failure Pass ]
 crbug.com/591099 editing/selection/paint-hyphen.html [ Failure ]
 crbug.com/591099 editing/selection/paragraph-granularity.html [ Failure ]
 crbug.com/591099 editing/selection/paragraph-with-ruby.html [ Crash Failure ]
@@ -3090,16 +3091,7 @@
 crbug.com/591099 editing/selection/user-select-all-parsing.html [ Failure ]
 crbug.com/591099 editing/selection/user-select-all-with-shift.html [ Crash Failure ]
 crbug.com/591099 editing/selection/user-select/user-select-all.html [ Crash Failure ]
-crbug.com/591099 editing/selection/vertical-lr-ltr-extend-line-backward-br.html [ Failure Pass ]
-crbug.com/591099 editing/selection/vertical-lr-ltr-extend-line-forward-br.html [ Failure Pass ]
-crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-backward-br.html [ Failure Pass ]
 crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-backward-wrap.html [ Crash Failure ]
-crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-forward-br.html [ Failure Pass ]
-crbug.com/591099 editing/selection/vertical-rl-ltr-extend-line-forward-wrap.html [ Crash Failure Pass ]
-crbug.com/591099 editing/selection/vertical-rl-rtl-extend-line-backward-br.html [ Failure Pass ]
-crbug.com/591099 editing/selection/vertical-rl-rtl-extend-line-backward-p.html [ Failure Pass ]
-crbug.com/591099 editing/selection/vertical-rl-rtl-extend-line-forward-br.html [ Failure Pass ]
-crbug.com/591099 editing/selection/vertical-rl-rtl-extend-line-forward-p.html [ Failure Pass ]
 crbug.com/591099 editing/selection/word-granularity.html [ Failure ]
 crbug.com/591099 editing/selection/wrapped-line-caret-1.html [ Failure ]
 crbug.com/591099 editing/selection/wrapped-line-caret-2.html [ Failure ]
@@ -3234,7 +3226,7 @@
 crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/failures_RSA-PSS.worker.html [ Timeout ]
 crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/failures_RSASSA-PKCS1-v1_5.worker.html [ Timeout ]
 crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/successes.worker.html [ Timeout ]
-crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/test_failures.https.html [ Pass Timeout ]
+crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/test_failures.https.html [ Crash Pass Timeout ]
 crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/test_failures_AES-CBC.https.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/test_failures_AES-CTR.https.html [ Pass Timeout ]
 crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/test_failures_AES-GCM.https.html [ Pass Timeout ]
@@ -3244,20 +3236,10 @@
 crbug.com/591099 external/wpt/XMLHttpRequest/send-authentication-prompt-2-manual.htm [ Crash Failure ]
 crbug.com/591099 external/wpt/css/CSS2/floats-clear/float-replaced-width-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-009.xht [ Failure ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-029.xht [ Failure ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-132.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-143.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-147.xht [ Failure ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-018.xht [ Failure ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-027.xht [ Failure ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-033.xht [ Failure ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-034.xht [ Failure ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-035.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-157.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-clear-008.xht [ Failure ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-clear-012.xht [ Failure ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-clear-013.xht [ Failure ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/margin-collapse-clear-014.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/floats/floats-placement-vertical-001a.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/CSS2/floats/floats-placement-vertical-001b.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/CSS2/floats/floats-placement-vertical-001c.xht [ Failure Pass ]
@@ -3281,9 +3263,6 @@
 crbug.com/591099 external/wpt/css/CSS2/linebox/vertical-align-baseline-005a.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-percents-001.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-replaced-width-006.xht [ Failure ]
-crbug.com/591099 external/wpt/css/CSS2/normal-flow/inline-replaced-width-012.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/CSS2/normal-flow/inline-replaced-width-013.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/CSS2/normal-flow/inline-replaced-width-015.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/max-height-percentage-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/root-box-001.xht [ Crash Failure ]
 crbug.com/591099 external/wpt/css/CSS2/positioning/absolute-replaced-width-036.xht [ Failure ]
@@ -3379,30 +3358,6 @@
 crbug.com/591099 external/wpt/css/css-grid-1/abspos/positioned-grid-items-009.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-grid-1/abspos/positioned-grid-items-016.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-grid-1/abspos/positioned-grid-items-017.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-005.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-006.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-007.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-008.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-013.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-014.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-015.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-016.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-001.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-002.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-003.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-004.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-009.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-010.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-011.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-012.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-001.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-002.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-003.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-004.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-009.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-010.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-011.html [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-012.html [ Crash Failure Pass ]
 crbug.com/591099 external/wpt/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-007.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-008.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-009.html [ Failure ]
@@ -3734,125 +3689,61 @@
 crbug.com/591099 external/wpt/css/css-writing-modes-3/abs-pos-non-replaced-vrl-222.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/abs-pos-non-replaced-vrl-226.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/abs-pos-non-replaced-vrl-228.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/background-position-vrl-018.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/background-position-vrl-020.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/background-position-vrl-022.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/baseline-inline-non-replaced-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/baseline-inline-non-replaced-003.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/baseline-inline-non-replaced-004.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/baseline-inline-non-replaced-005.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/baseline-inline-replaced-002.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/baseline-inline-replaced-003.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-003.xht [ Crash Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-007.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-008.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-010.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-014.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-015.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-016.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-020.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-022.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vlr-023.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-002.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-005.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-006.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-011.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-012.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-013.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-019.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-021.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-024.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/block-flow-direction-vrl-026.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/block-plaintext-004.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/box-offsets-rel-pos-vlr-003.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/box-offsets-rel-pos-vrl-002.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/central-baseline-alignment-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/clearance-calculations-vrl-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/clearance-calculations-vrl-004.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/clearance-calculations-vrl-006.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/clip-rect-vlr-011.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/clip-rect-vlr-013.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/clip-rect-vlr-015.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/clip-rect-vlr-017.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/clip-rect-vrl-010.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/clip-rect-vrl-012.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/clip-rect-vrl-014.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/clip-rect-vrl-016.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/contiguous-floated-table-vlr-007.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/contiguous-floated-table-vlr-009.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/contiguous-floated-table-vrl-006.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/contiguous-floated-table-vrl-008.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/direction-vlr-003.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/direction-vrl-002.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/float-contiguous-vlr-009.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/float-contiguous-vlr-011.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/float-contiguous-vlr-013.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/float-contiguous-vrl-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/float-contiguous-vrl-004.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/float-contiguous-vrl-006.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/float-contiguous-vrl-008.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/float-contiguous-vrl-010.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/float-contiguous-vrl-012.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/float-lft-orthog-htb-in-vlr-002.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/float-lft-orthog-htb-in-vrl-002.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/float-lft-orthog-vlr-in-htb-002.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/float-lft-orthog-vrl-in-htb-002.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/float-rgt-orthog-htb-in-vlr-003.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/float-rgt-orthog-htb-in-vrl-003.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vlr-005.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vlr-009.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vlr-011.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vlr-013.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vrl-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vrl-004.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vrl-006.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vrl-008.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vrl-010.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/float-vrl-012.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/horizontal-rule-vlr-003.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/horizontal-rule-vrl-002.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/inline-block-alignment-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/inline-block-alignment-004.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/inline-block-alignment-006.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/inline-replaced-vlr-005.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/inline-replaced-vrl-002.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/inline-replaced-vrl-004.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/inline-table-alignment-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/inline-table-alignment-004.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vlr-003.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vlr-007.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vlr-008.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vlr-010.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vlr-013.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vlr-014.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vlr-020.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vrl-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vrl-005.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vrl-006.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vrl-011.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vrl-012.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/line-box-direction-vrl-019.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/margin-collapse-vrl-010.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/margin-vlr-003.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/margin-vrl-002.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/normal-flow-overconstrained-vlr-003.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/normal-flow-overconstrained-vlr-005.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/normal-flow-overconstrained-vrl-002.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/normal-flow-overconstrained-vrl-004.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/ortho-htb-alongside-vrl-floats-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/ortho-htb-alongside-vrl-floats-010.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001a.html [ Crash Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001c.html [ Crash Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001d.html [ Crash Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001e.html [ Crash Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001g.html [ Crash Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001h.html [ Crash Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001i.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001k.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001l.html [ Crash Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001m.html [ Crash Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001o.html [ Crash Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001p.html [ Crash Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001q.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001r.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001s.html [ Failure ]
@@ -3862,16 +3753,7 @@
 crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001w.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001x.html [ Crash Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/outline-inline-block-vrl-006.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/outline-inline-vlr-006.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/outline-inline-vrl-006.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/overconstrained-rel-pos-ltr-left-right-vlr-005.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/overconstrained-rel-pos-ltr-left-right-vrl-004.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/overconstrained-rel-pos-ltr-top-bottom-vlr-003.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/overconstrained-rel-pos-ltr-top-bottom-vrl-002.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/overconstrained-rel-pos-rtl-left-right-vlr-009.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/overconstrained-rel-pos-rtl-left-right-vrl-008.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/overconstrained-rel-pos-rtl-top-bottom-vlr-007.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/overconstrained-rel-pos-rtl-top-bottom-vrl-006.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/percent-margin-vlr-003.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/percent-margin-vlr-007.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/percent-margin-vrl-002.xht [ Failure ]
@@ -3882,61 +3764,12 @@
 crbug.com/591099 external/wpt/css/css-writing-modes-3/percent-padding-vrl-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/percent-padding-vrl-004.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/percent-padding-vrl-006.xht [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-003.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-007.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-008.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-009.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-013.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-015.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-019.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-020.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-021.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-003.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-007.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-008.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-009.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-015.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-019.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-020.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-021.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-prct-htb-in-vlr-003.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-prct-htb-in-vlr-007.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-prct-htb-in-vrl-003.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-prct-htb-in-vrl-007.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vlr-009.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vlr-011.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vlr-013.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vlr-015.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vlr-017.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vlr-019.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vrl-008.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vrl-010.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vrl-012.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vrl-014.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vrl-016.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-align-vrl-018.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/text-baseline-vlr-007.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/text-baseline-vrl-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/text-baseline-vrl-004.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/text-baseline-vrl-006.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/text-combine-upright-layout-rules-001.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/text-combine-upright-line-breaking-rules-001.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vlr-003.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vlr-005.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vlr-007.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vlr-009.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vlr-011.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vlr-013.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vlr-015.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vlr-017.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vrl-002.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vrl-004.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vrl-006.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vrl-008.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vrl-010.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vrl-012.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vrl-014.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes-3/text-indent-vrl-016.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/text-orientation-016.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/vertical-alignment-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/vertical-alignment-004.xht [ Failure ]
@@ -4168,7 +4001,6 @@
 crbug.com/591099 external/wpt/intersection-observer/edge-inclusive-intersection.html [ Failure ]
 crbug.com/591099 external/wpt/intersection-observer/remove-element.html [ Failure ]
 crbug.com/591099 external/wpt/intersection-observer/same-document-root.html [ Crash Failure ]
-crbug.com/591099 external/wpt/media-source/mediasource-activesourcebuffers.html [ Crash Failure Pass ]
 crbug.com/591099 external/wpt/media-source/mediasource-getvideoplaybackquality.html [ Crash Timeout ]
 crbug.com/591099 external/wpt/media-source/mediasource-remove.html [ Crash Failure Pass ]
 crbug.com/591099 external/wpt/payment-request/payment-allowed-by-feature-policy.https.sub.html [ Crash Failure ]
@@ -4335,18 +4167,13 @@
 crbug.com/591099 fast/block/align-inverted-direction.html [ Failure ]
 crbug.com/591099 fast/block/available-width-changes-vertical.html [ Failure ]
 crbug.com/591099 fast/block/basic/011.html [ Failure ]
-crbug.com/591099 fast/block/basic/013.html [ Failure ]
 crbug.com/591099 fast/block/basic/014.html [ Failure ]
 crbug.com/591099 fast/block/basic/016.html [ Failure ]
 crbug.com/591099 fast/block/basic/018.html [ Failure ]
 crbug.com/591099 fast/block/basic/020.html [ Failure ]
-crbug.com/591099 fast/block/basic/adding-near-anonymous-block.html [ Failure ]
 crbug.com/591099 fast/block/basic/fieldset-stretch-to-legend.html [ Crash Failure ]
-crbug.com/591099 fast/block/basic/min-pref-width-nowrap-floats.html [ Failure Pass ]
 crbug.com/591099 fast/block/basic/quirk-height.html [ Failure ]
 crbug.com/591099 fast/block/basic/quirk-percent-height-grandchild.html [ Failure ]
-crbug.com/591099 fast/block/basic/text-indent-rtl.html [ Failure ]
-crbug.com/591099 fast/block/basic/white-space-pre-wraps.html [ Failure ]
 crbug.com/591099 fast/block/block-parent-with-zero-width-child.html [ Failure ]
 crbug.com/591099 fast/block/block-width-recalc-with-relative-height.html [ Crash Failure ]
 crbug.com/591099 fast/block/block-with-inline-replaced-child-following-text.html [ Crash Failure ]
@@ -4355,20 +4182,15 @@
 crbug.com/591099 fast/block/float/002.html [ Crash Failure ]
 crbug.com/591099 fast/block/float/003.html [ Failure ]
 crbug.com/591099 fast/block/float/010.html [ Failure ]
-crbug.com/591099 fast/block/float/012.html [ Failure ]
 crbug.com/591099 fast/block/float/014.html [ Crash Failure ]
 crbug.com/591099 fast/block/float/015.html [ Failure ]
 crbug.com/591099 fast/block/float/017.html [ Crash Failure ]
 crbug.com/591099 fast/block/float/018.html [ Failure ]
-crbug.com/591099 fast/block/float/019.html [ Failure Pass ]
-crbug.com/591099 fast/block/float/020.html [ Failure ]
 crbug.com/591099 fast/block/float/022.html [ Failure ]
-crbug.com/591099 fast/block/float/023.html [ Failure ]
 crbug.com/591099 fast/block/float/025.html [ Failure ]
 crbug.com/591099 fast/block/float/026.html [ Failure ]
 crbug.com/591099 fast/block/float/027.html [ Failure ]
 crbug.com/591099 fast/block/float/028.html [ Failure ]
-crbug.com/591099 fast/block/float/030.html [ Failure ]
 crbug.com/591099 fast/block/float/031.html [ Failure ]
 crbug.com/591099 fast/block/float/032.html [ Failure ]
 crbug.com/591099 fast/block/float/034.html [ Failure ]
@@ -4389,9 +4211,7 @@
 crbug.com/591099 fast/block/float/checkbox-and-radio-avoid-floats.html [ Failure ]
 crbug.com/591099 fast/block/float/crash-on-absolute-positioning.html [ Failure ]
 crbug.com/591099 fast/block/float/crash-replaced-display-block.html [ Failure ]
-crbug.com/591099 fast/block/float/editable-text-overlapping-float.html [ Failure ]
 crbug.com/591099 fast/block/float/element-clears-float-without-clearance.html [ Failure ]
-crbug.com/591099 fast/block/float/fit_line_below_floats.html [ Failure Pass ]
 crbug.com/591099 fast/block/float/float-at-start-of-clean-lines-that-are-subsequently-dirtied-vertical-rl.html [ Failure ]
 crbug.com/591099 fast/block/float/float-at-start-of-clean-lines-that-are-subsequently-dirtied.html [ Failure ]
 crbug.com/591099 fast/block/float/float-avoidance.html [ Failure ]
@@ -4420,12 +4240,9 @@
 crbug.com/591099 fast/block/float/floats-wrap-inside-inline-002.htm [ Failure ]
 crbug.com/591099 fast/block/float/floats-wrap-inside-inline-003.htm [ Failure ]
 crbug.com/591099 fast/block/float/floats-wrap-inside-inline-004.htm [ Failure ]
-crbug.com/591099 fast/block/float/floats-wrap-inside-inline-007.html [ Failure ]
+crbug.com/591099 fast/block/float/floats-wrap-inside-inline-007.html [ Failure Pass ]
 crbug.com/591099 fast/block/float/formatting-context-changes.html [ Crash Failure ]
 crbug.com/591099 fast/block/float/independent-align-positioning.html [ Failure ]
-crbug.com/591099 fast/block/float/intruding-float-add-in-sibling-block-on-static-position.html [ Failure Pass ]
-crbug.com/591099 fast/block/float/intruding-float-add-in-sibling-block-on-static-position2.html [ Crash Failure Pass ]
-crbug.com/591099 fast/block/float/intruding-painted-twice.html [ Failure ]
 crbug.com/591099 fast/block/float/logical-bottom-exceeds-layoutunit-max.html [ Failure ]
 crbug.com/591099 fast/block/float/marquee-shrink-to-avoid-floats.html [ Failure ]
 crbug.com/591099 fast/block/float/negative-margin-on-element-avoiding-floats-with-margin-on-parent.html [ Failure ]
@@ -4433,8 +4250,6 @@
 crbug.com/591099 fast/block/float/nested-clearance.html [ Failure ]
 crbug.com/591099 fast/block/float/nopaint-after-layer-destruction.html [ Failure ]
 crbug.com/591099 fast/block/float/nopaint-after-layer-destruction2.html [ Failure ]
-crbug.com/591099 fast/block/float/overhanging-float-add-in-static-position-block.html [ Crash Failure Pass ]
-crbug.com/591099 fast/block/float/overhanging-float-add-in-static-position-block2.html [ Crash Failure Pass ]
 crbug.com/591099 fast/block/float/overhanging-float-crashes-when-sibling-becomes-formatting-context.html [ Failure Pass ]
 crbug.com/591099 fast/block/float/overhanging-float-remove-from-fixed-position-block.html [ Failure ]
 crbug.com/591099 fast/block/float/overhanging-float-remove-from-fixed-position-block2.html [ Failure ]
@@ -4448,9 +4263,7 @@
 crbug.com/591099 fast/block/float/selection-gap-clip-out-tiger-crash.html [ Failure Pass ]
 crbug.com/591099 fast/block/float/shrink-to-avoid-float-complexity.html [ Failure ]
 crbug.com/591099 fast/block/float/shrink-to-fit-width.html [ Failure ]
-crbug.com/591099 fast/block/float/table-relayout.html [ Failure ]
 crbug.com/591099 fast/block/float/trailing-float-with-columns.html [ Failure ]
-crbug.com/591099 fast/block/float/vertical-move-relayout.html [ Failure ]
 crbug.com/591099 fast/block/float/width-update-after-clear.html [ Failure ]
 crbug.com/591099 fast/block/hr-border-box-sizing.html [ Failure ]
 crbug.com/591099 fast/block/hr-with-float.html [ Failure ]
@@ -4462,9 +4275,7 @@
 crbug.com/591099 fast/block/margin-collapse/005.html [ Failure ]
 crbug.com/591099 fast/block/margin-collapse/032.html [ Failure ]
 crbug.com/591099 fast/block/margin-collapse/033.html [ Failure ]
-crbug.com/591099 fast/block/margin-collapse/043.html [ Failure ]
 crbug.com/591099 fast/block/margin-collapse/057.html [ Failure ]
-crbug.com/591099 fast/block/margin-collapse/101.html [ Failure ]
 crbug.com/591099 fast/block/margin-collapse/103.html [ Failure ]
 crbug.com/591099 fast/block/margin-collapse/bfc-beside-float-complex-margin-collapsing.html [ Failure ]
 crbug.com/591099 fast/block/margin-collapse/block-inside-inline/001.html [ Failure ]
@@ -4498,36 +4309,19 @@
 crbug.com/591099 fast/block/positioning/047.html [ Failure ]
 crbug.com/591099 fast/block/positioning/055.html [ Failure ]
 crbug.com/591099 fast/block/positioning/056.html [ Failure ]
-crbug.com/591099 fast/block/positioning/058.html [ Crash Failure ]
 crbug.com/591099 fast/block/positioning/abs-inside-inline-rel.html [ Failure ]
 crbug.com/591099 fast/block/positioning/absolute-appended-to-inline.html [ Failure ]
 crbug.com/591099 fast/block/positioning/absolute-in-inline-dynamic.html [ Failure ]
-crbug.com/591099 fast/block/positioning/absolute-in-inline-ltr-2.html [ Failure ]
-crbug.com/591099 fast/block/positioning/absolute-in-inline-ltr-3.html [ Failure ]
-crbug.com/591099 fast/block/positioning/absolute-in-inline-ltr.html [ Failure ]
 crbug.com/591099 fast/block/positioning/absolute-in-inline-rtl-2.html [ Failure ]
 crbug.com/591099 fast/block/positioning/absolute-in-inline-rtl-3.html [ Failure ]
-crbug.com/591099 fast/block/positioning/absolute-in-inline-rtl-4.html [ Failure ]
+crbug.com/591099 fast/block/positioning/absolute-in-inline-rtl-4.html [ Failure Pass ]
 crbug.com/591099 fast/block/positioning/absolute-in-inline-rtl.html [ Failure ]
-crbug.com/591099 fast/block/positioning/absolute-in-inline-short-ltr.html [ Failure ]
 crbug.com/591099 fast/block/positioning/absolute-in-inline-short-rtl.html [ Failure ]
-crbug.com/591099 fast/block/positioning/absolute-length-of-neg-666666.html [ Failure ]
-crbug.com/591099 fast/block/positioning/absolute-position-direction.html [ Failure ]
-crbug.com/591099 fast/block/positioning/absolute-positioned-overconstrained.html [ Failure ]
-crbug.com/591099 fast/block/positioning/absolute-positioning-no-scrollbar.html [ Failure ]
 crbug.com/591099 fast/block/positioning/absolute-with-html-border-quirks.html [ Failure ]
 crbug.com/591099 fast/block/positioning/abspos-auto-left-and-width-change-parent-margin-left.html [ Failure ]
 crbug.com/591099 fast/block/positioning/auto-height-with-top-and-bottom.html [ Failure ]
-crbug.com/591099 fast/block/positioning/auto/001.html [ Failure ]
-crbug.com/591099 fast/block/positioning/auto/002.html [ Failure ]
-crbug.com/591099 fast/block/positioning/auto/003.html [ Failure ]
-crbug.com/591099 fast/block/positioning/auto/004.html [ Failure ]
 crbug.com/591099 fast/block/positioning/auto/005.html [ Failure ]
 crbug.com/591099 fast/block/positioning/auto/006.html [ Failure ]
-crbug.com/591099 fast/block/positioning/auto/vertical-lr/001.html [ Failure ]
-crbug.com/591099 fast/block/positioning/auto/vertical-lr/002.html [ Failure ]
-crbug.com/591099 fast/block/positioning/auto/vertical-lr/003.html [ Failure ]
-crbug.com/591099 fast/block/positioning/auto/vertical-lr/004.html [ Failure ]
 crbug.com/591099 fast/block/positioning/auto/vertical-lr/005.html [ Failure ]
 crbug.com/591099 fast/block/positioning/auto/vertical-lr/006.html [ Failure ]
 crbug.com/591099 fast/block/positioning/auto/vertical-lr/007.html [ Failure ]
@@ -4543,7 +4337,6 @@
 crbug.com/591099 fast/block/positioning/complex-percentage-height.html [ Crash Failure ]
 crbug.com/591099 fast/block/positioning/fixed-positioning-scrollbar-bug.html [ Failure ]
 crbug.com/591099 fast/block/positioning/flex-positioned-movement-layout-of-content-when-height-changes.html [ Failure ]
-crbug.com/591099 fast/block/positioning/height-change.html [ Failure ]
 crbug.com/591099 fast/block/positioning/hiding-inside-relpositioned-inline.html [ Failure ]
 crbug.com/591099 fast/block/positioning/hittest-on-relative-positioned-children.html [ Failure ]
 crbug.com/591099 fast/block/positioning/inline-block-relposition.html [ Failure Pass ]
@@ -4562,7 +4355,6 @@
 crbug.com/591099 fast/block/positioning/relative-with-implicit-height-containing-block.html [ Failure ]
 crbug.com/591099 fast/block/positioning/relayout-nested-positioned-elements-crash-2.html [ Crash Failure Pass ]
 crbug.com/591099 fast/block/positioning/relayout-nested-positioned-elements-crash.html [ Crash Failure ]
-crbug.com/591099 fast/block/positioning/relayout-on-position-change.html [ Failure ]
 crbug.com/591099 fast/block/positioning/replaced-inside-fixed-top-bottom.html [ Failure ]
 crbug.com/591099 fast/block/positioning/rtl-static-positioning-inline-block.html [ Crash Failure ]
 crbug.com/591099 fast/block/positioning/rtl-static-positioning.html [ Failure ]
@@ -4650,12 +4442,8 @@
 crbug.com/591099 fast/borders/bidi-012.html [ Failure ]
 crbug.com/591099 fast/borders/border-antialiasing.html [ Failure ]
 crbug.com/591099 fast/borders/border-color-visited.html [ Crash Failure ]
-crbug.com/591099 fast/borders/border-image-scaled.html [ Failure ]
 crbug.com/591099 fast/borders/border-image-width-negative.html [ Failure ]
 crbug.com/591099 fast/borders/border-radius-child.html [ Failure ]
-crbug.com/591099 fast/borders/border-radius-constraints-double.html [ Failure ]
-crbug.com/591099 fast/borders/border-radius-constraints.html [ Failure ]
-crbug.com/591099 fast/borders/border-radius-huge-assert.html [ Failure ]
 crbug.com/591099 fast/borders/border-radius-mask-canvas-all.html [ Crash Failure ]
 crbug.com/591099 fast/borders/border-radius-mask-canvas-border.html [ Failure ]
 crbug.com/591099 fast/borders/border-radius-mask-canvas-padding.html [ Failure ]
@@ -4669,7 +4457,6 @@
 crbug.com/591099 fast/borders/border-radius-wide-border-01.html [ Failure ]
 crbug.com/591099 fast/borders/border-styles-split.html [ Failure ]
 crbug.com/591099 fast/borders/border-width-percent.html [ Failure ]
-crbug.com/591099 fast/borders/different-color-borders.html [ Failure ]
 crbug.com/591099 fast/borders/fieldsetBorderRadius.html [ Crash Failure ]
 crbug.com/591099 fast/borders/inline-mask-overlay-image-outset-vertical-rl.html [ Failure ]
 crbug.com/591099 fast/borders/inline-mask-overlay-image-outset.html [ Failure ]
@@ -4878,7 +4665,6 @@
 crbug.com/591099 fast/css-grid-layout/grid-align-justify-margin-border-padding-vertical-rl.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-align-justify-margin-border-padding.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-align-justify-overflow.html [ Failure ]
-crbug.com/591099 fast/css-grid-layout/grid-align-justify-stretch-with-orthogonal-flows.html [ Failure Pass ]
 crbug.com/591099 fast/css-grid-layout/grid-align-justify-stretch.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-align.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-auto-columns-rows-auto-flow-resolution.html [ Failure ]
@@ -4890,8 +4676,7 @@
 crbug.com/591099 fast/css-grid-layout/grid-auto-flow-sparse.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-auto-flow-update.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-auto-repeat-inherit-initial-crash.html [ Failure ]
-crbug.com/591099 fast/css-grid-layout/grid-automatic-minimum-for-auto-rows.html [ Failure ]
-crbug.com/591099 fast/css-grid-layout/grid-change-fit-content-argument.html [ Failure Pass ]
+crbug.com/591099 fast/css-grid-layout/grid-automatic-minimum-for-auto-rows.html [ Failure Pass ]
 crbug.com/591099 fast/css-grid-layout/grid-columns-rows-get-set-multiple.html [ Timeout ]
 crbug.com/591099 fast/css-grid-layout/grid-columns-rows-get-set.html [ Timeout ]
 crbug.com/591099 fast/css-grid-layout/grid-container-change-explicit-grid-recompute-child.html [ Failure ]
@@ -4953,11 +4738,8 @@
 crbug.com/591099 fast/css-grid-layout/grid-item-order-paint-order.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-item-overflow-paint.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-item-position-changed-dynamic.html [ Failure ]
-crbug.com/591099 fast/css-grid-layout/grid-item-positioning-with-orthogonal-flows.html [ Failure Pass ]
 crbug.com/591099 fast/css-grid-layout/grid-item-removal-auto-placement-update.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-item-removal-track-breadth-update.html [ Failure Timeout ]
-crbug.com/591099 fast/css-grid-layout/grid-item-sizing-with-orthogonal-flows.html [ Failure Pass ]
-crbug.com/591099 fast/css-grid-layout/grid-item-spanning-and-orthogonal-flows.html [ Failure Pass ]
 crbug.com/591099 fast/css-grid-layout/grid-item-spanning-resolution.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-item-start-before-get-set.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-item-stretch-with-margins-borders-padding-vertical-lr.html [ Failure ]
@@ -5020,8 +4802,6 @@
 crbug.com/591099 fast/css-grid-layout/grid-template-shorthand-computed-style-crash.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-template-shorthand-get-set.html [ Timeout ]
 crbug.com/591099 fast/css-grid-layout/grid-template-shorthand-infinite-loop.html [ Failure ]
-crbug.com/591099 fast/css-grid-layout/grid-track-sizing-with-orthogonal-flows.html [ Failure Pass ]
-crbug.com/591099 fast/css-grid-layout/grid-track-sizing-with-percentages-and-orthogonal-flows.html [ Failure Pass ]
 crbug.com/591099 fast/css-grid-layout/grid-tracks-stretched-with-different-flex-factors-sum.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-with-zero-content-size-should-not-crash.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/implicit-columns-auto-resolution.html [ Failure ]
@@ -5097,7 +4877,6 @@
 crbug.com/591099 fast/css-intrinsic-dimensions/min-width.html [ Crash Failure ]
 crbug.com/591099 fast/css-intrinsic-dimensions/resize-inside-percent-width-overflow-hidden.html [ Failure ]
 crbug.com/591099 fast/css-intrinsic-dimensions/width-property-value.html [ Failure ]
-crbug.com/591099 fast/css-intrinsic-dimensions/width.html [ Crash Failure Pass ]
 crbug.com/591099 fast/css/001.html [ Crash Failure ]
 crbug.com/591099 fast/css/002.html [ Failure ]
 crbug.com/591099 fast/css/003.html [ Failure ]
@@ -5300,7 +5079,6 @@
 crbug.com/591099 fast/css/first-letter-capitalized.html [ Failure ]
 crbug.com/591099 fast/css/first-letter-crash-document-disposal.html [ Crash Failure ]
 crbug.com/591099 fast/css/first-letter-detach.html [ Failure ]
-crbug.com/591099 fast/css/first-letter-first-line-hover.html [ Failure ]
 crbug.com/591099 fast/css/first-letter-float-after-float.html [ Failure ]
 crbug.com/591099 fast/css/first-letter-float.html [ Failure ]
 crbug.com/591099 fast/css/first-letter-hover.html [ Failure ]
@@ -5309,9 +5087,9 @@
 crbug.com/591099 fast/css/first-letter-removed-added.html [ Failure ]
 crbug.com/591099 fast/css/first-letter-set-text.html [ Failure ]
 crbug.com/591099 fast/css/first-letter-visibility.html [ Failure ]
-crbug.com/591099 fast/css/first-line-change-color-direct.html [ Crash Failure ]
+crbug.com/591099 fast/css/first-line-change-color-direct.html [ Crash Failure Pass ]
 crbug.com/591099 fast/css/first-line-parent-style-different.html [ Failure ]
-crbug.com/591099 fast/css/first-line-style-for-before-after-content.html [ Failure ]
+crbug.com/591099 fast/css/first-line-style-for-before-after-content.html [ Failure Pass ]
 crbug.com/591099 fast/css/first-line-text-decoration-inherited-from-parent.html [ Failure ]
 crbug.com/591099 fast/css/first-line-text-decoration.html [ Failure ]
 crbug.com/591099 fast/css/first-of-type-pseudo-class.html [ Failure ]
@@ -5587,7 +5365,6 @@
 crbug.com/591099 fast/css/live-cssrules.html [ Failure Pass ]
 crbug.com/591099 fast/css/margin-bottom-form-element-quirk.html [ Failure ]
 crbug.com/591099 fast/css/margin-bottom-form-element-strict.html [ Failure Pass ]
-crbug.com/591099 fast/css/margin-collapse-top-margin-clearance.html [ Failure ]
 crbug.com/591099 fast/css/margin-start-end.html [ Failure ]
 crbug.com/591099 fast/css/margin-top-bottom-dynamic.html [ Failure ]
 crbug.com/591099 fast/css/marquee-in-template.html [ Crash Failure ]
@@ -5688,7 +5465,7 @@
 crbug.com/591099 fast/css/preferred-stylesheet-order.html [ Failure ]
 crbug.com/591099 fast/css/preferred-stylesheet-reversed-order.html [ Failure ]
 crbug.com/591099 fast/css/pseudo-any.html [ Crash Failure ]
-crbug.com/591099 fast/css/pseudo-cache-stale.html [ Failure ]
+crbug.com/591099 fast/css/pseudo-cache-stale.html [ Failure Pass ]
 crbug.com/591099 fast/css/pseudo-default-001.html [ Failure ]
 crbug.com/591099 fast/css/pseudo-default-002.html [ Failure ]
 crbug.com/591099 fast/css/pseudo-default-003.html [ Failure ]
@@ -5808,7 +5585,7 @@
 crbug.com/591099 fast/css/test-setting-canvas-color.html [ Failure ]
 crbug.com/591099 fast/css/text-align-webkit-match-parent.html [ Failure ]
 crbug.com/591099 fast/css/text-align.html [ Failure ]
-crbug.com/591099 fast/css/text-decorations-on-first-line-and-containing-block.html [ Failure ]
+crbug.com/591099 fast/css/text-decorations-on-first-line-and-containing-block.html [ Failure Pass ]
 crbug.com/734554 fast/css/text-indent-first-line-002.html [ Failure ]
 crbug.com/591099 fast/css/text-overflow-ellipsis-bidi.html [ Failure ]
 crbug.com/591099 fast/css/text-overflow-ellipsis-block-with-border-and-padding.html [ Failure ]
@@ -5875,8 +5652,8 @@
 crbug.com/591099 fast/css3-text/css3-text-decoration/stable/getComputedStyle-text-decoration.html [ Failure ]
 crbug.com/591099 fast/css3-text/css3-text-decoration/text-decoration-skip.html [ Failure ]
 crbug.com/591099 fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow.html [ Failure ]
-crbug.com/591099 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-first-line-decoration-vertical.html [ Crash Failure ]
-crbug.com/591099 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-first-line-decoration.html [ Crash Failure ]
+crbug.com/591099 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-first-line-decoration-vertical.html [ Crash Failure Pass ]
+crbug.com/591099 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-first-line-decoration.html [ Crash Failure Pass ]
 crbug.com/591099 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-auto.html [ Failure ]
 crbug.com/591099 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk.html [ Crash Failure ]
 crbug.com/591099 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-under.html [ Failure ]
@@ -5892,29 +5669,10 @@
 crbug.com/591099 fast/css3-text/css3-text-justify/text-justify-distribute.html [ Failure ]
 crbug.com/591099 fast/css3-text/css3-word-break/css3-word-break-keep-all.html [ Failure Pass ]
 crbug.com/591099 fast/css3-text/css3-word-break/word-break-all-rtl.html [ Failure ]
-crbug.com/591099 fast/css3-text/css3-word-break/word-break-all-wrap-with-100percent-floats.html [ Failure Pass ]
 crbug.com/591099 fast/css3-text/css3-word-break/word-break-all-wrap-with-floats.html [ Failure ]
 crbug.com/591099 fast/css3-text/css3-word-break/word-break-break-all-in-span.html [ Failure ]
-crbug.com/591099 fast/deprecated-flexbox/001.html [ Failure ]
 crbug.com/591099 fast/deprecated-flexbox/004.html [ Failure ]
-crbug.com/591099 fast/deprecated-flexbox/007.html [ Failure ]
-crbug.com/591099 fast/deprecated-flexbox/008.html [ Failure ]
 crbug.com/591099 fast/deprecated-flexbox/009-horizontal.html [ Failure ]
-crbug.com/591099 fast/deprecated-flexbox/009.html [ Failure ]
-crbug.com/591099 fast/deprecated-flexbox/010.html [ Failure ]
-crbug.com/591099 fast/deprecated-flexbox/011.html [ Failure ]
-crbug.com/591099 fast/deprecated-flexbox/012.html [ Failure ]
-crbug.com/591099 fast/deprecated-flexbox/013.html [ Failure ]
-crbug.com/591099 fast/deprecated-flexbox/014.html [ Crash Failure ]
-crbug.com/591099 fast/deprecated-flexbox/015.html [ Failure ]
-crbug.com/591099 fast/deprecated-flexbox/017.html [ Failure ]
-crbug.com/591099 fast/deprecated-flexbox/018.html [ Failure ]
-crbug.com/591099 fast/deprecated-flexbox/019.html [ Failure ]
-crbug.com/591099 fast/deprecated-flexbox/020.html [ Failure ]
-crbug.com/591099 fast/deprecated-flexbox/021.html [ Failure ]
-crbug.com/591099 fast/deprecated-flexbox/022.html [ Failure ]
-crbug.com/591099 fast/deprecated-flexbox/023.html [ Failure ]
-crbug.com/591099 fast/deprecated-flexbox/024.html [ Failure ]
 crbug.com/591099 fast/deprecated-flexbox/assert-generated-deprecated-flexbox.html [ Failure ]
 crbug.com/591099 fast/deprecated-flexbox/box-ordinal-group.html [ Failure ]
 crbug.com/591099 fast/deprecated-flexbox/child-flexing.html [ Failure ]
@@ -5998,7 +5756,6 @@
 crbug.com/591099 fast/dom/Element/element-traversal.html [ Failure ]
 crbug.com/591099 fast/dom/Element/fixed-position-offset-parent.html [ Failure ]
 crbug.com/591099 fast/dom/Element/getAttribute-check-case-sensitivity.html [ Failure ]
-crbug.com/591099 fast/dom/Element/getBoundingClientRect.html [ Failure ]
 crbug.com/591099 fast/dom/Element/id-in-formcollection.html [ Failure ]
 crbug.com/591099 fast/dom/Element/id-in-frame.html [ Failure ]
 crbug.com/591099 fast/dom/Element/id-in-getelement01.html [ Failure ]
@@ -6262,7 +6019,6 @@
 crbug.com/591099 fast/dom/Range/deleted-range-endpoints.html [ Failure ]
 crbug.com/591099 fast/dom/Range/detach-no-op.html [ Failure ]
 crbug.com/591099 fast/dom/Range/getClientRects-leading-trailing-whitespaces.html [ Failure ]
-crbug.com/591099 fast/dom/Range/getClientRects.html [ Crash Failure Pass ]
 crbug.com/591099 fast/dom/Range/insertNode-empty-fragment-crash.html [ Failure ]
 crbug.com/591099 fast/dom/Range/range-clone-empty.html [ Failure ]
 crbug.com/591099 fast/dom/Range/range-constructor.html [ Failure ]
@@ -6693,7 +6449,7 @@
 crbug.com/591099 fast/dom/replace-child-siblings.html [ Failure ]
 crbug.com/591099 fast/dom/replace-first-child.html [ Failure ]
 crbug.com/591099 fast/dom/replaced-image-map.html [ Failure ]
-crbug.com/591099 fast/dom/right-overflow-in-rtl.html [ Crash Failure ]
+crbug.com/591099 fast/dom/right-overflow-in-rtl.html [ Crash Failure Pass ]
 crbug.com/591099 fast/dom/root-client-size-iframe.html [ Failure ]
 crbug.com/591099 fast/dom/root-client-size.html [ Failure ]
 crbug.com/591099 fast/dom/row-inner-text.html [ Failure ]
@@ -7154,7 +6910,6 @@
 crbug.com/591099 fast/events/drag_and_drop_into_removed_on_focus.html [ Failure ]
 crbug.com/591099 fast/events/dragevent-constructor.html [ Failure ]
 crbug.com/591099 fast/events/drop-generate-user-gesture.html [ Failure ]
-crbug.com/591099 fast/events/drop-with-file-paths.html [ Failure ]
 crbug.com/591099 fast/events/event-attribute.html [ Failure Timeout ]
 crbug.com/591099 fast/events/event-attributes-after-exception.html [ Failure ]
 crbug.com/591099 fast/events/event-creation.html [ Failure ]
@@ -7327,7 +7082,7 @@
 crbug.com/591099 fast/events/mutation-during-replace-child.html [ Failure ]
 crbug.com/591099 fast/events/no-blur-on-enter-button.html [ Failure ]
 crbug.com/591099 fast/events/offsetX-offsetY.html [ Failure Timeout ]
-crbug.com/591099 fast/events/onbeforeunload-focused-iframe.html [ Failure ]
+crbug.com/591099 fast/events/onbeforeunload-focused-iframe.html [ Failure Pass ]
 crbug.com/591099 fast/events/onblur-remove.html [ Crash Failure ]
 crbug.com/591099 fast/events/onchange-passwordfield.html [ Failure ]
 crbug.com/591099 fast/events/onchange-range-slider.html [ Failure ]
@@ -7571,8 +7326,8 @@
 crbug.com/591099 fast/events/wheel/wheelevent-ctrl.html [ Failure ]
 crbug.com/591099 fast/events/wheel/wheelevent-document-createevent.html [ Failure ]
 crbug.com/591099 fast/events/wheel/wheelevent-handler-count.html [ Failure ]
-crbug.com/591099 fast/events/wheel/wheelevent-in-horizontal-scrollbar-in-rtl.html [ Failure ]
-crbug.com/591099 fast/events/wheel/wheelevent-in-vertical-scrollbar-in-rtl.html [ Failure ]
+crbug.com/591099 fast/events/wheel/wheelevent-in-horizontal-scrollbar-in-rtl.html [ Failure Pass ]
+crbug.com/591099 fast/events/wheel/wheelevent-in-vertical-scrollbar-in-rtl.html [ Failure Pass ]
 crbug.com/591099 fast/events/wheel/wheelevent-mousewheel-interaction.html [ Failure ]
 crbug.com/591099 fast/events/window-errorevent-01.html [ Failure ]
 crbug.com/591099 fast/events/window-errorevent-02.html [ Failure ]
@@ -8212,7 +7967,7 @@
 crbug.com/591099 fast/forms/range/slider-thumb-stylability.html [ Failure ]
 crbug.com/591099 fast/forms/range/slider-transformed.html [ Failure Pass ]
 crbug.com/591099 fast/forms/range/slider-zoomed.html [ Failure ]
-crbug.com/591099 fast/forms/range/thumbslider-crash.html [ Failure ]
+crbug.com/591099 fast/forms/range/thumbslider-crash.html [ Failure Pass ]
 crbug.com/591099 fast/forms/range/thumbslider-no-parent-slider.html [ Failure ]
 crbug.com/591099 fast/forms/removed-image-as-property.html [ Crash Failure ]
 crbug.com/591099 fast/forms/render-text-crash.html [ Crash Failure ]
@@ -8959,10 +8714,6 @@
 crbug.com/591099 fast/html/tab-order.html [ Crash Failure ]
 crbug.com/591099 fast/html/unknown-tag.html [ Crash Failure ]
 crbug.com/591099 fast/inline-block/002.html [ Failure ]
-crbug.com/591099 fast/inline-block/003.html [ Failure ]
-crbug.com/591099 fast/inline-block/004.html [ Failure ]
-crbug.com/591099 fast/inline-block/005.html [ Failure ]
-crbug.com/591099 fast/inline-block/14498-positionForCoordinates.html [ Failure ]
 crbug.com/591099 fast/inline-block/baseline-vertical.html [ Failure ]
 crbug.com/591099 fast/inline-block/contenteditable-baseline.html [ Failure ]
 crbug.com/591099 fast/inline-block/float-both-whitespace.html [ Failure ]
@@ -8971,7 +8722,6 @@
 crbug.com/591099 fast/inline-block/float-trailing-whitespace.html [ Failure ]
 crbug.com/591099 fast/inline-block/inline-block-vertical-align-2.html [ Failure ]
 crbug.com/591099 fast/inline-block/inline-block-vertical-align.html [ Failure ]
-crbug.com/591099 fast/inline-block/overflow-clip.html [ Failure ]
 crbug.com/591099 fast/inline-block/tricky-baseline.html [ Failure ]
 crbug.com/591099 fast/inline-block/vertical-align-top-and-bottom-2.html [ Failure ]
 crbug.com/591099 fast/inline/absolute-positioned-inline-in-centred-block.html [ Failure ]
@@ -8994,7 +8744,7 @@
 crbug.com/591099 fast/inline/fixed-pos-with-transform-container-moves-with-abspos-parent.html [ Failure ]
 crbug.com/591099 fast/inline/inline-body-with-inline-child.html [ Failure ]
 crbug.com/591099 fast/inline/inline-borders-with-bidi-override.html [ Failure ]
-crbug.com/591099 fast/inline/inline-box-adjust-position-crash.html [ Crash Failure ]
+crbug.com/591099 fast/inline/inline-box-adjust-position-crash.html [ Crash Failure Pass ]
 crbug.com/591099 fast/inline/inline-box-background-long-image.html [ Failure ]
 crbug.com/591099 fast/inline/inline-box-background-repeat-x.html [ Failure ]
 crbug.com/591099 fast/inline/inline-box-background-repeat-y.html [ Failure ]
@@ -9002,7 +8752,6 @@
 crbug.com/591099 fast/inline/inline-destroy-dirty-lines-crash.html [ Failure ]
 crbug.com/591099 fast/inline/inline-fixed-position-boundingbox.html [ Failure ]
 crbug.com/591099 fast/inline/inline-focus-ring-under-absolute-enclosing-relative-div.html [ Failure ]
-crbug.com/591099 fast/inline/inline-focus-ring.html [ Failure ]
 crbug.com/591099 fast/inline/inline-offsetLeft-relpos.html [ Crash Failure ]
 crbug.com/591099 fast/inline/inline-position-top-align.html [ Failure ]
 crbug.com/591099 fast/inline/inline-relative-offset-boundingbox.html [ Failure ]
@@ -9351,8 +9100,6 @@
 crbug.com/591099 fast/lists/007.html [ Crash Failure ]
 crbug.com/591099 fast/lists/008-vertical.html [ Crash Failure ]
 crbug.com/591099 fast/lists/008.html [ Crash Failure ]
-crbug.com/591099 fast/lists/009-vertical.html [ Crash Failure ]
-crbug.com/591099 fast/lists/009.html [ Crash Failure ]
 crbug.com/591099 fast/lists/alpha-boundary-values.html [ Crash Failure ]
 crbug.com/591099 fast/lists/alpha-list-wrap.html [ Crash Failure ]
 crbug.com/591099 fast/lists/anonymous-items.html [ Crash Failure ]
@@ -9409,7 +9156,6 @@
 crbug.com/591099 fast/lists/list-marker-padding-overflow-hidden-rtl.html [ Failure ]
 crbug.com/591099 fast/lists/list-marker-padding-overflow-hidden.html [ Failure ]
 crbug.com/591099 fast/lists/list-marker-with-line-height.html [ Crash Failure ]
-crbug.com/591099 fast/lists/list-style-none-crash.html [ Failure ]
 crbug.com/591099 fast/lists/list-style-type-dynamic-change.html [ Crash Failure ]
 crbug.com/591099 fast/lists/marker-before-empty-inline.html [ Crash Failure ]
 crbug.com/591099 fast/lists/marker-image-error.html [ Crash Failure ]
@@ -9631,13 +9377,12 @@
 crbug.com/591099 fast/multicol/float-after-break-after.html [ Failure ]
 crbug.com/591099 fast/multicol/float-beside-bfc.html [ Failure ]
 crbug.com/591099 fast/multicol/float-big-line.html [ Failure ]
-crbug.com/591099 fast/multicol/float-break.html [ Failure Pass ]
 crbug.com/591099 fast/multicol/float-content-break.html [ Failure ]
 crbug.com/591099 fast/multicol/float-margin-at-row-boundary-fixed-multicol-height.html [ Failure ]
 crbug.com/591099 fast/multicol/float-margin-at-row-boundary.html [ Failure ]
 crbug.com/591099 fast/multicol/float-moved-by-child-line-and-unbreakable.html [ Failure ]
 crbug.com/591099 fast/multicol/float-paginate-empty-lines.html [ Failure ]
-crbug.com/591099 fast/multicol/float-paginate.html [ Failure ]
+crbug.com/591099 fast/multicol/float-paginate.html [ Failure Pass ]
 crbug.com/591099 fast/multicol/float-with-margin-moved-by-child-block-and-unbreakable.html [ Failure ]
 crbug.com/591099 fast/multicol/float-with-margin-moved-by-child-block.html [ Failure ]
 crbug.com/591099 fast/multicol/float-with-margin-moved-by-child-line-and-unbreakable.html [ Failure ]
@@ -9707,7 +9452,6 @@
 crbug.com/591099 fast/multicol/newmulticol/breaks-3-columns-3.html [ Failure ]
 crbug.com/591099 fast/multicol/newmulticol/clipping-top-overflow.html [ Failure ]
 crbug.com/591099 fast/multicol/newmulticol/fixed-height-fill-balance.html [ Failure ]
-crbug.com/591099 fast/multicol/newmulticol/hide-box-vertical-lr.html [ Failure Pass ]
 crbug.com/591099 fast/multicol/newmulticol/hide-box-vertical-rl.html [ Failure Pass ]
 crbug.com/591099 fast/multicol/newmulticol/orphans-and-widows-balance.html [ Failure ]
 crbug.com/591099 fast/multicol/null-lastFloat-in-removeFloatingObjectsBelow.html [ Failure ]
@@ -9809,12 +9553,11 @@
 crbug.com/591099 fast/multicol/vertical-lr/column-count-with-rules.html [ Failure ]
 crbug.com/591099 fast/multicol/vertical-lr/column-rules.html [ Failure ]
 crbug.com/591099 fast/multicol/vertical-lr/composited-relpos-overlapping-will-change.html [ Failure ]
-crbug.com/591099 fast/multicol/vertical-lr/float-avoidance.html [ Failure Pass ]
 crbug.com/591099 fast/multicol/vertical-lr/float-big-line.html [ Failure ]
 crbug.com/591099 fast/multicol/vertical-lr/float-break.html [ Failure ]
 crbug.com/591099 fast/multicol/vertical-lr/float-content-break.html [ Failure ]
 crbug.com/591099 fast/multicol/vertical-lr/float-edge.html [ Failure ]
-crbug.com/591099 fast/multicol/vertical-lr/float-paginate.html [ Failure ]
+crbug.com/591099 fast/multicol/vertical-lr/float-paginate.html [ Failure Pass ]
 crbug.com/591099 fast/multicol/vertical-lr/gap-non-negative.html [ Failure ]
 crbug.com/591099 fast/multicol/vertical-lr/image-inside-nested-blocks-with-border.html [ Failure ]
 crbug.com/591099 fast/multicol/vertical-lr/unsplittable-inline-block.html [ Failure ]
@@ -9850,11 +9593,9 @@
 crbug.com/591099 fast/multicol/zeroColumnCount.html [ Failure ]
 crbug.com/591099 fast/overflow/001.html [ Failure ]
 crbug.com/591099 fast/overflow/002.html [ Failure ]
-crbug.com/591099 fast/overflow/005.html [ Failure ]
 crbug.com/591099 fast/overflow/006.html [ Failure ]
 crbug.com/591099 fast/overflow/007.html [ Failure ]
 crbug.com/591099 fast/overflow/add-visual-overflow-and-change-container-position.html [ Failure ]
-crbug.com/591099 fast/overflow/border-radius-clipping.html [ Crash Failure ]
 crbug.com/591099 fast/overflow/child-100percent-height-inside-fixed-container-with-overflow-auto.html [ Failure ]
 crbug.com/591099 fast/overflow/clip-rects-fixed-ancestor.html [ Failure ]
 crbug.com/591099 fast/overflow/float-in-relpositioned.html [ Failure ]
@@ -9863,7 +9604,6 @@
 crbug.com/591099 fast/overflow/hidden-html-auto-body.html [ Failure ]
 crbug.com/591099 fast/overflow/hidden-html-hidden-body.html [ Failure Pass ]
 crbug.com/591099 fast/overflow/hidden-html-paged-body.html [ Crash Failure ]
-crbug.com/591099 fast/overflow/hit-test-overflow-controls.html [ Failure ]
 crbug.com/591099 fast/overflow/hit-test-overflow-hidden-with-box-shadow.html [ Failure ]
 crbug.com/591099 fast/overflow/image-selection-highlight.html [ Failure ]
 crbug.com/591099 fast/overflow/infiniteRecursion.html [ Crash Failure ]
@@ -9892,7 +9632,6 @@
 crbug.com/591099 fast/overflow/scroll-vertical-not-horizontal.html [ Failure ]
 crbug.com/591099 fast/overflow/scrollRevealButton.html [ Failure ]
 crbug.com/591099 fast/overflow/scrollbar-click-retains-focus.html [ Crash Failure ]
-crbug.com/591099 fast/overflow/scrollbar-position-update.html [ Failure ]
 crbug.com/591099 fast/overflow/scrollbar-restored-and-then-locked.html [ Crash Failure ]
 crbug.com/591099 fast/overflow/scrollbar-restored.html [ Failure ]
 crbug.com/591099 fast/overflow/setting-scrollTop-after-hide-show.html [ Failure ]
@@ -10059,15 +9798,10 @@
 crbug.com/591099 fast/reflections/transparent-reflected-sublayers.html [ Failure ]
 crbug.com/591099 fast/regex/non-pattern-characters.html [ Failure ]
 crbug.com/591099 fast/regex/syntax-errors.html [ Failure ]
-crbug.com/591099 fast/replaced/002.html [ Failure Pass ]
-crbug.com/591099 fast/replaced/003.html [ Failure Pass ]
 crbug.com/591099 fast/replaced/008.html [ Crash Failure ]
-crbug.com/591099 fast/replaced/absolute-image-sizing.html [ Failure ]
 crbug.com/591099 fast/replaced/absolute-position-auto-width-and-left-and-right-and-intrinsic-width-quirks.html [ Crash Failure ]
 crbug.com/591099 fast/replaced/absolute-position-auto-width-and-left-and-right-and-intrinsic-width.html [ Crash Failure ]
 crbug.com/591099 fast/replaced/absolute-position-percentage-height.html [ Failure ]
-crbug.com/591099 fast/replaced/absolute-position-with-auto-height-and-top-and-bottom.html [ Failure ]
-crbug.com/591099 fast/replaced/absolute-position-with-auto-width-and-left-and-right.html [ Failure ]
 crbug.com/591099 fast/replaced/aspect-ratio-of-replaced-child-with-auto-height.html [ Failure ]
 crbug.com/591099 fast/replaced/aspect-ratio-of-replaced-child-with-max-height.html [ Failure ]
 crbug.com/591099 fast/replaced/available-height-for-content.html [ Crash Failure ]
@@ -10090,19 +9824,11 @@
 crbug.com/591099 fast/replaced/image-map-on-inline-image.html [ Failure ]
 crbug.com/591099 fast/replaced/image-map.html [ Failure ]
 crbug.com/591099 fast/replaced/image-onload.html [ Failure Pass ]
-crbug.com/591099 fast/replaced/image-resize-width.html [ Failure ]
-crbug.com/591099 fast/replaced/image-solid-color-with-alpha.html [ Failure ]
 crbug.com/591099 fast/replaced/inline-box-wrapper-handover.html [ Failure ]
 crbug.com/591099 fast/replaced/invalid-object-with-fallback.html [ Crash Failure ]
 crbug.com/591099 fast/replaced/max-width-percent.html [ Failure ]
-crbug.com/591099 fast/replaced/maxheight-percent.html [ Failure ]
-crbug.com/591099 fast/replaced/maxheight-pxs.html [ Failure ]
 crbug.com/591099 fast/replaced/maxwidth-percent.html [ Failure ]
-crbug.com/591099 fast/replaced/maxwidth-pxs.html [ Failure ]
-crbug.com/591099 fast/replaced/minheight-percent.html [ Failure ]
-crbug.com/591099 fast/replaced/minheight-pxs.html [ Failure ]
 crbug.com/591099 fast/replaced/minwidth-percent.html [ Failure ]
-crbug.com/591099 fast/replaced/minwidth-pxs.html [ Failure ]
 crbug.com/591099 fast/replaced/no-focus-ring-embed.html [ Failure Timeout ]
 crbug.com/591099 fast/replaced/no-focus-ring-iframe.html [ Timeout ]
 crbug.com/591099 fast/replaced/no-focus-ring-object.html [ Failure Pass Timeout ]
@@ -10111,7 +9837,6 @@
 crbug.com/591099 fast/replaced/object-with-non-empty-classid-triggers-fallback.html [ Crash Failure ]
 crbug.com/591099 fast/replaced/outline-replaced-elements.html [ Failure Pass ]
 crbug.com/591099 fast/replaced/percent-height-in-anonymous-block-in-table.html [ Failure ]
-crbug.com/591099 fast/replaced/percent-height-in-anonymous-block-widget.html [ Crash Failure ]
 crbug.com/591099 fast/replaced/percent-height-in-anonymous-block.html [ Failure ]
 crbug.com/591099 fast/replaced/percentage-height-with-dynamic-container-height.html [ Failure ]
 crbug.com/591099 fast/replaced/preferred-widths.html [ Failure ]
@@ -10119,7 +9844,6 @@
 crbug.com/591099 fast/replaced/replaced-breaking.html [ Failure ]
 crbug.com/591099 fast/replaced/replaced-child-of-absolute-with-auto-height.html [ Failure ]
 crbug.com/591099 fast/replaced/replaced-element-with-percentage-height-anonymous-block-parent.html [ Failure ]
-crbug.com/591099 fast/replaced/selection-rect-in-table-cell.html [ Failure ]
 crbug.com/591099 fast/replaced/selection-rect-transform.html [ Crash Failure ]
 crbug.com/591099 fast/replaced/selection-rect.html [ Failure Pass ]
 crbug.com/591099 fast/replaced/table-percent-height-text-controls.html [ Failure ]
@@ -10127,8 +9851,6 @@
 crbug.com/591099 fast/replaced/table-percent-width.html [ Failure ]
 crbug.com/591099 fast/replaced/table-replaced-element.html [ Failure ]
 crbug.com/591099 fast/replaced/vertical-lr/absolute-position-percentage-width.html [ Failure ]
-crbug.com/591099 fast/replaced/vertical-lr/absolute-position-with-auto-height-and-top-and-bottom.html [ Failure ]
-crbug.com/591099 fast/replaced/vertical-lr/absolute-position-with-auto-width-and-left-and-right.html [ Failure ]
 crbug.com/591099 fast/replaced/vertical-resize-100percent-element.html [ Failure ]
 crbug.com/591099 fast/replaced/vertical-rl/absolute-position-percentage-width.html [ Failure ]
 crbug.com/591099 fast/replaced/vertical-rl/absolute-position-with-auto-height-and-top-and-bottom.html [ Failure ]
@@ -10457,16 +10179,9 @@
 crbug.com/591099 fast/table/032.html [ Failure ]
 crbug.com/591099 fast/table/035-vertical.html [ Failure ]
 crbug.com/591099 fast/table/035.html [ Failure ]
-crbug.com/591099 fast/table/040-vertical.html [ Failure ]
-crbug.com/591099 fast/table/040.html [ Failure ]
-crbug.com/591099 fast/table/100-percent-cell-width.html [ Failure ]
 crbug.com/591099 fast/table/absolute-table-percent-lengths.html [ Failure ]
-crbug.com/591099 fast/table/add-before-anonymous-child.html [ Failure ]
 crbug.com/591099 fast/table/add-cell-with-large-border.html [ Failure ]
-crbug.com/591099 fast/table/align-right-within-left-aligned-div.html [ Failure Pass ]
 crbug.com/591099 fast/table/anonymous-table-no-baseline-align.html [ Failure ]
-crbug.com/591099 fast/table/append-cells.html [ Failure ]
-crbug.com/591099 fast/table/append-cells2.html [ Failure ]
 crbug.com/591099 fast/table/assert-autotablelayout-maxlogicalwidth.html [ Failure ]
 crbug.com/591099 fast/table/auto-table-layout-colgroup-removal-crash.html [ Failure ]
 crbug.com/591099 fast/table/auto-with-percent-height-vertical.html [ Failure ]
@@ -10481,22 +10196,16 @@
 crbug.com/591099 fast/table/bad-replaced-sizing-preferred-logical-widths.html [ Failure ]
 crbug.com/591099 fast/table/baseline-align-rowspan.html [ Failure ]
 crbug.com/591099 fast/table/border-changes.html [ Failure ]
-crbug.com/591099 fast/table/border-collapsing/002-vertical.html [ Failure ]
-crbug.com/591099 fast/table/border-collapsing/002.html [ Crash Failure ]
 crbug.com/591099 fast/table/border-collapsing/003-vertical.html [ Failure ]
 crbug.com/591099 fast/table/border-collapsing/004-vertical.html [ Crash Failure ]
 crbug.com/591099 fast/table/border-collapsing/004.html [ Failure ]
 crbug.com/591099 fast/table/border-collapsing/border-collapsing-head-foot-vertical.html [ Failure ]
-crbug.com/591099 fast/table/border-collapsing/border-collapsing-head-foot.html [ Failure ]
 crbug.com/591099 fast/table/border-collapsing/dynamic-border-width-change.html [ Failure ]
-crbug.com/591099 fast/table/border-collapsing/rtl-border-collapsing-vertical.html [ Failure ]
-crbug.com/591099 fast/table/border-collapsing/rtl-border-collapsing.html [ Failure ]
 crbug.com/591099 fast/table/border-recalc.html [ Failure ]
 crbug.com/591099 fast/table/canvas-column-in-column-group.html [ Failure ]
 crbug.com/591099 fast/table/caption-encloses-overhanging-float.html [ Failure ]
 crbug.com/591099 fast/table/caption-in-inline.html [ Failure ]
 crbug.com/591099 fast/table/caption-orthogonal-writing-mode-sizing.html [ Failure ]
-crbug.com/591099 fast/table/cell-absolute-child.html [ Failure ]
 crbug.com/591099 fast/table/cell-height-min-intrinsic.html [ Failure ]
 crbug.com/591099 fast/table/cellIndex-of-cell-with-different-parents.html [ Failure ]
 crbug.com/591099 fast/table/change-cell-border-width.html [ Failure ]
@@ -10505,7 +10214,6 @@
 crbug.com/591099 fast/table/change-table-border-width.html [ Crash Failure ]
 crbug.com/591099 fast/table/change-tbody-border-width-crash.html [ Failure ]
 crbug.com/591099 fast/table/change-tbody-border-width.html [ Crash Failure ]
-crbug.com/591099 fast/table/click-near-anonymous-table.html [ Failure ]
 crbug.com/591099 fast/table/col-width-span-expand.html [ Failure ]
 crbug.com/591099 fast/table/colgroup-relative.html [ Failure ]
 crbug.com/591099 fast/table/colspan-with-empty-cells-needing-extra-width.html [ Failure ]
@@ -10537,11 +10245,9 @@
 crbug.com/591099 fast/table/fixed-table-layout/fixed-layout-column-colspan-wrong-size.html [ Failure ]
 crbug.com/591099 fast/table/fixed-table-layout/prepend-in-fixed-table.html [ Failure ]
 crbug.com/591099 fast/table/fixed-table-layout/table-with-percent-width.html [ Failure ]
-crbug.com/591099 fast/table/fixed-table-non-cell-in-row.html [ Failure ]
 crbug.com/591099 fast/table/fixed-widths-exceed-available.html [ Failure ]
 crbug.com/591099 fast/table/form-with-non-table-display-inside-table-elements.html [ Failure ]
 crbug.com/591099 fast/table/form-with-table-style.html [ Crash Failure ]
-crbug.com/591099 fast/table/generated-caption.html [ Failure ]
 crbug.com/591099 fast/table/height-percent-test-vertical.html [ Failure ]
 crbug.com/591099 fast/table/height-percent-test.html [ Failure ]
 crbug.com/591099 fast/table/hittest-tablecell-bottom-edge.html [ Failure Timeout ]
@@ -10555,9 +10261,6 @@
 crbug.com/591099 fast/table/inline-table-added-to-continuation.html [ Failure ]
 crbug.com/591099 fast/table/inline-table-margin-baseline.html [ Failure ]
 crbug.com/591099 fast/table/inner-percent-width-affects-outer-floated-div.html [ Failure ]
-crbug.com/591099 fast/table/insert-before-anonymous-ancestors.html [ Failure ]
-crbug.com/591099 fast/table/insert-cell-before-form.html [ Failure ]
-crbug.com/591099 fast/table/insert-row-before-form.html [ Failure ]
 crbug.com/591099 fast/table/invisible-cell-background.html [ Failure ]
 crbug.com/591099 fast/table/large-shrink-wrapped-width.html [ Failure ]
 crbug.com/591099 fast/table/margins-flipped-text-direction.html [ Failure ]
@@ -10584,14 +10287,11 @@
 crbug.com/591099 fast/table/percent-height-overflow-hidden-content-in-cell.html [ Failure ]
 crbug.com/591099 fast/table/percent-height-overflow-scroll-content-in-cell.html [ Failure ]
 crbug.com/591099 fast/table/percent-height-overflow-visible-content-in-cell.html [ Failure ]
-crbug.com/591099 fast/table/percent-heights.html [ Failure ]
 crbug.com/591099 fast/table/percent-widths-float.html [ Failure ]
 crbug.com/591099 fast/table/percent-widths-stretch-vertical.html [ Failure ]
 crbug.com/591099 fast/table/percent-widths-total-less-than-one.html [ Failure ]
-crbug.com/591099 fast/table/prepend-in-anonymous-table.html [ Failure ]
 crbug.com/591099 fast/table/recalc-section-first-body-crash-main.html [ Failure ]
 crbug.com/591099 fast/table/remove-cell-with-large-border-width.html [ Failure ]
-crbug.com/591099 fast/table/remove-td-display-none.html [ Failure ]
 crbug.com/591099 fast/table/resize-table-binding-cell.html [ Failure ]
 crbug.com/591099 fast/table/resize-table-cell.html [ Failure ]
 crbug.com/591099 fast/table/resize-table-row.html [ Failure ]
@@ -10600,7 +10300,6 @@
 crbug.com/591099 fast/table/rowindex-comment-nodes.html [ Failure ]
 crbug.com/591099 fast/table/rowindex.html [ Failure ]
 crbug.com/591099 fast/table/rowspan-only-rows-height-distribution.html [ Failure ]
-crbug.com/591099 fast/table/rtl-cell-display-none-assert.html [ Failure ]
 crbug.com/591099 fast/table/split-anonymous-crash.html [ Failure ]
 crbug.com/591099 fast/table/split-table-no-section-update-crash.html [ Failure ]
 crbug.com/591099 fast/table/split-table-section-before-anonymous-block-crash.html [ Failure ]
@@ -10714,27 +10413,17 @@
 crbug.com/591099 fast/text/apply-start-width-after-skipped-text.html [ Failure ]
 crbug.com/591099 fast/text/atomic-inline-before-ellipsis.html [ Failure ]
 crbug.com/591099 fast/text/atsui-kerning-and-ligatures.html [ Failure ]
-crbug.com/591099 fast/text/atsui-multiple-renderers.html [ Failure ]
-crbug.com/591099 fast/text/atsui-partial-selection.html [ Failure ]
-crbug.com/591099 fast/text/atsui-small-caps-punctuation-size.html [ Failure ]
 crbug.com/591099 fast/text/atsui-spacing-features.html [ Failure ]
 crbug.com/591099 fast/text/basic/002.html [ Failure ]
 crbug.com/591099 fast/text/basic/004.html [ Failure ]
-crbug.com/591099 fast/text/basic/012.html [ Failure ]
 crbug.com/591099 fast/text/basic/014.html [ Failure ]
 crbug.com/591099 fast/text/basic/015.html [ Failure ]
-crbug.com/591099 fast/text/basic/generic-family-reset.html [ Failure ]
-crbug.com/591099 fast/text/bidi-embedding-pop-and-push-same.html [ Failure ]
 crbug.com/591099 fast/text/bidi-explicit-embedding-past-end.html [ Failure Pass ]
-crbug.com/591099 fast/text/bidi-isolate-embedding-crash.html [ Failure ]
+crbug.com/591099 fast/text/bidi-isolate-embedding-crash.html [ Failure Pass ]
 crbug.com/591099 fast/text/bidi-isolate-nextlinebreak-failure.html [ Failure Pass ]
 crbug.com/591099 fast/text/bidi-reverse-runs-crash.html [ Failure ]
 crbug.com/591099 fast/text/break-word-pre-wrap.html [ Failure ]
 crbug.com/591099 fast/text/break-word-with-floats.html [ Failure Pass ]
-crbug.com/591099 fast/text/break-word.html [ Failure ]
-crbug.com/591099 fast/text/capitalize-empty-generated-string.html [ Failure ]
-crbug.com/591099 fast/text/capitalize-preserve-nbsp.html [ Failure ]
-crbug.com/591099 fast/text/cg-fallback-bolding.html [ Failure ]
 crbug.com/591099 fast/text/chromium-linux-fallback-crash.html [ Failure ]
 crbug.com/591099 fast/text/chromium-linux-fontconfig-renderstyle.html [ Failure ]
 crbug.com/591099 fast/text/chromium-mac-duplicate-ime-composition.html [ Failure ]
@@ -10744,8 +10433,6 @@
 crbug.com/591099 fast/text/computed-line-height-and-font-size-with-font-size-adjust.html [ Failure ]
 crbug.com/591099 fast/text/container-align-with-inlines.html [ Failure ]
 crbug.com/591099 fast/text/decorations-with-text-combine.html [ Failure ]
-crbug.com/591099 fast/text/delete-hard-break-character.html [ Failure ]
-crbug.com/591099 fast/text/drawBidiText.html [ Failure ]
 crbug.com/591099 fast/text/ellipsis-at-edge-of-ltr-text-in-rtl-flow.html [ Failure ]
 crbug.com/591099 fast/text/ellipsis-at-edge-of-rtl-text-in-ltr-flow.html [ Failure ]
 crbug.com/591099 fast/text/ellipsis-in-absolute-block.html [ Failure ]
@@ -10777,14 +10464,11 @@
 crbug.com/591099 fast/text/emphasis-complex.html [ Failure ]
 crbug.com/591099 fast/text/emphasis-ellipsis-complextext.html [ Failure ]
 crbug.com/591099 fast/text/emphasis-overlap.html [ Failure ]
-crbug.com/591099 fast/text/fake-italic.html [ Failure ]
 crbug.com/591099 fast/text/fallback-for-custom-font.html [ Failure ]
 crbug.com/591099 fast/text/find-kana.html [ Timeout ]
 crbug.com/591099 fast/text/find-russian.html [ Failure ]
 crbug.com/591099 fast/text/find-soft-hyphen.html [ Failure ]
 crbug.com/591099 fast/text/firstline/001.html [ Failure ]
-crbug.com/591099 fast/text/firstline/002.html [ Failure ]
-crbug.com/591099 fast/text/firstline/003.html [ Failure ]
 crbug.com/591099 fast/text/font-ascent-mac.html [ Failure ]
 crbug.com/591099 fast/text/font-fallback-synthetic-italics.html [ Failure ]
 crbug.com/591099 fast/text/font-initial.html [ Failure ]
@@ -10797,49 +10481,34 @@
 crbug.com/591099 fast/text/hide-atomic-inlines-after-ellipsis.html [ Crash Failure ]
 crbug.com/591099 fast/text/hyphenate-character.html [ Failure ]
 crbug.com/591099 fast/text/hyphens/hyphens-none.html [ Failure ]
-crbug.com/591099 fast/text/in-rendered-text-rtl.html [ Failure ]
 crbug.com/591099 fast/text/international/arabic-justify.html [ Failure ]
-crbug.com/591099 fast/text/international/arabic-vertical-offset.html [ Failure ]
 crbug.com/591099 fast/text/international/bidi-AN-after-empty-run.html [ Failure ]
 crbug.com/591099 fast/text/international/bidi-LDB-2-CSS.html [ Failure ]
 crbug.com/591099 fast/text/international/bidi-LDB-2-HTML.html [ Failure ]
 crbug.com/591099 fast/text/international/bidi-LDB-2-formatting-characters.html [ Failure ]
-crbug.com/591099 fast/text/international/bidi-european-terminators.html [ Failure ]
 crbug.com/591099 fast/text/international/bidi-ignored-for-first-child-inline.html [ Failure ]
-crbug.com/591099 fast/text/international/bidi-innertext.html [ Failure ]
+crbug.com/591099 fast/text/international/bidi-innertext.html [ Failure Pass ]
 crbug.com/591099 fast/text/international/bidi-linebreak-001.html [ Failure ]
 crbug.com/591099 fast/text/international/bidi-linebreak-002.html [ Failure ]
 crbug.com/591099 fast/text/international/bidi-linebreak-003.html [ Failure ]
 crbug.com/591099 fast/text/international/bidi-listbox-atsui.html [ Failure ]
 crbug.com/591099 fast/text/international/bidi-listbox.html [ Failure ]
 crbug.com/591099 fast/text/international/bidi-mirror-he-ar.html [ Failure ]
-crbug.com/591099 fast/text/international/bidi-neutral-directionality-paragraph-start.html [ Failure ]
-crbug.com/591099 fast/text/international/bidi-neutral-run.html [ Failure ]
 crbug.com/591099 fast/text/international/block-flow-parser-test.html [ Crash Failure ]
-crbug.com/591099 fast/text/international/bold-bengali.html [ Failure ]
 crbug.com/591099 fast/text/international/cjk-segmentation.html [ Crash Failure ]
 crbug.com/591099 fast/text/international/combining-marks-position.html [ Failure ]
-crbug.com/591099 fast/text/international/complex-character-based-fallback.html [ Failure ]
-crbug.com/591099 fast/text/international/complex-joining-using-gpos.html [ Failure ]
-crbug.com/591099 fast/text/international/danda-space.html [ Failure ]
 crbug.com/591099 fast/text/international/draw-complex-text-from-to.html [ Failure ]
-crbug.com/591099 fast/text/international/hebrew-vowels.html [ Failure ]
-crbug.com/591099 fast/text/international/hindi-whitespace.html [ Failure ]
 crbug.com/591099 fast/text/international/iso-8859-8.html [ Failure ]
 crbug.com/591099 fast/text/international/listbox-width-rtl.html [ Crash Failure ]
-crbug.com/591099 fast/text/international/plane2.html [ Failure ]
 crbug.com/591099 fast/text/international/rtl-caret.html [ Failure ]
 crbug.com/591099 fast/text/international/rtl-negative-letter-spacing.html [ Failure ]
 crbug.com/591099 fast/text/international/rtl-text-wrapping.html [ Failure ]
-crbug.com/591099 fast/text/international/rtl-white-space-pre-wrap.html [ Crash Failure ]
 crbug.com/591099 fast/text/international/shape-across-elements.html [ Failure ]
 crbug.com/591099 fast/text/international/text-combine-image-test.html [ Failure ]
 crbug.com/591099 fast/text/international/text-combine-parser-test.html [ Crash Failure ]
-crbug.com/591099 fast/text/international/text-spliced-font.html [ Failure Pass ]
 crbug.com/591099 fast/text/international/thai-cursor-position.html [ Crash Failure ]
 crbug.com/591099 fast/text/international/thai-offsetForPosition-inside-character.html [ Failure ]
 crbug.com/591099 fast/text/international/unicode-bidi-plaintext.html [ Failure ]
-crbug.com/591099 fast/text/international/vertical-text-glyph-test.html [ Failure Pass ]
 crbug.com/591099 fast/text/international/vertical-text-metrics-test.html [ Crash Failure ]
 crbug.com/591099 fast/text/ipa-tone-letters.html [ Failure ]
 crbug.com/591099 fast/text/justified-selection-at-edge.html [ Failure ]
@@ -10854,11 +10523,8 @@
 crbug.com/591099 fast/text/large-text-composed-char.html [ Failure Timeout ]
 crbug.com/591099 fast/text/letter-spacing-negative-opacity.html [ Failure ]
 crbug.com/591099 fast/text/line-break-between-text-nodes-latin1.html [ Failure ]
-crbug.com/591099 fast/text/line-initial-and-final-swashes.html [ Failure ]
 crbug.com/591099 fast/text/long-word.html [ Failure Timeout ]
 crbug.com/591099 fast/text/midword-break-after-breakable-char.html [ Failure ]
-crbug.com/591099 fast/text/midword-break-before-surrogate-pair.html [ Failure ]
-crbug.com/591099 fast/text/midword-break-hang.html [ Failure ]
 crbug.com/591099 fast/text/monospace-width-cache.html [ Failure ]
 crbug.com/591099 fast/text/multiglyph-characters.html [ Failure ]
 crbug.com/591099 fast/text/nested-bidi-isolate-crash.html [ Failure ]
@@ -10897,68 +10563,47 @@
 crbug.com/591099 fast/text/selection-rect-line-height-too-small.html [ Failure ]
 crbug.com/591099 fast/text/selection-with-inline-padding.html [ Failure ]
 crbug.com/591099 fast/text/shadow-no-blur.html [ Failure ]
-crbug.com/591099 fast/text/shadow-translucent-fill.html [ Failure ]
 crbug.com/591099 fast/text/shaping/same-script-different-lang.html [ Failure ]
-crbug.com/591099 fast/text/shaping/shaping-selection-rect.html [ Failure ]
 crbug.com/591099 fast/text/shaping/shaping-width-initialized.html [ Failure ]
-crbug.com/591099 fast/text/should-use-atsui.html [ Failure ]
 crbug.com/591099 fast/text/soft-hyphen-2.html [ Failure ]
 crbug.com/591099 fast/text/soft-hyphen-4.html [ Failure ]
 crbug.com/591099 fast/text/soft-hyphen-5.html [ Failure ]
 crbug.com/591099 fast/text/soft-hyphen-min-preferred-width.html [ Failure ]
 crbug.com/591099 fast/text/soft-hyphen-overflow.html [ Failure ]
-crbug.com/591099 fast/text/stale-TextLayout-from-first-line.html [ Failure ]
+crbug.com/591099 fast/text/stale-TextLayout-from-first-line.html [ Failure Pass ]
 crbug.com/591099 fast/text/sub-pixel/text-scaling-pixel.html [ Failure Timeout ]
 crbug.com/591099 fast/text/tab-min-size.html [ Failure ]
 crbug.com/591099 fast/text/text-between-two-brs-in-nowrap-overflow.html [ Failure ]
-crbug.com/591099 fast/text/text-combine-shrink-to-fit.html [ Failure Pass ]
 crbug.com/591099 fast/text/text-container-bounding-rect.html [ Crash Failure ]
 crbug.com/591099 fast/text/text-iterator-crash.html [ Crash Failure ]
 crbug.com/591099 fast/text/text-large-negative-letter-spacing-with-opacity.html [ Failure ]
 crbug.com/591099 fast/text/text-letter-spacing.html [ Failure ]
-crbug.com/591099 fast/text/text-shadow-no-default-color.html [ Failure ]
 crbug.com/591099 fast/text/text-transform-nontext-node-crash.xhtml [ Failure ]
 crbug.com/591099 fast/text/textIteratorNilRenderer.html [ Failure ]
 crbug.com/591099 fast/text/trailing-white-space-2.html [ Failure ]
 crbug.com/591099 fast/text/trailing-white-space.html [ Failure ]
 crbug.com/591099 fast/text/vertical-rl-rtl-linebreak.html [ Failure ]
-crbug.com/591099 fast/text/vertical-surrogate-pair.html [ Failure ]
 crbug.com/591099 fast/text/wbr-in-pre-crash.html [ Failure ]
-crbug.com/591099 fast/text/wbr-pre.html [ Failure ]
-crbug.com/591099 fast/text/wbr-styled.html [ Failure ]
 crbug.com/591099 fast/text/wbr.html [ Failure ]
-crbug.com/591099 fast/text/webfont-synthetic-bold.html [ Failure ]
-crbug.com/591099 fast/text/whitespace/001.html [ Failure ]
 crbug.com/591099 fast/text/whitespace/018.html [ Failure ]
-crbug.com/591099 fast/text/whitespace/019.html [ Failure ]
-crbug.com/591099 fast/text/whitespace/022.html [ Failure ]
-crbug.com/591099 fast/text/whitespace/023.html [ Failure ]
 crbug.com/591099 fast/text/whitespace/024.html [ Failure ]
 crbug.com/591099 fast/text/whitespace/028.html [ Failure ]
-crbug.com/591099 fast/text/whitespace/029.html [ Failure ]
 crbug.com/591099 fast/text/whitespace/inline-whitespace-wrapping-3.html [ Failure Pass ]
 crbug.com/591099 fast/text/whitespace/inline-whitespace-wrapping-4.html [ Failure Pass ]
 crbug.com/591099 fast/text/whitespace/inline-whitespace-wrapping-5.html [ Failure Pass ]
 crbug.com/591099 fast/text/whitespace/normal-after-nowrap-breaking.html [ Crash Failure ]
-crbug.com/591099 fast/text/whitespace/nowrap-clear-float.html [ Failure Pass ]
 crbug.com/591099 fast/text/whitespace/nowrap-line-break-after-white-space.html [ Failure ]
 crbug.com/591099 fast/text/whitespace/nowrap-previous-trailing-space.html [ Failure ]
 crbug.com/591099 fast/text/whitespace/nowrap-trailing-space.html [ Failure ]
-crbug.com/591099 fast/text/whitespace/pre-newline-box-test.html [ Failure ]
-crbug.com/591099 fast/text/whitespace/pre-wrap-last-char.html [ Failure ]
-crbug.com/591099 fast/text/whitespace/pre-wrap-overflow-selection.html [ Failure ]
 crbug.com/591099 fast/text/whitespace/pre-wrap-spaces-after-newline.html [ Failure ]
 crbug.com/591099 fast/text/whitespace/select-new-line-with-line-break-normal.html [ Failure ]
 crbug.com/591099 fast/text/whitespace/tab-character-basics.html [ Failure ]
 crbug.com/591099 fast/text/whitespace/whitespace-in-pre.html [ Failure ]
 crbug.com/591099 fast/text/wide-preformatted.html [ Failure ]
-crbug.com/591099 fast/text/word-break-run-rounding.html [ Failure ]
-crbug.com/591099 fast/text/word-break-soft-hyphen.html [ Failure ]
 crbug.com/591099 fast/text/word-break.html [ Failure Pass ]
 crbug.com/591099 fast/text/word-space-between-inlines.html [ Failure ]
 crbug.com/591099 fast/text/word-space.html [ Failure ]
 crbug.com/591099 fast/text/writing-root-with-overflow-clip-baseline.html [ Crash Failure Pass ]
-crbug.com/591099 fast/text/zero-font-size.html [ Failure ]
 crbug.com/591099 fast/text/zero-width-characters-complex-script.html [ Failure ]
 crbug.com/591099 fast/text/zero-width-characters.html [ Failure ]
 crbug.com/591099 fast/tokenizer/001.html [ Failure ]
@@ -11080,7 +10725,6 @@
 crbug.com/591099 fast/writing-mode/auto-sizing-orthogonal-flows.html [ Failure ]
 crbug.com/591099 fast/writing-mode/background-vertical-lr.html [ Failure ]
 crbug.com/591099 fast/writing-mode/background-vertical-rl.html [ Failure ]
-crbug.com/591099 fast/writing-mode/baseline-inline-replaced-002.html [ Failure Pass ]
 crbug.com/591099 fast/writing-mode/basic-vertical-line.html [ Failure ]
 crbug.com/591099 fast/writing-mode/block-level-images.html [ Failure ]
 crbug.com/591099 fast/writing-mode/border-image-vertical-lr.html [ Failure ]
@@ -11088,12 +10732,8 @@
 crbug.com/591099 fast/writing-mode/border-radius-clipping-vertical-lr.html [ Failure ]
 crbug.com/591099 fast/writing-mode/border-styles-vertical-lr.html [ Failure ]
 crbug.com/591099 fast/writing-mode/border-styles-vertical-rl.html [ Failure ]
-crbug.com/591099 fast/writing-mode/border-vertical-lr.html [ Failure Pass ]
 crbug.com/591099 fast/writing-mode/borders.html [ Failure ]
 crbug.com/591099 fast/writing-mode/box-shadow-horizontal-tb-tile-edge.html [ Failure ]
-crbug.com/591099 fast/writing-mode/broken-ideograph-small-caps.html [ Failure Pass ]
-crbug.com/591099 fast/writing-mode/broken-ideographic-font.html [ Failure Pass ]
-crbug.com/591099 fast/writing-mode/english-lr-text.html [ Failure Pass ]
 crbug.com/591099 fast/writing-mode/english-rl-text.html [ Failure ]
 crbug.com/591099 fast/writing-mode/fallback-orientation.html [ Failure ]
 crbug.com/591099 fast/writing-mode/flipped-blocks-hit-test-line-edges.html [ Failure ]
@@ -11101,8 +10741,6 @@
 crbug.com/591099 fast/writing-mode/flipped-blocks-inline-map-local-to-container.html [ Crash Failure ]
 crbug.com/591099 fast/writing-mode/flipped-blocks-text-map-local-to-container.html [ Failure ]
 crbug.com/591099 fast/writing-mode/inline-direction-positioning.html [ Crash Failure ]
-crbug.com/591099 fast/writing-mode/japanese-lr-selection.html [ Failure Pass ]
-crbug.com/591099 fast/writing-mode/japanese-lr-text.html [ Failure Pass ]
 crbug.com/591099 fast/writing-mode/japanese-rl-selection.html [ Failure ]
 crbug.com/591099 fast/writing-mode/japanese-rl-text-with-broken-font.html [ Failure ]
 crbug.com/591099 fast/writing-mode/japanese-rl-text.html [ Failure ]
@@ -11123,7 +10761,6 @@
 crbug.com/591099 fast/writing-mode/text-combine-justify.html [ Failure ]
 crbug.com/591099 fast/writing-mode/text-combine-line-break.html [ Failure ]
 crbug.com/591099 fast/writing-mode/text-combine-various-fonts.html [ Failure ]
-crbug.com/591099 fast/writing-mode/text-orientation-basic.html [ Failure ]
 crbug.com/591099 fast/writing-mode/vertical-baseline-alignment.html [ Failure ]
 crbug.com/591099 fast/writing-mode/vertical-font-fallback.html [ Failure ]
 crbug.com/591099 fast/writing-mode/vertical-inline-block-hittest.html [ Crash Failure ]
@@ -11285,7 +10922,7 @@
 crbug.com/591099 fullscreen/full-screen-iframe-allowed.html [ Crash Failure ]
 crbug.com/591099 fullscreen/full-screen-iframe-legacy.html [ Failure ]
 crbug.com/591099 fullscreen/full-screen-iframe-not-allowed.html [ Failure ]
-crbug.com/591099 fullscreen/full-screen-iframe-without-allow-attribute-allowed-from-parent.html [ Failure ]
+crbug.com/591099 fullscreen/full-screen-iframe-without-allow-attribute-allowed-from-parent.html [ Failure Timeout ]
 crbug.com/591099 fullscreen/full-screen-placeholder.html [ Failure ]
 crbug.com/591099 fullscreen/full-screen-request-removed.html [ Failure ]
 crbug.com/591099 fullscreen/full-screen-table-section.html [ Failure ]
@@ -11384,7 +11021,7 @@
 crbug.com/591099 html/details_summary/details-clone.html [ Crash Failure ]
 crbug.com/591099 html/details_summary/details-keyboard-show-hide.html [ Crash Failure ]
 crbug.com/591099 html/details_summary/details-marker-style.html [ Crash Failure ]
-crbug.com/591099 html/details_summary/details-mouse-click.html [ Crash Failure ]
+crbug.com/591099 html/details_summary/details-mouse-click.html [ Crash Failure Pass ]
 crbug.com/591099 html/details_summary/details-nested-1.html [ Crash Failure ]
 crbug.com/591099 html/details_summary/details-nested-2.html [ Crash Failure ]
 crbug.com/591099 html/details_summary/details-no-summary1.html [ Crash Failure ]
@@ -11572,7 +11209,7 @@
 crbug.com/591099 http/tests/cache/subresource-fragment-identifier.html [ Crash Failure ]
 crbug.com/591099 http/tests/cache/subresource-multiple-instances.html [ Crash Failure ]
 crbug.com/591099 http/tests/cache/subresource-revalidation-referrer.html [ Failure ]
-crbug.com/591099 http/tests/cache/x-frame-options-304.html [ Failure ]
+crbug.com/591099 http/tests/cache/x-frame-options-304.html [ Failure Pass ]
 crbug.com/591099 http/tests/cache/xhr-body.html [ Crash Failure ]
 crbug.com/591099 http/tests/cache/xhr-vary-header.html [ Crash Failure ]
 crbug.com/591099 http/tests/cache/zero-length-xhr.html [ Failure ]
@@ -11717,7 +11354,6 @@
 crbug.com/591099 http/tests/inspector-enabled/resource-tree/resource-tree-mimetype.html [ Failure ]
 crbug.com/591099 http/tests/inspector-enabled/shadow-dom-rules-restart.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector-enabled/shadow-dom-rules.html [ Crash Failure ]
-crbug.com/591099 http/tests/inspector-protocol/network/disable-interception-midway.js [ Failure Pass Timeout ]
 crbug.com/591099 http/tests/inspector-unit/viewport-datagrid-items-attached-to-dom.js [ Failure ]
 crbug.com/591099 http/tests/inspector-unit/viewport-datagrid-items-expandable-attached-to-dom.js [ Failure ]
 crbug.com/591099 http/tests/inspector/appcache/appcache-iframe-manifests.html [ Crash Failure Timeout ]
@@ -11732,11 +11368,11 @@
 crbug.com/591099 http/tests/inspector/bindings/bindings-frame-navigate.html [ Failure Timeout ]
 crbug.com/591099 http/tests/inspector/bindings/bindings-main-frame-navigated.html [ Failure Timeout ]
 crbug.com/591099 http/tests/inspector/bindings/bindings-multiple-frames.html [ Crash Failure Timeout ]
-crbug.com/591099 http/tests/inspector/bindings/contentscripts-bindings-multiple-frames.html [ Crash Failure ]
+crbug.com/591099 http/tests/inspector/bindings/contentscripts-bindings-multiple-frames.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector/bindings/contentscripts-navigator-multiple-frames.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector/bindings/dynamic-bindings-frame-attach-detach.html [ Failure Timeout ]
 crbug.com/591099 http/tests/inspector/bindings/dynamic-navigator-frame-attach-detach.html [ Failure Timeout ]
-crbug.com/591099 http/tests/inspector/bindings/livelocation-main-frame-navigated.html [ Failure ]
+crbug.com/591099 http/tests/inspector/bindings/livelocation-main-frame-navigated.html [ Failure Timeout ]
 crbug.com/591099 http/tests/inspector/bindings/navigator-frame-attach-detach.html [ Failure Timeout ]
 crbug.com/591099 http/tests/inspector/bindings/navigator-frame-navigate.html [ Failure Timeout ]
 crbug.com/591099 http/tests/inspector/bindings/navigator-main-frame-navigated.html [ Failure Timeout ]
@@ -11767,10 +11403,10 @@
 crbug.com/591099 http/tests/inspector/debugger/fetch-breakpoints.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector/elements/elements-linkify-attributes.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector/elements/event-listeners-framework-with-service-worker.html [ Crash Failure ]
-crbug.com/591099 http/tests/inspector/elements/html-link-import.html [ Crash Failure ]
+crbug.com/591099 http/tests/inspector/elements/html-link-import.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector/elements/styles/edit-css-with-source-url.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector/elements/styles/import-added-through-js-crash.html [ Crash Failure ]
-crbug.com/591099 http/tests/inspector/elements/styles/inline-stylesheet-sourceurl-and-sourcemapurl.html [ Crash Failure ]
+crbug.com/591099 http/tests/inspector/elements/styles/inline-stylesheet-sourceurl-and-sourcemapurl.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector/elements/styles/selector-line-deprecated.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector/elements/styles/selector-line-sourcemap-header-deprecated.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector/elements/styles/selector-line-sourcemap-header.html [ Crash Failure Timeout ]
@@ -11871,7 +11507,7 @@
 crbug.com/591099 http/tests/inspector/network/request-name-path.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/network/request-parameters-decoding.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/network/resource-priority.html [ Crash Failure ]
-crbug.com/591099 http/tests/inspector/network/script-as-text-loading-long-url.html [ Crash Failure ]
+crbug.com/591099 http/tests/inspector/network/script-as-text-loading-long-url.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector/network/script-as-text-loading-with-caret.html [ Failure ]
 crbug.com/591099 http/tests/inspector/network/subresource-integrity-number-of-requests-for-script.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/network/subresource-integrity-number-of-requests-for-stylesheet.html [ Crash Failure ]
@@ -12701,7 +12337,7 @@
 crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-data-saver.html [ Failure Timeout ]
 crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-headers-async.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-headers-sync.html [ Failure ]
-crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-header-lowercase.html [ Failure ]
+crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-header-lowercase.html [ Failure Timeout ]
 crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-header-sorted.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-headers-origin.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/access-control-preflight-request-invalid-status-301.html [ Failure ]
@@ -12915,14 +12551,14 @@
 crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-image-not-loaded.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-inheritance.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-latin1.html [ Failure ]
-crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-mimetype-mixed-case.html [ Failure ]
+crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-mimetype-mixed-case.html [ Failure Timeout ]
 crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-missing-file-exception.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-multiple-open.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-no-content-length-onProgress-response-type-blob.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-no-content-length-onProgress.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-no-content-type-with-text.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-no-content-type.html [ Failure ]
-crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-onProgress-open-should-zero-length.html [ Failure ]
+crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-onProgress-open-should-zero-length.html [ Failure Timeout ]
 crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-open-empty-method.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-overridemimetype-content-type-header.html [ Failure ]
 crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-overridemimetype-mixed-case.html [ Failure ]
@@ -13123,7 +12759,7 @@
 crbug.com/591099 inspector-protocol/accessibility/accessibility-nameSources-labelledby.js [ Crash Failure Timeout ]
 crbug.com/591099 inspector-protocol/accessibility/accessibility-nameSources-visiblity.js [ Crash Failure Timeout ]
 crbug.com/591099 inspector-protocol/css/css-add-rule.js [ Timeout ]
-crbug.com/591099 inspector-protocol/css/css-get-platform-fonts.js [ Failure ]
+crbug.com/591099 inspector-protocol/css/css-get-platform-fonts.js [ Failure Pass ]
 crbug.com/591099 inspector-protocol/css/css-set-style-text.js [ Timeout ]
 crbug.com/591099 inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot.js [ Crash Failure Timeout ]
 crbug.com/591099 inspector-protocol/emulation/device-emulation-small-dw.js [ Failure ]
@@ -13326,7 +12962,7 @@
 crbug.com/591099 inspector/elements/edit/set-outer-html.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/edit/shadow-dom-modify-chardata.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/edit/switch-panels-while-editing-as-html.html [ Crash Failure Timeout ]
-crbug.com/591099 inspector/elements/edit/undo-dom-edits-2.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/edit/undo-dom-edits-2.html [ Crash Failure Timeout ]
 crbug.com/591099 inspector/elements/edit/undo-dom-edits.html [ Crash Failure Timeout ]
 crbug.com/591099 inspector/elements/edit/undo-set-outer-html-2.html [ Crash Failure Timeout ]
 crbug.com/591099 inspector/elements/edit/undo-set-outer-html.html [ Crash Failure ]
@@ -13343,9 +12979,9 @@
 crbug.com/591099 inspector/elements/elements-panel-selection-after-delete.html [ Crash Failure Timeout ]
 crbug.com/591099 inspector/elements/elements-panel-selection-on-refresh.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/elements-panel-structure.html [ Crash Failure ]
-crbug.com/591099 inspector/elements/elements-panel-styles.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/elements-panel-styles.html [ Crash Failure Timeout ]
 crbug.com/591099 inspector/elements/elements-tab-stops.html [ Crash Failure ]
-crbug.com/591099 inspector/elements/elements-treeoutline-copy.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/elements-treeoutline-copy.html [ Crash Failure Timeout ]
 crbug.com/591099 inspector/elements/event-listener-sidebar-custom-framework.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/event-listener-sidebar-jquery1.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/event-listener-sidebar-jquery2.html [ Crash Failure ]
@@ -13353,7 +12989,7 @@
 crbug.com/591099 inspector/elements/event-listener-sidebar.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/event-listeners-about-blank.html [ Crash Failure Timeout ]
 crbug.com/591099 inspector/elements/expand-recursively.html [ Crash Failure ]
-crbug.com/591099 inspector/elements/hide-shortcut.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/hide-shortcut.html [ Crash Failure Timeout ]
 crbug.com/591099 inspector/elements/highlight/highlight-css-shapes-outside-scroll.html [ Crash Failure Timeout ]
 crbug.com/591099 inspector/elements/highlight/highlight-css-shapes-outside.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/highlight/highlight-dom-updates.html [ Crash Failure Timeout ]
@@ -13378,7 +13014,7 @@
 crbug.com/591099 inspector/elements/shadow/breadcrumb-shadow-roots.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/shadow/create-shadow-root.html [ Crash Failure Timeout ]
 crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-1.html [ Crash Failure ]
-crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-2.html [ Crash Failure ]
+crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-2.html [ Crash Failure Timeout ]
 crbug.com/591099 inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-3.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/shadow/inspect-deep-shadow-element.html [ Crash Failure ]
 crbug.com/591099 inspector/elements/shadow/reveal-shadow-dom-node.html [ Crash Failure ]
@@ -14456,7 +14092,6 @@
 crbug.com/591099 paint/invalidation/negative-shadow-box-shrink.html [ Failure ]
 crbug.com/591099 paint/invalidation/negative-text-indent-with-overflow-hidden.html [ Failure ]
 crbug.com/591099 paint/invalidation/nested-fixed-iframe-scrolled.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/no-caret-repaint-in-non-content-editable-element.html [ Failure ]
 crbug.com/591099 paint/invalidation/offset-change-wrong-invalidation-with-float.html [ Crash Failure ]
 crbug.com/591099 paint/invalidation/opacity-change-on-overflow-float.html [ Failure ]
 crbug.com/591099 paint/invalidation/outline-add-repaint.html [ Failure Pass ]
@@ -14563,7 +14198,6 @@
 crbug.com/591099 paint/invalidation/scrollbar-invalidation-on-resize.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/scrollbar-parts.html [ Failure ]
 crbug.com/591099 paint/invalidation/scrolled-iframe-scrollbar-change.html [ Failure ]
-crbug.com/591099 paint/invalidation/search-field-cancel.html [ Crash Failure ]
 crbug.com/591099 paint/invalidation/select-option-background-color.html [ Failure ]
 crbug.com/591099 paint/invalidation/selected-replaced.html [ Failure ]
 crbug.com/591099 paint/invalidation/selection-after-delete.html [ Failure ]
@@ -14641,7 +14275,6 @@
 crbug.com/591099 paint/invalidation/svg/transform-foreign-object.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/svg/use-instanceRoot-event-bubbling.xhtml [ Timeout ]
 crbug.com/591099 paint/invalidation/svg/use-setAttribute-crash.svg [ Failure Pass ]
-crbug.com/591099 paint/invalidation/table-cell-collapsed-border.html [ Failure ]
 crbug.com/591099 paint/invalidation/table-cell-move.html [ Failure ]
 crbug.com/591099 paint/invalidation/table-cell-overflow.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/table-cell-vertical-overflow.html [ Failure ]
@@ -14803,7 +14436,7 @@
 crbug.com/591099 presentation/presentation-controller-close-connection.html [ Crash Pass Timeout ]
 crbug.com/591099 presentation/presentation-controller-connection-closed-by-receiver.html [ Crash Pass Timeout ]
 crbug.com/591099 presentation/presentation-controller-terminate-connection.html [ Crash Pass Timeout ]
-crbug.com/591099 presentation/presentation-receiver-terminate-connection.html [ Crash Pass Timeout ]
+crbug.com/591099 presentation/presentation-receiver-terminate-connection.html [ Crash Failure Pass Timeout ]
 crbug.com/591099 presentation/presentation-start-error.html [ Crash Failure Pass Timeout ]
 crbug.com/591099 presentation/presentation-start.html [ Crash Pass Timeout ]
 crbug.com/591099 presentation/presentationconnectionavailableevent-ctor-mock.html [ Crash Pass Timeout ]
@@ -16029,23 +15662,19 @@
 crbug.com/591099 tables/hittesting/filltable-stress.html [ Pass Timeout ]
 crbug.com/591099 tables/layering/paint-test-layering-1.html [ Failure ]
 crbug.com/591099 tables/layering/paint-test-layering-2.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug10565.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug10633.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug109043.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug110566.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug113235-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug113235-2.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug11384q.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug12008.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug126742.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug1271.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug12908-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug1302.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug131020-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug131020.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug131020_iframe.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug13105.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug13118.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug133948.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug137388-3.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug149275-1.html [ Failure ]
@@ -16053,43 +15682,29 @@
 crbug.com/591099 tables/mozilla/bugs/bug154780.html [ Crash Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug16012.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug16252.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug17130-1.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug17130-2.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug17138.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug18359.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug18440.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug18664.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug18955.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug19061-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug19061-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug19599.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug196870.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug2050.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug20579.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug20804.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug215629.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug219693-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug219693-2.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug22019.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug221784-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug23151.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug23235.html [ Crash Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug24200.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug2469.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug2479-3.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug25086.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug2684.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug269566.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug27038-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug27038-2.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug2773.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug2886.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug28928.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug29326.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug2947.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug2962.html [ Crash Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug2981-2.html [ Failure Pass ]
-crbug.com/591099 tables/mozilla/bugs/bug2997.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug30559.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug30692.html [ Crash Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug3191.html [ Crash Failure ]
@@ -16099,19 +15714,13 @@
 crbug.com/591099 tables/mozilla/bugs/bug3309-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug33137.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug3454.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug38916.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug3977.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug4093.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug42187.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug4284.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug43204.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug43854-1.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug44523.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug4527.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla/bugs/bug4576.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug46480-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug4849-2.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug48827.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug50695-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug50695-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug51140.html [ Failure ]
@@ -16122,22 +15731,17 @@
 crbug.com/591099 tables/mozilla/bugs/bug57828-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug57828.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug5798.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug5835.html [ Crash Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug58402-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug60992.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug6304.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug63785.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug641-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug647.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug68912.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug69187.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug7112-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug7112-2.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug7121-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug727.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug7342.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug7471.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug7714.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug82946-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug82946-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug83786.html [ Crash Failure Pass ]
@@ -16148,8 +15752,6 @@
 crbug.com/591099 tables/mozilla/bugs/bug88524.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug8858.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug8950.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug9123-1.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug9123-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug97383.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla/bugs/bug98196.html [ Failure ]
 crbug.com/591099 tables/mozilla/collapsing_borders/bug41262-3.html [ Crash Failure ]
@@ -16160,114 +15762,16 @@
 crbug.com/591099 tables/mozilla/core/col_span.html [ Failure ]
 crbug.com/591099 tables/mozilla/core/margins.html [ Failure ]
 crbug.com/591099 tables/mozilla/core/table_heights.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/col_span.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/colgroup_align_center.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/colgroup_align_justify.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/colgroup_align_left.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/colgroup_align_right.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/colgroup_span.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/colgroup_valign_baseline.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/colgroup_valign_bottom.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/colgroup_valign_middle.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/colgroup_valign_top.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/colgroup_width_pct.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/colgroup_width_px.html [ Failure ]
 crbug.com/591099 tables/mozilla/marvin/tables_align_center.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_aqua.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_aqua_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_black.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_black_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_blue.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_blue_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_fuchsia.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_fuchsia_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_gray.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_gray_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_green.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_green_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_lime.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_lime_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_maroon.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_maroon_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_navy.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_navy_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_olive.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_olive_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_purple.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_purple_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_red.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_red_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_silver.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_silver_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_teal.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_teal_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_white.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_white_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_yellow.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_bgcolor_yellow_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_caption_align_bot.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_caption_align_top.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tables_cellpadding_pct.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tbody_align_center.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tbody_align_char.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tbody_align_justify.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tbody_align_left.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tbody_align_right.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tbody_char.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tfoot_align_center.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tfoot_align_char.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tfoot_align_justify.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tfoot_align_left.html [ Crash Failure ]
-crbug.com/591099 tables/mozilla/marvin/tfoot_align_right.html [ Failure ]
 crbug.com/591099 tables/mozilla/marvin/tfoot_char.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/thead_align_center.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/thead_align_char.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/thead_align_justify.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/thead_align_left.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/thead_align_right.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/thead_char.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_aqua_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_black.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_black_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_blue.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_blue_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_fuchsia.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_fuchsia_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_gray.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_gray_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_green.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_green_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_lime.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_lime_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_maroon.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_maroon_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_navy.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_navy_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_olive.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_olive_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_purple.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_purple_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_red.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_red_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_silver.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_silver_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_teal.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_teal_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_white.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_white_rgb.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_yellow.html [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_yellow_rgb.html [ Failure ]
 crbug.com/591099 tables/mozilla/marvin/x_table.xml [ Failure ]
 crbug.com/591099 tables/mozilla/marvin/x_table_align_center.xml [ Failure ]
-crbug.com/591099 tables/mozilla/other/test3.html [ Failure ]
-crbug.com/591099 tables/mozilla/other/test6.html [ Failure ]
 crbug.com/591099 tables/mozilla/other/wa_table_thtd_rowspan.html [ Crash Failure ]
 crbug.com/591099 tables/mozilla/other/wa_table_tr_align.html [ Crash Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug1010.html [ Crash Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug104898.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug1055-2.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug1128.html [ Failure ]
-crbug.com/591099 tables/mozilla_expected_failures/bugs/bug11331.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug14007-2.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug14489.html [ Crash Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug19526.html [ Failure ]
@@ -16280,9 +15784,6 @@
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug3166-17.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug3166-18.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug33784.html [ Failure ]
-crbug.com/591099 tables/mozilla_expected_failures/bugs/bug42043.html [ Failure ]
-crbug.com/591099 tables/mozilla_expected_failures/bugs/bug4294.html [ Failure ]
-crbug.com/591099 tables/mozilla_expected_failures/bugs/bug51000.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug61042-1.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug61042-2.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug7113.html [ Failure ]
@@ -16303,11 +15804,6 @@
 crbug.com/591099 tables/mozilla_expected_failures/marvin/table_overflow_caption_left.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/marvin/table_overflow_caption_right.html [ Crash Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/marvin/table_overflow_caption_top.html [ Crash Failure ]
-crbug.com/591099 tables/mozilla_expected_failures/marvin/tables_caption_align_left.html [ Failure ]
-crbug.com/591099 tables/mozilla_expected_failures/marvin/tables_caption_align_right.html [ Failure ]
-crbug.com/591099 tables/mozilla_expected_failures/marvin/tables_cellspacing_pct.html [ Failure ]
-crbug.com/591099 tables/mozilla_expected_failures/other/empty_cells.html [ Failure ]
-crbug.com/591099 tables/mozilla_expected_failures/other/test4.html [ Failure ]
 crbug.com/591099 touchadjustment/big-div.html [ Failure ]
 crbug.com/591099 touchadjustment/block-testing.html [ Failure ]
 crbug.com/591099 touchadjustment/context-menu-select-text.html [ Failure ]
@@ -16830,11 +16326,9 @@
 crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/clear-applies-to-012.xht [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/float-applies-to-008.xht [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/float-replaced-width-002.xht [ Crash Failure ]
-crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/floats-005.xht [ Crash Failure ]
+crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/floats-005.xht [ Crash Failure Pass ]
 crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/floats-036.xht [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/floats-143.xht [ Crash Failure ]
-crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/margin-collapse-018.xht [ Crash Failure ]
-crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/margin-collapse-035.xht [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-placement-vertical-001a.xht [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-placement-vertical-001b.xht [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-placement-vertical-001c.xht [ Crash Failure ]
@@ -16855,7 +16349,6 @@
 crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/vertical-align-sub-001.xht [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/linebox/vertical-align-super-001.xht [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/block-replaced-width-006.xht [ Failure ]
-crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/inline-replaced-width-013.xht [ Crash Failure Pass ]
 crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/root-box-001.xht [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-019.xht [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-020.xht [ Crash Failure ]
@@ -16875,7 +16368,6 @@
 crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-104.xht [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-113.xht [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng/fast/block/basic/016.html [ Crash Failure ]
-crbug.com/591099 virtual/layout_ng/fast/block/basic/adding-near-anonymous-block.html [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng/fast/block/basic/fieldset-stretch-to-legend.html [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng/fast/block/float/002.html [ Failure ]
 crbug.com/591099 virtual/layout_ng/fast/block/float/014.html [ Crash Failure ]
@@ -16885,8 +16377,6 @@
 crbug.com/591099 virtual/layout_ng/fast/block/float/floats-offset-image-quirk-line-height.html [ Crash Failure ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/float-not-removed-from-first-letter.html [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng/fast/block/float/formatting-context-changes.html [ Crash Failure ]
-crbug.com/591099 virtual/layout_ng/fast/block/float/overhanging-float-add-in-static-position-block.html [ Failure Pass ]
-crbug.com/591099 virtual/layout_ng/fast/block/float/overhanging-float-add-in-static-position-block2.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng/fast/block/float/rubybase-children-made-inline-crash.html [ Failure ]
 crbug.com/591099 virtual/layout_ng/fast/block/float/rubybase-children-moved-crash-2.html [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng/fast/block/float/rubybase-children-moved-crash.html [ Failure ]
@@ -16911,7 +16401,6 @@
 crbug.com/591099 virtual/mojo-blobs/fast/files/workers/worker-file-last-modified.html [ Failure ]
 crbug.com/591099 virtual/mojo-blobs/fast/files/workers/worker-read-blob-async-crash.html [ Failure ]
 crbug.com/591099 virtual/mojo-blobs/fast/files/xhr-response-blob.html [ Failure ]
-crbug.com/591099 virtual/mojo-loading/http/tests/inspector-protocol/network/disable-interception-midway.js [ Failure Pass Timeout ]
 crbug.com/591099 virtual/mojo-loading/http/tests/inspector/appcache/appcache-iframe-manifests.html [ Pass Timeout ]
 crbug.com/591099 virtual/mojo-loading/http/tests/inspector/application-panel/storage-view-reports-quota.html [ Failure Pass Timeout ]
 crbug.com/591099 virtual/mojo-loading/http/tests/inspector/bindings/livelocation-main-frame-navigated.html [ Failure Pass Timeout ]
@@ -17408,7 +16897,7 @@
 crbug.com/591099 virtual/threaded/animations/hit-testing/inline-element-animation-end-hit-test.html [ Failure ]
 crbug.com/591099 virtual/threaded/animations/interpolation/backdrop-filter-interpolation.html [ Crash Timeout ]
 crbug.com/591099 virtual/threaded/animations/interpolation/background-image-interpolation.html [ Crash Pass Timeout ]
-crbug.com/591099 virtual/threaded/animations/interpolation/background-size-interpolation.html [ Timeout ]
+crbug.com/591099 virtual/threaded/animations/interpolation/background-size-interpolation.html [ Pass Timeout ]
 crbug.com/591099 virtual/threaded/animations/interpolation/border-image-slice-interpolation.html [ Crash Pass Timeout ]
 crbug.com/591099 virtual/threaded/animations/interpolation/border-image-width-interpolation.html [ Crash Timeout ]
 crbug.com/591099 virtual/threaded/animations/interpolation/line-height-interpolation.html [ Crash Pass Timeout ]
@@ -17635,8 +17124,8 @@
 crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-ctrl.html [ Failure ]
 crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-document-createevent.html [ Failure ]
 crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-handler-count.html [ Failure ]
-crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-in-horizontal-scrollbar-in-rtl.html [ Failure ]
-crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-in-vertical-scrollbar-in-rtl.html [ Failure ]
+crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-in-horizontal-scrollbar-in-rtl.html [ Failure Pass ]
+crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-in-vertical-scrollbar-in-rtl.html [ Failure Pass ]
 crbug.com/591099 virtual/wheelscrolllatching/fast/events/wheel/wheelevent-mousewheel-interaction.html [ Failure ]
 crbug.com/591099 webaudio/BiquadFilter/tail-time-lowpass.html [ Timeout ]
 crbug.com/591099 webaudio/internals/audiocontext-lock-threading-race.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService b/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService
index f7ed034..100bd8a 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService
@@ -101,77 +101,23 @@
 Bug(none) bluetooth/service/getCharacteristics/gen-get-same-object.html [ Timeout ]
 Bug(none) bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.html [ Timeout ]
 Bug(none) compositing/video-frame-size-change.html [ Timeout ]
-Bug(none) css-parser/color3.html [ Failure ]
-Bug(none) css-parser/color3_hsl.html [ Failure ]
-Bug(none) css-parser/color3_hsla_1.html [ Failure ]
-Bug(none) css-parser/color3_hsla_2.html [ Failure ]
-Bug(none) css-parser/color3_keywords.html [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Attribute_Nodes.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Attribute_Nodes_xmlns.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Comment_Nodes.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Conformance_Expressions.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Conformance_ID.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Conformance_hasFeature_3.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Conformance_hasFeature_empty.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Conformance_hasFeature_null.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Element_Nodes.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Processing_Instruction_Nodes.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/Text_Nodes.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluatorCast01.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_createExpression_INVALID_EXPRESSION_ERR.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_createExpression_NAMESPACE_ERR_01.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_createExpression_NAMESPACE_ERR_02.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_createExpression_NS.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_createExpression_no_NS.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_createNSResolver_all.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_createNSResolver_document.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_createNSResolver_documentElement.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_evaluate_INVALID_EXPRESSION_ERR.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_evaluate_NAMESPACE_ERR.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_evaluate_NOT_SUPPORTED_ERR.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_evaluate_WRONG_DOCUMENT_ERR.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_evaluate_document.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathEvaluator_evaluate_documentElement.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathExpression_evaluate_NOT_SUPPORTED_ERR.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathExpression_evaluate_WRONG_DOCUMENT_ERR.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathExpression_evaluate_document.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathExpression_evaluate_documentElement.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathNSResolver_lookupNamespaceURI_nist_dmstc.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathNSResolver_lookupNamespaceURI_null.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathNSResolver_lookupNamespaceURI_prefix.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathNSResolver_lookupNamespaceURI_xml.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_TYPE_ERR.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_booleanValue_false.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_booleanValue_true.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_ANY_TYPE.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_ANY_UNORDERED_NODE_TYPE.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_BOOLEAN_TYPE.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_FIRST_ORDERED_NODE_TYPE.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_NUMBER_TYPE.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_ORDERED_NODE_ITERATOR_TYPE.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_ORDERED_NODE_SNAPSHOT_TYPE.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_STRING_TYPE.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_UNORDERED_NODE_ITERATOR_TYPE.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_invalidIteratorState_UNORDERED_NODE_SNAPSHOT_TYPE.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_iterateNext_INVALID_STATE_ERR.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_iteratorNext_ORDERED_NODE_ITERATOR_TYPE.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_numberValue.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_resultType.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_singleNodeValue_ANY_UNORDERED_NODE_TYPE.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_singleNodeValue_FIRST_ORDERED_NODE_TYPE.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_snapshotItem_ORDERED_NODE_SNAPSHOT_TYPE_null.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_snapshotItem_ORDERED_NODE_SNAPSHOT_TYPE_order.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_snapshotItem_UNORDERED_NODE_SNAPSHOT_TYPE_count.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_snapshotItem_UNORDERED_NODE_SNAPSHOT_TYPE_null.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_snapshotLength_ORDERED_NODE_SNAPSHOT_TYPE.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_snapshotLength_UNORDERED_NODE_SNAPSHOT_TYPE.svg [ Failure ]
-Bug(none) dom/legacy_dom_conformance/svg/level3/xpath/XPathResult_stringValue.svg [ Failure ]
 Bug(none) external/wpt/2dcontext/imagebitmap/createImageBitmap-drawImage.html [ Crash Failure Timeout ]
 Bug(none) external/wpt/clear-site-data/storage.https.html [ Failure ]
 Bug(none) external/wpt/fetch/api/abort/serviceworker-intercepted.https.html [ Crash Failure Timeout ]
 Bug(none) external/wpt/FileAPI/historical.https.html [ Crash Failure Timeout ]
 Bug(none) external/wpt/FileAPI/url/url_xmlhttprequest.html [ Crash Failure Timeout ]
-Bug(none) external/wpt/XMLHttpRequest [ Crash Failure Timeout ]
+Bug(none) external/wpt/XMLHttpRequest/anonymous-mode-unsupported.htm [ Failure ]
+Bug(none) external/wpt/XMLHttpRequest/event-upload-progress-crossorigin.htm [ Failure ]
+Bug(none) external/wpt/XMLHttpRequest/event-upload-progress.htm [ Failure ]
+Bug(none) external/wpt/XMLHttpRequest/formdata-blob.htm [ Failure ]
+Bug(none) external/wpt/XMLHttpRequest/formdata.htm [ Failure ]
+Bug(none) external/wpt/XMLHttpRequest/overridemimetype-blob.html [ Failure ]
+Bug(none) external/wpt/XMLHttpRequest/send-accept.htm [ Failure ]
+Bug(none) external/wpt/XMLHttpRequest/send-blob-with-no-mime-type.html [ Failure ]
+Bug(none) external/wpt/XMLHttpRequest/send-data-blob.htm [ Failure ]
+Bug(none) external/wpt/XMLHttpRequest/send-redirect-post-upload.htm [ Failure ]
+Bug(none) external/wpt/XMLHttpRequest/send-response-upload-event-loadend.htm [ Timeout ]
+Bug(none) external/wpt/XMLHttpRequest/send-response-upload-event-progress.htm [ Timeout ]
 Bug(none) external/wpt/background-fetch/interfaces-worker.https.html [ Crash Failure Timeout ]
 Bug(none) external/wpt/beacon/headers/header-content-type.html [ Timeout ]
 Bug(none) external/wpt/clear-site-data/navigation.https.html [ Timeout ]
@@ -229,12 +175,6 @@
 Bug(none) external/wpt/content-security-policy/worker-src/shared-list.sub.html [ Failure Timeout ]
 Bug(none) external/wpt/cookies/secure/set-from-dom.https.sub.html [ Failure Timeout ]
 Bug(none) external/wpt/cookies/secure/set-from-http.https.sub.html [ Failure Timeout ]
-Bug(none) external/wpt/cors/allow-headers.htm [ Failure Timeout ]
-Bug(none) external/wpt/cors/origin.htm [ Failure Timeout ]
-Bug(none) external/wpt/cors/preflight-cache.htm [ Failure Timeout ]
-Bug(none) external/wpt/cors/request-headers.htm [ Failure Timeout ]
-Bug(none) external/wpt/cors/response-headers.htm [ Failure Timeout ]
-Bug(none) external/wpt/cors/simple-requests.htm [ Failure Timeout ]
 Bug(none) external/wpt/cssom-view/scrolling-quirks-vs-nonquirks.html [ Failure Timeout ]
 Bug(none) external/wpt/cssom-view/scrollingElement.html [ Failure Timeout ]
 Bug(none) external/wpt/domxpath/xml_xpath_runner.html [ Failure Timeout ]
@@ -252,22 +192,17 @@
 Bug(none) external/wpt/fetch/api/policies/referrer-origin-when-cross-origin-service-worker.https.html [ Crash Failure Timeout ]
 Bug(none) external/wpt/fetch/api/policies/referrer-unsafe-url-service-worker.https.html [ Crash Failure Timeout ]
 Bug(none) external/wpt/fetch/api/response/response-cancel-stream.html [ Timeout ]
-Bug(none) external/wpt/html/browsers/browsing-the-web/navigating-across-documents/012.html [ Failure Timeout ]
 Bug(none) external/wpt/html/browsers/history/the-location-interface/location-protocol-setter-non-broken-weird.html [ Failure Timeout Failure ]
 Bug(none) external/wpt/html/browsers/offline/appcache/workers/appcache-worker.html [ Timeout ]
 Bug(none) external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-serviceworker-failure.https.html [ Crash Failure Timeout ]
 Bug(none) external/wpt/html/semantics/embedded-content/media-elements/playing-the-media-resource/playbackRate.html [ Failure Timeout ]
-Bug(none) external/wpt/html/semantics/embedded-content/media-elements/ready-states/autoplay-with-slow-text-tracks.html [ Failure Timeout ]
-Bug(none) external/wpt/html/semantics/embedded-content/media-elements/video_008.htm [ Failure Timeout ]
 Bug(none) external/wpt/html/semantics/embedded-content/media-elements/volume_nonfinite.html [ Failure Timeout ]
 Bug(none) external/wpt/html/semantics/embedded-content/the-iframe-element/iframe-load-event.html [ Failure Timeout ]
-Bug(none) external/wpt/html/semantics/forms/form-submission-0/getactionurl.html [ Failure Timeout ]
 Bug(none) external/wpt/html/semantics/forms/form-submission-0/submit-entity-body.html [ Failure Timeout ]
 Bug(none) external/wpt/html/semantics/forms/the-legend-element/legend-form.html [ Failure Timeout ]
 Bug(none) external/wpt/html/semantics/scripting-1/the-script-element/async_003.htm [ Failure Timeout ]
 Bug(none) external/wpt/html/semantics/scripting-1/the-script-element/module/credentials.sub.html [ Failure Timeout ]
 Bug(none) external/wpt/html/semantics/scripting-1/the-script-element/script-crossorigin-network.html [ Failure Timeout ]
-Bug(none) external/wpt/html/webappapis/idle-callbacks/callback-suspended.html [ Failure Timeout ]
 Bug(none) external/wpt/html/webappapis/scripting/events/messageevent-constructor.https.html [ Crash Failure Timeout ]
 Bug(none) external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/canblock-serviceworker.https.html [ Crash Failure Timeout ]
 Bug(none) external/wpt/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.serviceworker.https.html [ Crash Failure Timeout ]
@@ -276,15 +211,7 @@
 Bug(none) external/wpt/mixed-content/allowed/http-csp/same-host-wss/websocket-request/top-level/no-redirect/websocket-allowed.https.html [ Failure Timeout ]
 Bug(none) external/wpt/navigation-timing/nav2_test_attributes_values.html [ Failure Timeout ]
 Bug(none) external/wpt/navigation-timing/nav2_test_unloadEvents_previous_document_cross_origin.sub.html [ Failure Timeout ]
-Bug(none) external/wpt/notifications/shownotification-resolve-manual.https.html [ Failure Timeout ]
-Bug(none) external/wpt/offscreen-canvas [ Crash Failure Timeout ]
 Bug(none) external/wpt/preload/fetch-destination.https.html [ Crash Failure Timeout ]
-Bug(none) external/wpt/preload/single-download-preload.html [ Failure Timeout ]
-Bug(none) external/wpt/resource-timing/resource_TAO_match_origin.htm [ Failure Timeout ]
-Bug(none) external/wpt/resource-timing/resource_TAO_match_wildcard.htm [ Failure Timeout ]
-Bug(none) external/wpt/resource-timing/resource_TAO_multi.htm [ Failure Timeout ]
-Bug(none) external/wpt/resource-timing/resource_cached.htm [ Failure Timeout ]
-Bug(none) external/wpt/resource-timing/resource_connection_reuse.html [ Failure Timeout ]
 Bug(none) external/wpt/resource-timing/test_resource_timing.html [ Failure Timeout ]
 Bug(none) external/wpt/service-workers [ Crash Failure Timeout ]
 Bug(none) external/wpt/streams/byte-length-queuing-strategy.serviceworker.https.html [ Crash Failure Timeout ]
@@ -317,11 +244,9 @@
 Bug(none) external/wpt/streams/writable-streams/bad-strategies.dedicatedworker.html [ Failure Timeout ]
 Bug(none) external/wpt/streams/writable-streams/bad-strategies.serviceworker.https.html [ Crash Failure Timeout ]
 Bug(none) external/wpt/streams/writable-streams/bad-underlying-sinks.serviceworker.https.html [ Crash Failure Timeout ]
-Bug(none) external/wpt/streams/writable-streams/bad-underlying-sinks.sharedworker.html [ Failure Timeout ]
 Bug(none) external/wpt/streams/writable-streams/brand-checks.serviceworker.https.html [ Crash Failure Timeout ]
 Bug(none) external/wpt/streams/writable-streams/byte-length-queuing-strategy.serviceworker.https.html [ Crash Failure Timeout ]
 Bug(none) external/wpt/streams/writable-streams/close.serviceworker.https.html [ Crash Failure Timeout ]
-Bug(none) external/wpt/streams/writable-streams/close.sharedworker.html [ Failure Timeout ]
 Bug(none) external/wpt/streams/writable-streams/constructor.serviceworker.https.html [ Crash Failure Timeout ]
 Bug(none) external/wpt/streams/writable-streams/count-queuing-strategy.serviceworker.https.html [ Crash Failure Timeout ]
 Bug(none) external/wpt/streams/writable-streams/error.serviceworker.https.html [ Crash Failure Timeout ]
@@ -362,7 +287,6 @@
 Bug(none) fast/workers/close-context-messageport-crash.html [ Timeout ]
 Bug(none) fast/xmlhttprequest/xmlhttprequest-bad-mimetype.html [ Failure ]
 Bug(none) fast/xmlhttprequest/xmlhttprequest-html-response-encoding.html [ Failure ]
-Bug(none) fast/xmlhttprequest/xmlhttprequest-nonexistent-file.html [ Timeout ]
 Bug(none) fast/xmlhttprequest/xmlhttprequest-responsetype-arraybuffer.html [ Timeout ]
 Bug(none) fast/xpath/4XPath/Borrowed/od_20000608.html [ Failure ]
 Bug(none) fast/xsl/document-function.xml [ Failure ]
@@ -377,32 +301,19 @@
 Bug(none) fast/xsl/xslt-processor.html [ Failure ]
 Bug(none) fast/xsl/xslt-relative-path.xml [ Failure ]
 Bug(none) fast/xsl/xslt-second-level-import.xml [ Skip ]
-Bug(none) http/tests/appcache/404-manifest.html [ Failure ]
+Bug(none) http/tests/appcache/404-manifest.html [ Failure Pass ]
 Bug(none) http/tests/appcache/abort-cache-ondownloading-manifest-404.html [ Timeout ]
 Bug(none) http/tests/appcache/access-via-redirect.php [ Timeout ]
-Bug(none) http/tests/appcache/crash-when-navigating-away-then-back.html [ Timeout ]
-Bug(none) http/tests/appcache/cyrillic-uri.html [ Failure Timeout ]
-Bug(none) http/tests/appcache/different-https-origin-resource-main.html [ Timeout ]
-Bug(none) http/tests/appcache/fail-on-update-2.html [ Timeout ]
 Bug(none) http/tests/appcache/fallback.html [ Failure ]
-Bug(none) http/tests/appcache/local-content.html [ Timeout ]
-Bug(none) http/tests/appcache/main-resource-hash.html [ Timeout ]
-Bug(none) http/tests/appcache/main-resource-redirect.html [ Timeout ]
-Bug(715632) http/tests/appcache/manifest-redirect-2.html [ Crash ]
-Bug(715632) http/tests/appcache/manifest-redirect.html [ Crash ]
+Bug(754827) http/tests/appcache/main-resource-redirect.html [ Timeout ]
 Bug(none) http/tests/appcache/manifest-parsing.html [ Failure ]
 Bug(none) http/tests/appcache/multi-fallback.html [ Failure Timeout ]
-Bug(none) http/tests/appcache/non-html.xhtml [ Crash ]
-Bug(none) http/tests/appcache/offline-access.html [ Timeout ]
-Bug(none) http/tests/appcache/online-fallback-layering.html [ Timeout ]
+Bug(none) http/tests/appcache/non-html.xhtml [ Timeout ]
+Bug(754827) http/tests/appcache/online-fallback-layering.html [ Failure ]
 Bug(none) http/tests/appcache/online-whitelist.html [ Failure ]
-Bug(none) http/tests/appcache/reload.html [ Crash Failure Timeout ]
 Bug(none) http/tests/appcache/remove-cache.html [ Crash Failure Timeout ]
-Bug(715632) http/tests/appcache/resource-redirect.html [ Crash ]
-Bug(715632) http/tests/appcache/resource-redirect-2.html [ Crash ]
 Bug(none) http/tests/appcache/simple.html [ Timeout ]
 Bug(none) http/tests/appcache/top-frame-1.html [ Timeout ]
-Bug(none) http/tests/appcache/top-frame-2.html [ Crash Timeout ]
 Bug(none) http/tests/appcache/top-frame-3.html [ Crash Timeout ]
 Bug(none) http/tests/appcache/top-frame-4.html [ Crash Timeout ]
 Bug(none) http/tests/appcache/update-cache.html [ Timeout ]
@@ -422,30 +333,19 @@
 Bug(none) http/tests/background_sync/oneshot-register-failure-worker-not-activated.html [ Crash Failure ]
 Bug(none) http/tests/background_sync/oneshot.html [ Crash Failure Timeout ]
 Bug(none) http/tests/background_sync/permission_denied.html [ Crash Failure Timeout ]
-Bug(none) http/tests/bluetooth/https/requestDevice/cross-origin-iframe.html [ Timeout ]
 Bug(none) http/tests/budget/get-budget-in-service-worker.html [ Timeout ]
-Bug(none) http/tests/budget/get-budget.html [ Timeout ]
 Bug(none) http/tests/budget/get-cost-fails-in-service-worker.html [ Timeout ]
 Bug(none) http/tests/budget/get-cost-in-service-worker.html [ Timeout ]
-Bug(none) http/tests/budget/get-cost.html [ Timeout ]
 Bug(none) http/tests/budget/interfaces-in-service-worker.html [ Crash Failure Timeout ]
 Bug(none) http/tests/budget/reserve-in-service-worker.html [ Timeout ]
-Bug(none) http/tests/budget/reserve.html [ Timeout ]
 Bug(none) http/tests/cache/cached-main-resource.html [ Timeout ]
-Bug(none) http/tests/cache/history-only-cached-subresource-loads-max-age-https.html [ Timeout ]
 Bug(none) http/tests/cache/iframe-304-crash.html [ Failure Timeout ]
-Bug(none) http/tests/cache/network-error-during-revalidation.html [ Timeout ]
 Bug(none) http/tests/cache/post-redirect-get.php [ Timeout ]
-Bug(none) http/tests/cache/post-with-cached-subresources.php [ Timeout ]
 Bug(none) http/tests/cache/reload-main-resource.php [ Timeout ]
-Bug(none) http/tests/cache/stopped-revalidation.html [ Failure ]
 Bug(none) http/tests/cache/subresource-expiration-1.html [ Failure ]
 Bug(none) http/tests/cache/subresource-expiration-2.html [ Failure ]
 Bug(none) http/tests/cache/subresource-failover-to-network.html [ Failure ]
-Bug(none) http/tests/cache/subresource-fragment-identifier.html [ Failure ]
-Bug(none) http/tests/cache/sync-xhr-304.html [ Failure ]
 Bug(none) http/tests/cachestorage/serviceworker/credentials.html [ Crash Failure Timeout ]
-Bug(none) http/tests/canvas/webgl/origin-clean-conformance.html [ Timeout ]
 Bug(none) http/tests/cookies/double-quoted-value-with-semi-colon.html [ Failure ]
 Bug(none) http/tests/cookies/http-get-cookie-set-in-js.html [ Failure ]
 Bug(none) http/tests/cookies/js-get-and-set-http-only-cookie.html [ Failure ]
@@ -459,14 +359,7 @@
 Bug(none) http/tests/cookies/simple-cookies-expired.html [ Failure ]
 Bug(none) http/tests/cookies/simple-cookies-max-age.html [ Failure ]
 Bug(none) http/tests/cookies/single-quoted-value.html [ Failure ]
-Bug(none) http/tests/credentialmanager/credentialscontainer-frame-errors.html [ Timeout ]
 Bug(none) http/tests/credentialmanager/passwordcredential-fetch.html [ Failure ]
-Bug(none) http/tests/css/border-image-loading.html [ Failure ]
-Bug(none) http/tests/css/css-image-loading.html [ Failure ]
-Bug(none) http/tests/css/font-face-src-cached.html [ Failure ]
-Bug(none) http/tests/css/image-value-cached.html [ Failure ]
-Bug(none) http/tests/css/mask-image-loading.html [ Failure ]
-Bug(none) http/tests/css/reflection-mask-image-loading.html [ Failure ]
 Bug(none) http/tests/csspaint/invalidation-background-image.html [ Failure ]
 Bug(none) http/tests/csspaint/invalidation-border-image.html [ Failure ]
 Bug(none) http/tests/csspaint/invalidation-content-image.html [ Crash Failure ]
@@ -593,29 +486,17 @@
 Bug(none) http/tests/fetch/serviceworker/thorough/redirect.html [ Crash Timeout ]
 Bug(none) http/tests/fetch/serviceworker/thorough/scheme-blob-base-https-other-https.html [ Crash Timeout ]
 Bug(none) http/tests/fetch/serviceworker/thorough/scheme-blob-other-https.html [ Crash Timeout ]
+Bug(none) http/tests/fetch/serviceworker/thorough/scheme-blob.html [ Timeout ]
 Bug(none) http/tests/fetch/serviceworker/thorough/scheme-data-base-https-other-https.html [ Crash Timeout ]
 Bug(none) http/tests/fetch/serviceworker/thorough/scheme-data-other-https.html [ Crash Timeout ]
 Bug(none) http/tests/fetch/serviceworker/thorough/scheme-data.html [ Crash Timeout ]
-Bug(none) http/tests/fetch/window/block-mixed-content-base-https.html [ Failure Timeout ]
-Bug(none) http/tests/fetch/window/block-mixed-content-nocors-base-https.html [ Failure Timeout ]
-Bug(none) http/tests/fetch/window/body-mixin-base-https-other-https.html [ Failure Timeout ]
-Bug(none) http/tests/fetch/window/body-mixin.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/window/cache-override-base-https-other-https.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/window/fetch-base-https-other-https.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/window/fetch.html [ Failure Timeout ]
-Bug(none) http/tests/fetch/window/filtered-response-base-https-other-https.html [ Failure Timeout ]
-Bug(none) http/tests/fetch/window/filtered-response-other-https.html [ Failure Timeout ]
-Bug(none) http/tests/fetch/window/headers-base-https-other-https.html [ Failure Timeout ]
-Bug(none) http/tests/fetch/window/headers-guard-base-https-other-https.html [ Failure Timeout ]
-Bug(none) http/tests/fetch/window/referrer-base-https-other-https.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/window/request-base-https-other-https.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/window/request.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/window/response-base-https-other-https.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/window/response-content-base-https-other-https.html [ Failure Timeout ]
-Bug(none) http/tests/fetch/window/response-content.html [ Failure Timeout ]
-Bug(none) http/tests/fetch/window/response.html [ Failure Timeout ]
-Bug(none) http/tests/fetch/window/stream-reader-base-https-other-https.html [ Failure Timeout ]
-Bug(none) http/tests/fetch/window/stream-reader.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/window/thorough/access-control-base-https-other-https.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/window/thorough/access-control.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/window/thorough/auth-base-https-other-https.html [ Failure Timeout ]
@@ -661,9 +542,6 @@
 Bug(none) http/tests/fetch/window/thorough/scheme-data-other-https.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/window/thorough/scheme-data.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/workers/block-mixed-content-base-https.html [ Failure Timeout ]
-Bug(none) http/tests/fetch/workers/block-mixed-content-nocors-base-https.html [ Failure Timeout ]
-Bug(none) http/tests/fetch/workers/body-mixin-base-https-other-https.html [ Failure Timeout ]
-Bug(none) http/tests/fetch/workers/body-mixin.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/workers/cache-override-base-https-other-https.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/workers/fetch-base-https-other-https.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/workers/fetch.html [ Failure Timeout ]
@@ -678,8 +556,6 @@
 Bug(none) http/tests/fetch/workers/response-content-base-https-other-https.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/workers/response-content.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/workers/response.html [ Failure Timeout ]
-Bug(none) http/tests/fetch/workers/stream-reader-base-https-other-https.html [ Failure Timeout ]
-Bug(none) http/tests/fetch/workers/stream-reader.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/workers/thorough/access-control-base-https-other-https.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/workers/thorough/access-control.html [ Failure Timeout ]
 Bug(none) http/tests/fetch/workers/thorough/auth-base-https-other-https.html [ Failure Timeout ]
@@ -729,22 +605,26 @@
 Bug(none) http/tests/history/push-state-in-new-frame.html [ Timeout ]
 Bug(none) http/tests/htmlimports/import-cors-credentials.html [ Failure ]
 Bug(none) http/tests/https/verify-ssl-enabled.php [ Timeout ]
-Bug(none) http/tests/inspector [ Crash Failure Timeout ]
-Bug(none) http/tests/inspector-enabled [ Failure Timeout ]
+Bug(none) http/tests/inspector/extensions-ignore-cache.html [ Crash ]
+Bug(none) http/tests/inspector/extensions-useragent.html [ Crash ]
+Bug(none) http/tests/inspector/network/har-content.html [ Failure Timeout ]
+Bug(none) http/tests/inspector/network/load-resource-for-frontend.html [ Failure Timeout ]
+Bug(none) http/tests/inspector/network/network-datareceived.html [ Failure ]
+Bug(none) http/tests/inspector/network/ping-response.html [ Failure ]
+Bug(none) http/tests/inspector/network/warning-for-long-cookie.html [ Failure ]
+Bug(none) http/tests/inspector/network/x-frame-options-deny.html [ Failure ]
+Bug(none) http/tests/inspector/network/long-script-content.html [ Crash ]
+Bug(none) http/tests/inspector/persistence/persistence-tabbed-editor-tabs-order.html [ Crash ]
+Bug(none) http/tests/inspector/resource-har-conversion.html [ Failure ]
+Bug(none) http/tests/inspector/resource-parameters.html [ Failure ]
+Bug(none) http/tests/inspector/resource-parameters-ipv6.html [ Timeout ]
+Bug(none) http/tests/inspector/service-workers/service-workers-bypass-for-network-redirect.html [ Crash ]
+Bug(none) http/tests/inspector/service-workers/service-workers-force-update-on-page-load.html [ Timeout ]
+Bug(none) http/tests/inspector/service-workers/service-workers-navigation-preload.html [ Timeout ]
+Bug(none) http/tests/inspector/service-workers/service-workers-redundant.html [ Timeout ]
+Bug(none) http/tests/inspector/service-workers/service-workers-view.html [ Timeout ]
 Bug(none) http/tests/inspector-protocol [ Failure Timeout ]
-Bug(none) http/tests/inspector-protocol/cachestorage/read-cached-response.js [ Timeout ]
 Bug(none) http/tests/inspector-protocol/page/frameScheduledNavigation.js [ Crash ]
-Bug(none) http/tests/inspector/extensions/extensions-api.html [ Timeout ]
-Bug(none) http/tests/inspector/extensions/extensions-audits-api.html [ Timeout ]
-Bug(none) http/tests/inspector/extensions/extensions-audits-content-script.html [ Timeout ]
-Bug(none) http/tests/inspector/extensions/extensions-audits.html [ Timeout ]
-Bug(none) http/tests/inspector/extensions/extensions-events.html [ Timeout ]
-Bug(none) http/tests/inspector/extensions/extensions-network.html [ Failure Timeout ]
-Bug(none) http/tests/inspector/extensions/extensions-reload.html [ Timeout ]
-Bug(none) http/tests/inspector/extensions/extensions-resources.html [ Timeout ]
-Bug(none) http/tests/inspector/extensions/extensions-timeline-api.html [ Timeout ]
-Bug(none) http/tests/inspector/extensions/multiple-extensions.html [ Timeout ]
-Bug(none) http/tests/linkHeader/link-preconnect-schemeless.https.php [ Timeout ]
 Bug(none) http/tests/loading/307-after-303-after-post.html [ Failure ]
 Bug(none) http/tests/loading/doc-write-sync-third-party-script-reload.html [ Crash ]
 Bug(none) http/tests/loading/bad-scheme-subframe.html [ Failure ]
@@ -781,31 +661,25 @@
 Bug(none) http/tests/misc/image-checks-for-accept.html [ Failure Pass ]
 Bug(none) http/tests/misc/image-input-type-outlives-gc-without-crashing.html [ Failure Pass ]
 Bug(none) http/tests/misc/image-load-outlives-gc-without-crashing.html [ Failure Pass ]
-Bug(none) http/tests/misc/link-preconnect-schemeless.https.html [ Timeout ]
 Bug(none) http/tests/misc/link-rel-prefetch.html [ Failure ]
 Bug(none) http/tests/misc/onload-detach-during-csp-frame-src-none.html [ Failure ]
 Bug(none) http/tests/misc/redirect-to-about-blank.html [ Timeout ]
 Bug(none) http/tests/misc/resource-timing-sizes-sync-xhr-transfer-size.html [ Timeout ]
 Bug(none) http/tests/misc/resource-timing-sizes-tags.html [ Failure Timeout ]
 Bug(none) http/tests/misc/resource-timing-sizes-xhr-fetch.html [ Timeout ]
-Bug(none) http/tests/misc/tests-finishing-simultaneously.html [ Timeout ]
 Bug(none) http/tests/misc/webtiming-ssl.php [ Timeout ]
-Bug(none) http/tests/misc/window-dot-stop.html [ Failure ]
 Bug(none) http/tests/misc/xhtml.php [ Failure ]
 Bug(none) http/tests/navigation/image-load-in-unload-handler.html [ Failure ]
 Bug(none) http/tests/navigation/location-reload-after-post.php [ Failure ]
 Bug(none) http/tests/navigation/multiple-back-forward-entries.html [ Timeout ]
-Bug(none) http/tests/navigation/navigation-interrupted-by-fragment.html [ Timeout ]
 Bug(none) http/tests/navigation/onload-navigation-iframe-2.html [ Timeout ]
 Bug(none) http/tests/navigation/onload-navigation-iframe-timeout.html [ Timeout ]
 Bug(none) http/tests/navigation/onload-navigation-iframe.html [ Timeout ]
 Bug(none) http/tests/navigation/ping-cookie.html [ Failure ]
-Bug(none) http/tests/navigation/ping-cross-origin-from-https.html [ Timeout ]
 Bug(none) http/tests/navigation/ping-same-origin.html [ Failure ]
 Bug(none) http/tests/navigation/post-basic.html [ Failure ]
-Bug(none) http/tests/navigation/post-frames-goback1.html [ Failure ]
+Bug(none) http/tests/navigation/post-frames-goback1.html [ Crash Failure ]
 Bug(none) http/tests/navigation/post-frames.html [ Failure ]
-Bug(none) http/tests/navigation/post-goback1.html [ Failure ]
 Bug(none) http/tests/navigation/redirect-on-back-updates-history-item.html [ Timeout ]
 Bug(none) http/tests/navigation/redirect-on-reload-updates-history-item.html [ Timeout ]
 Bug(none) http/tests/navigation/rename-subframe-goback.html [ Failure ]
@@ -834,7 +708,6 @@
 Bug(none) http/tests/notifications/serviceworkerregistration-document-image-slow-404.html [ Crash Failure Timeout ]
 Bug(none) http/tests/notifications/serviceworkerregistration-document-image-slow.html [ Crash Failure Timeout ]
 Bug(none) http/tests/notifications/serviceworkerregistration-document-no-permission.html [ Crash Failure Timeout ]
-Bug(none) http/tests/notifications/serviceworkerregistration-document-not-activated.html [ Crash Failure ]
 Bug(none) http/tests/notifications/serviceworkerregistration-document-vibrate-throw.html [ Crash Failure Timeout ]
 Bug(none) http/tests/notifications/serviceworkerregistration-get-close.html [ Crash Failure Timeout ]
 Bug(none) http/tests/notifications/serviceworkerregistration-get-empty.html [ Crash Failure Timeout ]
@@ -861,21 +734,14 @@
 Bug(none) http/tests/payments/payment-app-interfaces.html [ Crash Failure Timeout ]
 Bug(none) http/tests/payments/payment-instruments.html [ Crash Failure Timeout ]
 Bug(none) http/tests/payments/payment-request-event.html [ Crash Failure Timeout ]
-Bug(none) http/tests/performance-timing/paint-timing/first-contentful-paint.html [ Failure ]
-Bug(none) http/tests/permissions/test-api-surface.html [ Crash Failure ]
 Bug(none) http/tests/permissions/test-query.html [ Crash Failure ]
-Bug(none) http/tests/previews/client-lofi-sprite.html [ Failure ]
 Bug(none) http/tests/push_messaging/application-server-key-format-test.html [ Crash Failure Timeout ]
 Bug(none) http/tests/push_messaging/application-server-key-standard-endpoint.html [ Crash Failure Timeout ]
 Bug(none) http/tests/push_messaging/get-subscription-in-document.html [ Crash Failure Timeout ]
 Bug(none) http/tests/push_messaging/get-subscription-in-service-worker.html [ Crash Failure Timeout ]
-Bug(none) http/tests/push_messaging/permission-state-denied-in-document.html [ Crash Failure ]
 Bug(none) http/tests/push_messaging/permission-state-denied-in-service-worker.html [ Crash Failure Timeout ]
-Bug(none) http/tests/push_messaging/permission-state-exception-in-document.html [ Crash Failure ]
 Bug(none) http/tests/push_messaging/permission-state-exception-in-service-worker.html [ Crash Failure Timeout ]
-Bug(none) http/tests/push_messaging/permission-state-granted-in-document.html [ Crash ]
 Bug(none) http/tests/push_messaging/permission-state-granted-in-service-worker.html [ Crash Failure Timeout ]
-Bug(none) http/tests/push_messaging/permission-state-prompt-in-document.html [ Crash Failure ]
 Bug(none) http/tests/push_messaging/permission-state-prompt-in-service-worker.html [ Crash Failure Timeout ]
 Bug(none) http/tests/push_messaging/push-subscription-options.html [ Crash Failure Timeout ]
 Bug(none) http/tests/push_messaging/push-subscription-stringification.html [ Crash Failure Timeout ]
@@ -887,14 +753,12 @@
 Bug(none) http/tests/push_messaging/subscribe-failure-permission-default-in-service-worker.html [ Crash Failure Timeout ]
 Bug(none) http/tests/push_messaging/subscribe-failure-permission-denied-in-document.html [ Crash Failure Timeout ]
 Bug(none) http/tests/push_messaging/subscribe-failure-permission-denied-in-service-worker.html [ Crash Failure Timeout ]
-Bug(none) http/tests/push_messaging/subscribe-failure-worker-not-activated.html [ Crash Failure ]
 Bug(none) http/tests/push_messaging/subscribe-success-in-document.html [ Crash Failure Timeout ]
 Bug(none) http/tests/push_messaging/subscribe-success-in-service-worker.html [ Crash Failure Timeout ]
 Bug(none) http/tests/push_messaging/unsubscribe-in-document.html [ Crash Failure Timeout ]
 Bug(none) http/tests/push_messaging/unsubscribe-in-service-worker.html [ Crash Failure Timeout ]
 Bug(none) http/tests/security/contentSecurityPolicy/1.1/form-action-src-get-blocked-with-redirect.html [ Failure ]
 Bug(none) http/tests/security/contentSecurityPolicy/1.1/form-action-src-redirect-blocked.html [ Failure ]
-Bug(none) http/tests/security/contentSecurityPolicy/block-mixed-content-hides-warning.html [ Failure ]
 Bug(none) http/tests/security/contentSecurityPolicy/cascade/same-origin-window-open.html [ Timeout ]
 Bug(none) http/tests/security/contentSecurityPolicy/cascade/same-origin-with-own-policy-window-open.html [ Timeout ]
 Bug(none) http/tests/security/contentSecurityPolicy/cascade/same-origin-with-own-policy.html [ Timeout ]
@@ -902,170 +766,39 @@
 Bug(none) http/tests/security/contentSecurityPolicy/frame-src-child-frame-navigates-to-blocked-origin.html [ Failure Timeout ]
 Bug(none) http/tests/security/contentSecurityPolicy/frame-src-cross-origin-load.html [ Failure ]
 Bug(none) http/tests/security/contentSecurityPolicy/frame-src-redirect-blocked.html [ Failure ]
-Bug(none) http/tests/security/contentSecurityPolicy/register-bypassing-scheme-script.https.html [ Timeout ]
-Bug(none) http/tests/security/contentSecurityPolicy/report-same-origin-with-cookies.php [ Failure ]
-Bug(none) http/tests/security/contentSecurityPolicy/script-src-star-cross-scheme.html [ Failure ]
-Bug(none) http/tests/security/contentSecurityPolicy/source-list-parsing-10.html [ Failure ]
 Bug(none) http/tests/security/cookies/first-party-cookie-allow-xslt.xml [ Failure ]
 Bug(none) http/tests/security/cookies/third-party-cookie-blocking-main-frame.html [ Failure ]
 Bug(none) http/tests/security/cookies/third-party-cookie-blocking-worker.html [ Failure ]
 Bug(none) http/tests/security/cookies/xmlhttprequest.html [ Timeout ]
 Bug(none) http/tests/security/cors-rfc1918 [ Crash Timeout ]
-Bug(none) http/tests/security/cross-frame-access-parent-explicit-domain-isolated-world.html [ Timeout ]
-Bug(none) http/tests/security/cross-frame-access-parent-isolated-world.html [ Timeout ]
-Bug(none) http/tests/security/cross-frame-access-protocol-explicit-domain.html [ Timeout ]
-Bug(none) http/tests/security/cross-frame-access-protocol.html [ Timeout ]
-Bug(none) http/tests/security/cross-origin-OffscreenCanvas2D-transferToImageBitmap.html [ Timeout ]
-Bug(none) http/tests/security/cross-origin-OffscreenCanvasWebGL-texImage2D.html [ Timeout ]
-Bug(none) http/tests/security/cross-origin-createImageBitmap.html [ Timeout ]
-Bug(none) http/tests/security/detached-window-cross-origin-access.html [ Timeout ]
-Bug(none) http/tests/security/document-all.html [ Failure ]
 Bug(none) http/tests/security/img-crossorigin-cookies.html [ Failure ]
 Bug(none) http/tests/security/img-redirect-to-crossorigin-credentials.html [ Failure ]
 Bug(none) http/tests/security/listener/xss-XMLHttpRequest-addEventListener.html [ Timeout ]
-Bug(none) http/tests/security/local-video-source-from-remote.html [ Timeout ]
-Bug(none) http/tests/security/location-change-from-detached-DOMWindow.html [ Timeout ]
-Bug(none) http/tests/security/media-element-audio-source-node-cross-origin-allowed.html [ Timeout ]
-Bug(none) http/tests/security/media-element-audio-source-node-cross-origin-with-credentials.html [ Failure Timeout ]
 Bug(none) http/tests/security/media-element-audio-source-node-cross-origin.html [ Failure Pass Timeout ]
 Bug(none) http/tests/security/media-element-audio-source-node-same-origin.html [ Failure Pass ]
 Bug(none) http/tests/security/mime-type-execute-as-html-01.html [ Failure ]
 Bug(none) http/tests/security/mime-type-execute-as-html-04.html [ Failure ]
-Bug(none) http/tests/security/mixedContent/about-blank-iframe-in-main-frame.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/active-subresource-in-http-iframe-not-blocked.https.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/active-subresource-in-iframe-blocked.https.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/data-url-iframe-in-main-frame.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/data-url-script-in-data-iframe.https.html [ Timeout ]
 Bug(none) http/tests/security/mixedContent/filesystem-url-in-iframe.html [ Failure Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-async-post-xhr-blocked.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-audio-video-in-main-frame.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-css-image-with-reload.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-css-in-iframe.html [ Failure ]
-Bug(none) http/tests/security/mixedContent/insecure-css-in-main-frame.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-css-resources.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-empty-srcset-in-main-frame-blocked.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-eventsource-in-main-frame.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-fetch-blocked.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-font-in-main-frame.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-formSubmission-in-invisible-DOM.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-formSubmission-in-main-frame-allowed.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-formSubmission-in-main-frame-blocked.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-formSubmission-in-main-frame-javascript-allowed.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-formSubmission-in-main-frame.html [ Timeout ]
 Bug(none) http/tests/security/mixedContent/insecure-frame-in-data-iframe-in-main-frame-blocked.html [ Failure Timeout ]
 Bug(none) http/tests/security/mixedContent/insecure-iframe-in-iframe.html [ Failure ]
 Bug(none) http/tests/security/mixedContent/insecure-iframe-in-main-frame-allowed.html [ Failure Timeout ]
 Bug(none) http/tests/security/mixedContent/insecure-iframe-in-main-frame-blocked.html [ Failure Timeout ]
 Bug(none) http/tests/security/mixedContent/insecure-iframe-in-main-frame.html [ Failure Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-iframe-with-hsts.https.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-image-in-iframe.html [ Failure ]
-Bug(none) http/tests/security/mixedContent/insecure-image-in-main-frame-allowed.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-image-in-main-frame-blocked.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-image-in-main-frame.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-localhost-allowed.https.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-picture-in-main-frame-blocked.https.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-plugin-in-iframe.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-prefetch-in-main-frame.html [ Failure ]
-Bug(none) http/tests/security/mixedContent/insecure-script-in-data-iframe-in-main-frame-blocked.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-script-in-iframe.html [ Failure ]
-Bug(none) http/tests/security/mixedContent/insecure-script-in-main-frame-allowed.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-script-in-main-frame-blocked.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-script-through-redirection.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-srcset-in-main-frame-blocked.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-sync-post-xhr-allowed.html [ Failure Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-sync-post-xhr-blocked.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-texttrack-in-main-frame-blocked.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/insecure-xhr-in-main-frame.https.html [ Timeout ]
 Bug(none) http/tests/security/mixedContent/nonwebby-scheme-in-iframe-allowed.https.html [ Failure Timeout ]
-Bug(none) http/tests/security/mixedContent/preload-insecure-image-in-main-frame-blocked.html [ Timeout ]
 Bug(none) http/tests/security/mixedContent/redirect-http-to-https-iframe-in-main-frame.html [ Failure Timeout ]
-Bug(none) http/tests/security/mixedContent/redirect-http-to-https-script-in-iframe.html [ Failure ]
 Bug(none) http/tests/security/mixedContent/redirect-https-to-http-iframe-in-main-frame.html [ Failure Timeout ]
-Bug(none) http/tests/security/mixedContent/redirect-https-to-http-script-in-iframe.html [ Failure ]
-Bug(none) http/tests/security/mixedContent/strict-mode-image-blocked.https.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/strict-mode-image-in-frame-blocked.https.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/strict-mode-image-no-policy.https.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/strict-mode-image-reportonly.https.php [ Timeout ]
-Bug(none) http/tests/security/mixedContent/strict-mode-via-pref-image-blocked.https.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/strict-mode-websocket-blocked.https.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/websocket/insecure-websocket-in-sandbox-in-secure-page.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/websocket/insecure-websocket-in-secure-page-allowed.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/websocket/insecure-websocket-in-secure-page-worker-allowed.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/websocket/insecure-websocket-in-secure-page-worker.html [ Timeout ]
-Bug(none) http/tests/security/mixedContent/websocket/insecure-websocket-in-secure-page.html [ Timeout ]
-Bug(none) http/tests/security/no-indexeddb-from-sandbox.html [ Failure ]
-Bug(none) http/tests/security/no-popup-from-sandbox-top.html [ Failure ]
-Bug(none) http/tests/security/no-popup-from-sandbox.html [ Failure ]
 Bug(none) http/tests/security/no-referrer.html [ Timeout ]
 Bug(none) http/tests/security/offscreen-canvas-worker-read-blocked-by-setting.html [ Crash Pass Timeout ]
-Bug(none) http/tests/security/opened-document-security-origin-resets-on-navigation.html [ Timeout ]
-Bug(none) http/tests/security/originHeader/origin-header-for-https.html [ Timeout ]
-Bug(none) http/tests/security/popup-allowed-by-sandbox-can-navigate.html [ Failure ]
-Bug(none) http/tests/security/popup-allowed-by-sandbox-is-sandboxed-control.html [ Failure ]
-Bug(none) http/tests/security/popup-allowed-by-sandbox-is-sandboxed.html [ Failure ]
-Bug(none) http/tests/security/popup-allowed-by-sandbox-when-allowed.html [ Failure ]
-Bug(none) http/tests/security/powerfulFeatureRestrictions/geolocation-on-sandboxed-insecure-origin.html [ Timeout ]
-Bug(none) http/tests/security/powerfulFeatureRestrictions/geolocation-on-secure-origin-in-insecure-origin.html [ Timeout ]
-Bug(none) http/tests/security/powerfulFeatureRestrictions/geolocation-on-secure-origin-in-secure-origin.html [ Timeout ]
-Bug(none) http/tests/security/powerfulFeatureRestrictions/serviceworker-on-insecure-origin.html [ Failure ]
-Bug(none) http/tests/security/referrer-on-client-redirect.html [ Timeout ]
-Bug(none) http/tests/security/referrer-policy-attribute-anchor-no-referrer-when-downgrade.html [ Timeout ]
-Bug(none) http/tests/security/referrer-policy-attribute-area-no-referrer-when-downgrade.html [ Timeout ]
-Bug(none) http/tests/security/referrer-policy-attribute-iframe-no-referrer-when-downgrade.html [ Timeout ]
-Bug(none) http/tests/security/referrer-policy-attribute-img-no-referrer-when-downgrade.html [ Timeout ]
-Bug(none) http/tests/security/referrer-policy-conflicting-policies.html [ Timeout ]
-Bug(none) http/tests/security/referrer-policy-https-always.html [ Timeout ]
-Bug(none) http/tests/security/referrer-policy-https-default.html [ Timeout ]
-Bug(none) http/tests/security/referrer-policy-https-never.html [ Timeout ]
-Bug(none) http/tests/security/referrer-policy-https-no-referrer-when-downgrade.html [ Timeout ]
-Bug(none) http/tests/security/referrer-policy-https-no-referrer.html [ Timeout ]
-Bug(none) http/tests/security/referrer-policy-https-origin-when-crossorigin.html [ Timeout ]
-Bug(none) http/tests/security/referrer-policy-https-origin.html [ Timeout ]
-Bug(none) http/tests/security/referrer-policy-https-unsafe-url.html [ Timeout ]
-Bug(none) http/tests/security/referrer-policy-redirect-link.html [ Timeout ]
-Bug(none) http/tests/security/referrer-policy-redirect.html [ Timeout ]
-Bug(none) http/tests/security/referrerPolicyHeader/basic-header-cross-origin-with-origin-when-cross-origin.php [ Timeout ]
-Bug(none) http/tests/security/referrerPolicyHeader/basic-header-cross-origin-with-origin.php [ Timeout ]
-Bug(none) http/tests/security/referrerPolicyHeader/basic-header-downgrade-with-no-referrer-when-downgrade.https.php [ Timeout ]
-Bug(none) http/tests/security/referrerPolicyHeader/basic-header-no-downgrade-with-no-referrer-when-downgrade.https.php [ Timeout ]
-Bug(none) http/tests/security/referrerPolicyHeader/basic-header-unsafe-url.https.php [ Timeout ]
-Bug(none) http/tests/security/referrerPolicyHeader/legacy-always.php [ Timeout ]
-Bug(none) http/tests/security/referrerPolicyHeader/legacy-default.php [ Timeout ]
-Bug(none) http/tests/security/referrerPolicyHeader/legacy-never.php [ Timeout ]
-Bug(none) http/tests/security/referrerPolicyHeader/legacy-origin-when-crossorigin.php [ Timeout ]
-Bug(none) http/tests/security/referrerPolicyHeader/referrer-policy-cross-origin-redirect.php [ Timeout ]
-Bug(none) http/tests/security/referrerPolicyHeader/referrer-policy-header-on-cross-origin-redirect-response.https.html [ Timeout ]
-Bug(none) http/tests/security/sandboxed-opener-can-close-window.html [ Failure ]
-Bug(none) http/tests/security/secureContexts/authenticated.html [ Timeout ]
-Bug(none) http/tests/security/secureContexts/authenticated_sandbox.html [ Timeout ]
-Bug(none) http/tests/security/secureContexts/authenticated_srcdoc.html [ Timeout ]
 Bug(none) http/tests/security/secureContexts/authenticated_worker.https.html [ Timeout ]
-Bug(none) http/tests/security/secureContexts/unauthenticated.html [ Timeout ]
-Bug(none) http/tests/security/secureContexts/unauthenticated_sandbox.html [ Timeout ]
-Bug(none) http/tests/security/secureContexts/unauthenticated_srcdoc.html [ Timeout ]
 Bug(none) http/tests/security/secureContexts/unauthenticated_worker.html [ Timeout ]
 Bug(none) http/tests/security/suborigins/suborigin-cookies.php [ Timeout ]
 Bug(none) http/tests/security/suborigins/suborigin-service-worker-fetch-event.html [ Crash Failure Timeout ]
 Bug(none) http/tests/security/suborigins/suborigin-service-worker-no-xorigin-caching.html [ Crash Timeout ]
 Bug(none) http/tests/security/suborigins/suborigin-unsafe-cookies.php [ Timeout ]
-Bug(none) http/tests/security/upgrade-insecure-requests/basic-upgrade.https.html [ Timeout ]
-Bug(none) http/tests/security/upgrade-insecure-requests/form-upgrade.html [ Timeout ]
-Bug(none) http/tests/security/upgrade-insecure-requests/iframe-upgrade.https.html [ Timeout ]
-Bug(none) http/tests/security/upgrade-insecure-requests/sandbox-upgrade.https.php [ Timeout ]
-Bug(none) http/tests/security/video-cross-origin-readback.html [ Timeout ]
-Bug(none) http/tests/security/video-cross-origin-via-dom.html [ Timeout ]
-Bug(none) http/tests/security/webgl-remote-read-remote-image-allowed-with-credentials.html [ Timeout ]
-Bug(none) http/tests/security/webgl-remote-read-remote-image-allowed.html [ Timeout ]
-Bug(none) http/tests/security/webgl-remote-read-remote-image-blocked-no-crossorigin.html [ Timeout ]
-Bug(none) http/tests/security/window-named-proto.html [ Failure ]
-Bug(none) http/tests/security/window-named-valueOf.html [ Failure ]
-Bug(none) http/tests/security/xss-exception.html [ Timeout ]
 Bug(none) http/tests/sendbeacon/beacon-cookie.html [ Failure ]
 Bug(none) http/tests/sendbeacon/beacon-cross-origin.https.html [ Timeout ]
 Bug(none) http/tests/sendbeacon/beacon-same-origin.html [ Failure ]
 Bug(none) http/tests/serviceworker [ Crash Failure Timeout ]
-Bug(none) http/tests/storage/callbacks-are-called-in-correct-context.html [ Timeout ]
-Bug(none) http/tests/usb/secure-context.html [ Timeout ]
 Bug(none) http/tests/w3c/webperf/submission/Google/resource-timing/html/test_resource_redirects.html [ Failure ]
 Bug(none) http/tests/webaudio/autoplay-crossorigin.html [ Timeout ]
 Bug(none) http/tests/webfont/crbug-655076.html [ Timeout ]
@@ -1076,206 +809,45 @@
 Bug(none) http/tests/websocket/cookie-http-to-ws.pl [ Failure ]
 Bug(none) http/tests/websocket/fragmented-binary-frames.html [ Failure ]
 Bug(none) http/tests/websocket/httponly-cookie.pl [ Failure ]
-Bug(none) http/tests/workers/shared-worker-secure-context.https.html [ Timeout ]
 Bug(none) http/tests/workers/text-encoding.html [ Failure ]
-Bug(none) http/tests/xmlhttprequest [ Crash Failure Timeout ]
-Bug(none) inspector-enabled/console/console-uncaught-promise-no-inspector.html [ Timeout ]
+Bug(none) http/tests/xmlhttprequest/access-control-preflight-request-must-not-contain-cookie.html [ Failure ]
+Bug(none) http/tests/xmlhttprequest/filename-encoding.html [ Failure ]
+Bug(none) http/tests/xmlhttprequest/post-formdata.html [ Failure ]
+Bug(none) http/tests/xmlhttprequest/upload-onprogress-event.html [ Failure ]
+Bug(none) http/tests/xmlhttprequest/workers/post-formdata.html [ Failure ]
+Bug(none) http/tests/xmlhttprequest/workers/upload-onprogress-event.html [ Failure ]
+Bug(none) http/tests/xmlhttprequest/xmlhttprequest-data-url.html [ Failure ]
+Bug(none) http/tests/xmlhttprequest/upload-onload-event.html [ Timeout ]
+Bug(none) http/tests/xmlhttprequest/upload-onloadend-event-after-abort.html [ Timeout ]
+Bug(none) http/tests/xmlhttprequest/upload-onloadend-event-after-load.html [ Timeout ]
+Bug(none) http/tests/xmlhttprequest/upload-progress-events.html [ Timeout ]
+Bug(none) http/tests/xmlhttprequest/workers/shared-worker-response-type-blob-sync.html [ Timeout ]
+Bug(none) http/tests/xmlhttprequest/workers/shared-worker-response-type-blob.html [ Timeout ]
 Bug(none) inspector-protocol/accessibility/accessibility-nameSources-buttons.js [ Timeout ]
-Bug(none) inspector-protocol/css/css-get-background-colors.js [ Timeout ]
 Bug(none) inspector-protocol/css/cssom-modify-rule-and-get-rule-list.js [ Timeout ]
 Bug(none) inspector-protocol/dom/dom-request-document-with-child-nodes.js [ Failure ]
 Bug(none) inspector-protocol/heap-profiler/heap-samples-in-snapshot.js [ Failure ]
 Bug(none) inspector-protocol/heap-profiler/heap-snapshot-with-active-dom-object.js [ Failure ]
 Bug(none) inspector-protocol/heap-profiler/heap-snapshot-with-detached-dom-tree.js [ Failure ]
 Bug(none) inspector-protocol/heap-profiler/heap-snapshot-with-event-listener.js [ Failure ]
-Bug(none) inspector-protocol/network/resource-type.js [ Timeout ]
 Bug(none) inspector-protocol/network/websocket-initiator.js [ Timeout ]
 Bug(none) inspector-protocol/worker/exception-from-worker-contains-stack.js [ Timeout ]
 Bug(none) inspector-protocol/worker/worker-console.js [ Crash Timeout ]
-Bug(none) inspector/agents-enable-disable.html [ Timeout ]
-Bug(none) inspector/animation/animation-KeyframeEffectReadOnly-crash.html [ Timeout ]
-Bug(none) inspector/animation/animation-group-matching-animations.html [ Timeout ]
-Bug(none) inspector/animation/animation-group-matching-transitions.html [ Timeout ]
 Bug(none) inspector/animation/animation-transition-setTiming-crash.html [ Timeout ]
-Bug(none) inspector/audits/audits-empty-stylesheet.html [ Timeout ]
-Bug(none) inspector/audits/audits-panel-functional.html [ Timeout ]
-Bug(none) inspector/audits/audits-panel-noimages-functional.html [ Timeout ]
-Bug(none) inspector/changes/changes-highlighter.html [ Timeout ]
-Bug(none) inspector/changes/changes-sidebar.html [ Timeout ]
-Bug(none) inspector/components/chunked-file-reader.html [ Failure Timeout ]
-Bug(none) inspector/components/dom-extension.html [ Timeout ]
-Bug(none) inspector/components/file-path-scoring.html [ Timeout ]
-Bug(none) inspector/components/parsed-url.html [ Timeout ]
-Bug(none) inspector/components/progress-bar.html [ Timeout ]
-Bug(none) inspector/components/segmented-range.html [ Timeout ]
-Bug(none) inspector/components/throttler.html [ Failure ]
-Bug(none) inspector/console/console-copy-treeoutline.html [ Failure ]
-Bug(none) inspector/console/console-export.html [ Failure ]
-Bug(none) inspector/console/console-filter-level-test.html [ Failure ]
-Bug(none) inspector/console/console-format-collections.html [ Failure ]
-Bug(none) inspector/console/console-format-perfomance.html [ Failure ]
-Bug(none) inspector/console/console-format-table.html [ Failure ]
-Bug(none) inspector/console/console-format.html [ Failure ]
-Bug(none) inspector/console/console-functions.html [ Failure ]
-Bug(none) inspector/console/console-log-short-hand-method.html [ Failure ]
-Bug(none) inspector/console/console-object-constructor-name.html [ Failure ]
-Bug(none) inspector/console/console-tests.html [ Failure ]
-Bug(none) inspector/console/console-uncaught-promise.html [ Failure Timeout ]
-Bug(none) inspector/coverage/coverage-repeated.html [ Failure Timeout ]
-Bug(none) inspector/coverage/coverage-view-filter.html [ Failure ]
-Bug(none) inspector/coverage/coverage-view.html [ Failure Timeout ]
-Bug(none) inspector/coverage/decorations-after-script-formatter.html [ Timeout ]
-Bug(none) inspector/coverage/gutter-js.html [ Timeout ]
-Bug(none) inspector/coverage/multiple-instances-merge.html [ Timeout Failure ]
-Bug(none) inspector/coverage/reveal-autoformat.html [ Timeout ]
-Bug(none) inspector/coverage/segments-merge.html [ Timeout ]
-Bug(none) inspector/device-mode/device-mode-responsive.html [ Timeout ]
-Bug(none) inspector/device-mode/device-mode-switching-devices.html [ Timeout ]
-Bug(none) inspector/domdebugger/domdebugger-getEventListeners.html [ Timeout ]
-Bug(none) inspector/editor/text-editor-ctrl-d-2.html [ Timeout ]
-Bug(none) inspector/editor/text-editor-enter-behaviour.html [ Timeout ]
-Bug(none) inspector/editor/text-editor-reveal-line.html [ Timeout ]
-Bug(none) inspector/editor/text-editor-selection-to-search.html [ Timeout ]
-Bug(none) inspector/editor/text-editor-smart-braces.html [ Timeout ]
-Bug(none) inspector/editor/text-editor-token-at-position.html [ Timeout ]
-Bug(none) inspector/elements/accessibility/autocomplete-attribute.html [ Timeout ]
-Bug(none) inspector/elements/accessibility/edit-aria-attributes.html [ Timeout ]
-Bug(none) inspector/elements/attribute-modified-ns.html [ Timeout ]
-Bug(none) inspector/elements/bidi-dom-tree.html [ Timeout ]
-Bug(none) inspector/elements/dom-search-crash.html [ Timeout ]
-Bug(none) inspector/elements/edit/edit-dom-actions-4.html [ Timeout ]
-Bug(none) inspector/elements/elements-img-tooltip.html [ Timeout ]
-Bug(none) inspector/elements/elements-panel-reload-assert.html [ Timeout ]
 Bug(none) inspector/elements/elements-panel-restore-selection-when-node-comes-later.html [ Timeout ]
-Bug(none) inspector/elements/elements-panel-rewrite-href.html [ Timeout ]
-Bug(none) inspector/elements/elements-panel-search.html [ Timeout ]
-Bug(none) inspector/elements/elements-panel-selection-on-refresh.html [ Timeout ]
-Bug(none) inspector/elements/elements-panel-styles.html [ Timeout ]
-Bug(none) inspector/elements/event-listener-sidebar-remove.html [ Timeout ]
-Bug(none) inspector/elements/hide-shortcut.html [ Timeout ]
-Bug(none) inspector/elements/highlight/highlight-css-shapes-outside-scroll.html [ Timeout ]
-Bug(none) inspector/elements/highlight/highlight-dom-updates.html [ Timeout ]
-Bug(none) inspector/elements/highlight/highlight-node-transformed.html [ Timeout ]
-Bug(none) inspector/elements/highlight/highlight-node.html [ Timeout ]
-Bug(none) inspector/elements/highlight/highlight-svg-root-zoomed.html [ Timeout ]
-Bug(none) inspector/elements/highlight/highlight-svg-root.html [ Timeout ]
-Bug(none) inspector/elements/shadow/breadcrumb-shadow-roots.html [ Timeout ]
-Bug(none) inspector/elements/shadow/create-shadow-root.html [ Timeout ]
-Bug(none) inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-1.html [ Timeout ]
-Bug(none) inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-2.html [ Timeout ]
-Bug(none) inspector/elements/shadow/elements-panel-shadow-selection-on-refresh-3.html [ Timeout ]
-Bug(none) inspector/elements/shadow/inspect-deep-shadow-element.html [ Timeout ]
-Bug(none) inspector/elements/shadow/update-shadowdom.html [ Timeout ]
 Bug(none) inspector/elements/styles-1/color-aware-property-value-edit.html [ Timeout ]
-Bug(none) inspector/elements/styles-1/css-live-edit.html [ Timeout ]
-Bug(none) inspector/elements/styles-1/disable-property-workingcopy-update.html [ Timeout ]
-Bug(none) inspector/elements/styles-1/edit-media-text.html [ Timeout ]
-Bug(none) inspector/elements/styles-1/edit-name-with-trimmed-value.html [ Timeout ]
-Bug(none) inspector/elements/styles-1/edit-value-inside-property.html [ Timeout ]
-Bug(none) inspector/elements/styles-1/empty-background-url.html [ Failure ]
-Bug(none) inspector/elements/styles-2/add-import-rule.html [ Timeout ]
-Bug(none) inspector/elements/styles-2/cssom-shorthand-important.html [ Timeout ]
-Bug(none) inspector/elements/styles-2/force-pseudo-state.html [ Timeout ]
-Bug(none) inspector/elements/styles-2/inactive-properties.html [ Timeout ]
-Bug(none) inspector/elements/styles-2/inject-stylesheet.html [ Timeout ]
-Bug(none) inspector/elements/styles-2/media-emulation.html [ Timeout ]
-Bug(none) inspector/elements/styles-2/mixed-case-color-aware-properties.html [ Timeout ]
-Bug(none) inspector/elements/styles-2/page-reload-update-sidebar.html [ Timeout ]
-Bug(none) inspector/elements/styles-2/property-ui-location.html [ Timeout Failure ]
-Bug(none) inspector/elements/styles-3/style-autocomplete.html [ Timeout ]
-Bug(none) inspector/elements/styles-3/styles-add-blank-property.html [ Timeout ]
-Bug(none) inspector/elements/styles-3/styles-add-new-rule-colon.html [ Timeout ]
-Bug(none) inspector/elements/styles-3/styles-add-new-rule-to-stylesheet.html [ Timeout ]
-Bug(none) inspector/elements/styles-3/styles-add-new-rule.html [ Timeout ]
-Bug(none) inspector/elements/styles-3/styles-change-node-while-editing.html [ Timeout ]
-Bug(none) inspector/elements/styles-3/styles-commit-editing.html [ Timeout ]
-Bug(none) inspector/elements/styles-3/styles-disable-inherited.html [ Timeout ]
-Bug(none) inspector/elements/styles-3/styles-disable-then-change.html [ Timeout ]
-Bug(none) inspector/elements/styles-3/styles-disable-then-enable-overriden-ua.html [ Timeout ]
-Bug(none) inspector/elements/styles-3/styles-variables.html [ Timeout ]
-Bug(none) inspector/elements/styles-4/styles-formatting.html [ Timeout ]
-Bug(none) inspector/elements/styles-4/styles-inline-element-style-changes-should-not-force-style-recalc.html [ Timeout ]
-Bug(none) inspector/elements/styles-4/styles-live-locations-leak.html [ Timeout ]
-Bug(none) inspector/elements/styles-4/styles-new-API.html [ Timeout ]
-Bug(none) inspector/elements/styles-4/styles-properties-overload.html [ Timeout ]
-Bug(none) inspector/elements/styles-4/styles-should-not-force-sync-style-recalc.html [ Timeout ]
-Bug(none) inspector/elements/styles-4/styles-update-from-js.html [ Timeout ]
-Bug(none) inspector/elements/styles-4/styles-update-links-3.html [ Timeout ]
-Bug(none) inspector/elements/styles-4/styles-url-linkify.html [ Timeout ]
-Bug(none) inspector/elements/styles-4/stylesheet-source-url-comment.html [ Timeout ]
-Bug(none) inspector/elements/styles/cancel-upon-invalid-property.html [ Timeout ]
-Bug(none) inspector/elements/styles/original-content-provider.html [ Timeout ]
-Bug(none) inspector/elements/styles/url-multiple-collapsing.html [ Timeout ]
-Bug(none) inspector/file-system-mapping.html [ Timeout ]
-Bug(none) inspector/file-system-project.html [ Failure ]
-Bug(none) inspector/geolocation-emulation-tests.html [ Timeout ]
-Bug(none) inspector/import-open-inspector.html [ Timeout ]
-Bug(none) inspector/input-event-warning.html [ Timeout ]
-Bug(none) inspector/inspected-objects-not-overriden.html [ Timeout ]
-Bug(none) inspector/layers/layer-replay-scale.html [ Timeout ]
-Bug(none) inspector/layers/layers-3d-view-hit-testing.html [ Timeout ]
-Bug(none) inspector/modules-load-elements.html [ Timeout ]
-Bug(none) inspector/modules-load-initial.html [ Timeout ]
-Bug(none) inspector/modules-load-network.html [ Timeout ]
-Bug(none) inspector/modules-load-source.html [ Timeout ]
-Bug(none) inspector/network/network-cookies-pane.html [ Timeout ]
-Bug(none) inspector/network/network-json-parser.html [ Timeout ]
-Bug(none) inspector/profiler/cpu-profiler-save-load.html [ Timeout ]
-Bug(none) inspector/profiler/heap-snapshot-loader.html [ Timeout ]
-Bug(none) inspector/quick-open/command-menu.html [ Timeout ]
-Bug(none) inspector/runtime/runtime-es6-setSymbolPropertyValue.html [ Timeout ]
-Bug(none) inspector/sass/test-ast-css-1.html [ Timeout ]
-Bug(none) inspector/sass/test-ast-diff-1.html [ Timeout ]
-Bug(none) inspector/sass/test-ast-editing-1.html [ Timeout ]
-Bug(none) inspector/sass/test-ast-scss-3.html [ Timeout ]
-Bug(none) inspector/sass/test-ast-scss-6.html [ Timeout ]
-Bug(none) inspector/sass/test-edit-remove-property.html [ Timeout ]
-Bug(none) inspector/sass/test-edit-toggle-property.html [ Timeout ]
-Bug(none) inspector/sass/test-mapping-bad.html [ Timeout ]
-Bug(none) inspector/sass/test-mapping-good.html [ Timeout ]
-Bug(none) inspector/sass/test-mapping-with-cache-busting-url.html [ Timeout ]
-Bug(none) inspector/screen-orientation-override.html [ Timeout ]
-Bug(none) inspector/sha1.html [ Timeout ]
-Bug(none) inspector/sources/debugger-breakpoints/breakpoint-manager-listeners-count.html [ Failure ]
-Bug(none) inspector/sources/debugger-breakpoints/breakpoints-in-anonymous-script-with-two-targets.html [ Timeout ]
 Bug(none) inspector/sources/debugger-breakpoints/event-listener-breakpoints-xhr.html [ Timeout ]
-Bug(none) inspector/sources/debugger-pause/pause-in-inline-script.html [ Timeout ]
-Bug(none) inspector/sources/debugger-step/debugger-step-out-document-write.html [ Timeout ]
-Bug(none) inspector/sources/debugger-ui/script-snippet-model.html [ Timeout ]
-Bug(none) inspector/sources/debugger-ui/watch-expressions-preserve-expansion.html [ Failure ]
-Bug(none) inspector/sources/debugger/dynamic-script-tag.html [ Failure ]
-Bug(none) inspector/tabbed-pane-closeable-persistence.html [ Timeout ]
-Bug(none) inspector/tabbed-pane-max-tab-width-calculation.html [ Timeout ]
-Bug(none) inspector/tracing-session-id.html [ Timeout ]
-Bug(none) inspector/tracing/console-timeline.html [ Failure ]
-Bug(none) inspector/tracing/timeline-network/timeline-network-resource-details.html [ Failure ]
-Bug(none) inspector/tracing/timeline-network/timeline-network-resource.html [ Failure ]
-Bug(none) inspector/user-agent-setting.html [ Timeout ]
-Bug(none) inspector/version-controller.html [ Timeout ]
 Bug(none) installedapp/getinstalledrelatedapps-empty.html [ Timeout ]
 Bug(none) installedapp/getinstalledrelatedapps.html [ Timeout ]
 Bug(none) loader/iframe-src-change-onload-crash.html [ Timeout ]
-Bug(none) paint/invalidation/media-audio-no-spurious-repaints.html [ Timeout ]
 Bug(none) paint/invalidation/svg/relative-sized-image.xhtml [ Failure ]
 Bug(none) paint/invalidation/svg/scrolling-embedded-svg-file-image-repaint-problem.html [ Failure ]
-Bug(none) paint/invalidation/video-mute-repaint.html [ Timeout ]
-Bug(none) paint/invalidation/video-paint-invalidation.html [ Timeout ]
-Bug(none) paint/invalidation/video-unmute-repaint.html [ Timeout ]
 Bug(none) payments/payment-request-interface.html [ Failure ]
 Bug(none) payments/promises-keep-request-alive.html [ Timeout ]
-Bug(none) plugins/createScriptableObject-before-start.html [ Failure ]
-Bug(none) plugins/focus-change-3-change-blur.html [ Failure ]
-Bug(none) plugins/focus-change-4-change-focus-and-blur.html [ Failure ]
-Bug(none) plugins/gesture-events-scrolled.html [ Timeout Failure ]
-Bug(none) plugins/gesture-events.html [ Timeout ]
 Bug(none) plugins/iframe-plugin-bgcolor.html [ Timeout ]
-Bug(none) plugins/plugin-document-back-forward.html [ Timeout ]
-Bug(none) plugins/plugin-initiate-popup-window.html [ Timeout ]
 Bug(none) presentation/presentation-controller-close-connection.html [ Timeout ]
 Bug(none) presentation/presentation-controller-connection-closed-by-receiver.html [ Timeout ]
 Bug(none) presentation/presentation-controller-terminate-connection.html [ Timeout ]
-Bug(none) presentation/presentation-navigation-multipleurls.html [ Timeout ]
-Bug(none) presentation/presentation-navigation.html [ Timeout ]
 Bug(none) presentation/presentation-onreceiverconnection.html [ Timeout ]
 Bug(none) presentation/presentation-receiver-terminate-connection.html [ Timeout ]
 Bug(none) presentation/presentation-reconnect.html [ Timeout ]
@@ -1284,9 +856,6 @@
 Bug(none) presentation/presentationconnectionavailableevent-ctor-mock.html [ Timeout ]
 Bug(none) printing/subframes-percentage-height.html [ Failure ]
 Bug(none) scrollbars/listbox-scrollbar-combinations.html [ Failure ]
-Bug(none) storage/domstorage/events/basic.html [ Failure Timeout ]
-Bug(none) tables/mozilla/core/col_widths_fix_autoFixPer.html [ Timeout ]
-Bug(none) tables/mozilla_expected_failures/marvin/backgr_fixed-bg.html [ Failure ]
 Bug(none) traversal/node-iterator-009.html [ Failure ]
 Bug(none) traversal/tree-walker-006.html [ Failure ]
 Bug(none) virtual [ Crash Failure Timeout ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index ce44765..3b0f24b8 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -541,7 +541,6 @@
 crbug.com/635619 virtual/layout_ng/fast/block/float/floats-wrap-inside-inline-002.htm [ Failure ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/floats-wrap-inside-inline-003.htm [ Failure ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/floats-wrap-inside-inline-004.htm [ Failure ]
-crbug.com/635619 virtual/layout_ng/fast/block/float/floats-wrap-inside-inline-007.html [ Failure ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/formatting-context-changes.html [ Failure Crash ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/independent-align-positioning.html [ Failure ]
 crbug.com/635619 virtual/layout_ng/fast/block/float/intruding-painted-twice.html [ Failure ]
@@ -1757,7 +1756,6 @@
 crbug.com/626703 external/wpt/css/css-ui-3/text-overflow-021.html [ Failure ]
 crbug.com/626703 external/wpt/encoding/eof-utf-8-three.html [ Failure ]
 crbug.com/626703 external/wpt/encoding/eof-utf-8-two.html [ Failure ]
-crbug.com/626703 external/wpt/fetch/api/abort/general.html [ Timeout ]
 crbug.com/626703 virtual/mojo-blobs/external/wpt/fetch/api/abort/general.html [ Timeout ]
 crbug.com/626703 virtual/outofblink-cors/external/wpt/fetch/api/abort/general.html [ Timeout ]
 crbug.com/626703 external/wpt/page-visibility/onvisibilitychange.html [ Timeout ]
@@ -1766,7 +1764,7 @@
 crbug.com/626703 external/wpt/webrtc/RTCPeerConnection-setLocalDescription-offer.html [ Timeout ]
 crbug.com/626703 external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-answer.html [ Timeout ]
 crbug.com/626703 external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-offer.html [ Timeout ]
-crbug.com/626703 [ Mac10.10 ] external/wpt/WebCryptoAPI/generateKey/test_successes_RSA-PSS.https.html [ Timeout ]
+crbug.com/626703 [ Mac ] external/wpt/WebCryptoAPI/generateKey/test_successes_RSA-PSS.https.html [ Timeout Pass Failure ]
 crbug.com/626703 external/wpt/webrtc/RTCDtlsTransport-getRemoteCertificates.html [ Timeout ]
 crbug.com/626703 [ Win10 ] external/wpt/preload/delaying-onload-link-preload-after-discovery.html [ Timeout ]
 crbug.com/626703 external/wpt/2dcontext/building-paths/canvas_complexshapes_arcto_001.htm [ Failure ]
@@ -2120,6 +2118,20 @@
 crbug.com/626703 virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/update-bytecheck.https.html [ Timeout ]
 crbug.com/717157 external/wpt/fetch/api/basic/integrity-sharedworker.html [ Crash Timeout Pass ]
 
+# These external tests fail after turning on color correct rendering for canvas
+# since they use a non-SRGB source image.
+crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1.html [ Failure ]
+crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2.html [ Failure ]
+crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3.html [ Failure ]
+crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4.html [ Failure ]
+crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5.html [ Failure ]
+crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6.html [ Failure ]
+crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7.html [ Failure ]
+crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8.html [ Failure ]
+crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10.html [ Failure ]
+crbug.com/733274 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1.html [ Failure ]
+crbug.com/733274 virtual/display_list_2d_canvas/fast/canvas/canvas-pattern-no-repeat-with-transformations.html [ Failure ]
+crbug.com/733274 virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas.html [ Failure ]
 
 crbug.com/666993 external/wpt/html/webappapis/idle-callbacks/basic.html [ Timeout ]
 crbug.com/666993 external/wpt/html/webappapis/idle-callbacks/callback-idle-periods.html [ Timeout ]
@@ -2790,7 +2802,7 @@
 crbug.com/713094 [ Win ] fast/css/fontfaceset-check-platform-fonts.html [ Failure Pass ]
 
 # Image decode failures due to document destruction.
-crbug.com/721435 external/wpt/image-decodes/image-decode-iframe.html [ Skip ]
+crbug.com/721435 external/wpt/html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html [ Skip ]
 
 # Sheriff failures 2017-05-22
 crbug.com/725542 [ Debug ] editing/selection/doubleclick-beside-cr-span.html [ Pass Timeout ]
@@ -2866,18 +2878,9 @@
 crbug.com/736177 [ Mac10.12 ] fast/css/h1-in-section-elements.html [ Failure Pass ]
 crbug.com/736177 [ Mac10.12 ] fast/css/rem-calc-dynamic-scaling.html [ Failure Pass ]
 crbug.com/736177 [ Mac10.12 ] fast/css/rem-dynamic-scaling.html [ Failure Pass ]
-crbug.com/736177 [ Mac10.12 ] fast/css/text-overflow-input.html [ Failure Pass ]
 crbug.com/736177 [ Mac10.12 ] fast/dom/HTMLMeterElement/meter-optimums.html [ Failure Pass ]
 crbug.com/736177 [ Mac10.12 ] fast/dynamic/012.html [ Failure Pass ]
-crbug.com/736177 [ Mac10.12 ] fast/forms/control-restrict-line-height.html [ Failure Pass ]
 crbug.com/736177 [ Mac10.12 ] fast/forms/form-element-geometry.html [ Failure Pass ]
-crbug.com/736177 [ Mac10.12 ] fast/forms/input-appearance-height.html [ Failure Pass ]
-crbug.com/736177 [ Mac10.12 ] fast/forms/placeholder-position.html [ Failure Pass ]
-crbug.com/736177 [ Mac10.12 ] fast/forms/search/search-appearance-basic.html [ Failure Pass ]
-crbug.com/736177 [ Mac10.12 ] fast/forms/search/search-cancel-button-style-sharing.html [ Failure Pass ]
-crbug.com/736177 [ Mac10.12 ] fast/forms/search/search-display-none-cancel-button.html [ Failure Pass ]
-crbug.com/736177 [ Mac10.12 ] fast/forms/search/search-rtl.html [ Failure Pass ]
-crbug.com/736177 [ Mac10.12 ] fast/forms/search/searchfield-heights.html [ Failure Pass ]
 crbug.com/736177 [ Mac10.12 ] fast/inline/absolute-positioned-inline-in-centred-block.html [ Failure Pass ]
 crbug.com/736177 [ Mac10.12 ] fast/inline/left-right-center-inline-alignment-in-ltr-and-rtl-blocks.html [ Failure Pass ]
 crbug.com/736177 [ Mac10.12 ] fast/lists/ordered-list-with-no-ol-tag.html [ Failure Pass ]
@@ -2923,6 +2926,59 @@
 crbug.com/736177 [ Mac10.12 ] virtual/off-main-thread-fetch/http/tests/misc/acid2-pixel.html [ Failure Pass ]
 crbug.com/736177 [ Mac10.12 ] virtual/prefer_compositing_to_lcd_text/scrollbars/custom-scrollbar-with-incomplete-style.html [ Failure Pass ]
 crbug.com/736177 [ Mac10.12 ] virtual/rootlayerscrolls/scrollbars/custom-scrollbar-with-incomplete-style.html [ Failure Pass ]
+# These tests are failing on both Mac-10.12 when using an Intel GPU and Mac-10.11.6 when using no GPU
+crbug.com/736177 [ Mac ] fast/forms/control-restrict-line-height.html [ Failure Pass ]
+crbug.com/736177 [ Mac ] fast/forms/input-appearance-height.html [ Failure Pass ]
+crbug.com/736177 [ Mac ] fast/forms/placeholder-position.html [ Failure Pass ]
+crbug.com/736177 [ Mac ] fast/forms/search/search-appearance-basic.html [ Failure Pass ]
+crbug.com/736177 [ Mac ] fast/forms/search/search-cancel-button-style-sharing.html [ Failure Pass ]
+crbug.com/736177 [ Mac ] fast/forms/search/search-display-none-cancel-button.html [ Failure Pass ]
+crbug.com/736177 [ Mac ] fast/forms/search/search-rtl.html [ Failure Pass ]
+crbug.com/736177 [ Mac ] fast/forms/search/searchfield-heights.html [ Failure Pass ]
+# These tests are failing on Mac-10.12 when using an Intel GPU and Mac Retina
+crbug.com/736177 [ Mac10.12 Retina ] compositing/overflow/theme-affects-visual-overflow.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] css1/box_properties/acid_test.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] css2.1/t09-c5526c-display-00-e.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] css3/selectors3/html/css3-modsel-25.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] css3/selectors3/html/css3-modsel-70.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] css3/selectors3/xhtml/css3-modsel-25.xml [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] css3/selectors3/xhtml/css3-modsel-70.xml [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] css3/selectors3/xml/css3-modsel-25.xml [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] css3/selectors3/xml/css3-modsel-70.xml [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] fast/block/basic/011.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] fast/block/margin-collapse/103.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] fast/css/non-standard-checkbox-size.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] fast/forms/001.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] fast/forms/basic-inputs.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] fast/forms/checkbox/checkbox-appearance-basic.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] fast/forms/file/file-input-disabled.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] fast/forms/formmove.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] fast/forms/formmove2.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] fast/forms/indeterminate.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] fast/forms/input-value.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] fast/forms/radio/radio-appearance-basic.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] fast/inline/positionedLifetime.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] fast/parser/bad-xml-slash.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] fast/replaced/replaced-breaking.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] fast/text/textIteratorNilRenderer.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] fast/text/whitespace/normal-after-nowrap-breaking.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] paint/invalidation/forms/checkbox-focus-by-mouse-then-keydown.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] paint/invalidation/forms/radio-focus-by-mouse-then-keydown.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] tables/mozilla/bugs/bug1318.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] tables/mozilla/bugs/bug4527.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] tables/mozilla_expected_failures/core/captions1.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] tables/mozilla_expected_failures/core/captions2.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] virtual/mojo-loading/css1/box_properties/acid_test.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] virtual/prefer_compositing_to_lcd_text/compositing/overflow/theme-affects-visual-overflow.html [ Failure Pass ]
+crbug.com/736177 [ Mac10.12 Retina ] virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi.html [ Failure Pass ]
+# These tests are failing on Mac-10.9.5 when using no GPU
+crbug.com/736177 [ Mac10.9 ] editing/selection/modify_move/move_left_right_character_in_mixed_bidi.html [ Skip ]
+crbug.com/736177 [ Mac10.9 ] external/wpt/css/css-writing-modes-3/bidi-isolate-override-007.html [ Skip ]
+crbug.com/736177 [ Mac10.9 ] fast/text/international/bidi-LDB-2-formatting-characters.html [ Skip ]
+crbug.com/736177 [ Mac10.9 ] fast/text/international/bidi-neutral-run.html [ Skip ]
+crbug.com/736177 [ Mac10.9 ] inspector/elements/bidi-dom-tree.html [ Skip ]
+# fast/css/text-overflow-input.html test is flaky on all Mac platforms
+crbug.com/736177 [ Mac ] fast/css/text-overflow-input.html [ Failure Pass ]
 
 crbug.com/736177 [ Mac ] svg/as-border-image/svg-as-border-image.html [ Failure Pass ]
 
@@ -2945,9 +3001,6 @@
 # module script lacks XHTML support
 crbug.com/717643 external/wpt/html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml [ Failure ]
 
-# Skia rebaseline
-skbug.com/6931 [ Linux ] fast/text/sub-pixel/text-scaling-pixel.html [ NeedsManualRebaseline ]
-
 # Geolocation tests
 crbug.com/745079 external/wpt/geolocation-API/PositionOptions.https.html [ Failure ]
 
@@ -2965,7 +3018,7 @@
 crbug.com/746128 [ Win7 Debug ] virtual/new-remote-playback-pipeline/media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Failure ]
 crbug.com/746128 [ Win7 Debug ] virtual/new-remote-playback-pipeline/media/controls/controls-video-keynav.html [ Failure ]
 
-crbug.com/626703 [ Win7 ] external/wpt/image-decodes/image-decode-path-changes.html [ Pass Crash ]
+crbug.com/626703 [ Win7 ] external/wpt/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html [ Crash Pass ]
 
 # Sheriff failures 2017-07-20
 crbug.com/747163 [ Linux ] imagecapture/MediaStreamTrack-applyConstraints.html [ Pass Crash ]
@@ -2990,6 +3043,7 @@
 
 # Sheriff failure 2017-08-11
 crbug.com/754657 http/tests/media/media-source/mediasource-duration.html [ Pass Failure ]
+crbug.com/626703 virtual/outofblink-cors/external/wpt/fetch/api/response/response-cancel-stream.html [ Pass Timeout ]
 
 # Ganesh dither changes
 crbug.com/753462 virtual/gpu/fast/canvas/canvas-text-alignment.html [ NeedsManualRebaseline ]
@@ -2997,3 +3051,9 @@
 crbug.com/753462 virtual/gpu/fast/canvas/gradient-add-second-start-end-stop.html [ NeedsManualRebaseline ]
 
 crbug.com/746904 [ Win ] fast/text/ellipsis-in-relative-inline.html [ Failure Pass ]
+
+crbug.com/731018 [ Mac ] sensor/accelerometer.html [ Failure Pass Crash ]
+crbug.com/731018 [ Mac ] sensor/ambient-light-sensor.html [ Failure Pass Crash ]
+crbug.com/731018 [ Mac ] sensor/gyroscope.html [ Failure Pass Crash ]
+crbug.com/731018 [ Mac ] sensor/magnetometer.html [ Failure Pass Crash ]
+crbug.com/731018 [ Mac ] sensor/orientation-sensor.html [ Failure Pass Crash ]
diff --git a/third_party/WebKit/LayoutTests/W3CImportExpectations b/third_party/WebKit/LayoutTests/W3CImportExpectations
index ac4b820..85fce77 100644
--- a/third_party/WebKit/LayoutTests/W3CImportExpectations
+++ b/third_party/WebKit/LayoutTests/W3CImportExpectations
@@ -89,7 +89,6 @@
 external/wpt/css/css-conditional-3 [ Skip ]
 external/wpt/css/css-counter-styles-3 [ Skip ]
 external/wpt/css/css-exclusions-1 [ Skip ]
-external/wpt/css/css-fonts-3 [ Skip ]
 external/wpt/css/css-gcpm-3 [ Skip ]
 external/wpt/css/css-images-3 [ Skip ]
 external/wpt/css/css-lists-3 [ Skip ]
diff --git a/third_party/WebKit/LayoutTests/editing/execCommand/insert-list-empty-div-expected.txt b/third_party/WebKit/LayoutTests/editing/execCommand/insert-list-empty-div-expected.txt
deleted file mode 100644
index d07245c..0000000
--- a/third_party/WebKit/LayoutTests/editing/execCommand/insert-list-empty-div-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-| <ul>
-|   <li>
-|     <#selection-caret>
-|     <br>
diff --git a/third_party/WebKit/LayoutTests/editing/execCommand/insert-list-empty-div.html b/third_party/WebKit/LayoutTests/editing/execCommand/insert-list-empty-div.html
deleted file mode 100644
index 8c46ce9..0000000
--- a/third_party/WebKit/LayoutTests/editing/execCommand/insert-list-empty-div.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<script src="../../resources/dump-as-markup.js"></script>
-<p>This tests InsertList inside an empty div with no placeholder.  You should see an empty list item with a caret inside of it.</p>
-<div id="div" contenteditable="true"></div>
-
-<script>
-var sel = window.getSelection();
-var div = document.getElementById("div");
-sel.collapse(div, 0);
-
-document.execCommand("InsertUnorderedList");
-Markup.dump("div");
-</script>
diff --git a/third_party/WebKit/LayoutTests/editing/execCommand/insert_list_empty_div.html b/third_party/WebKit/LayoutTests/editing/execCommand/insert_list_empty_div.html
new file mode 100644
index 0000000..834980c6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/editing/execCommand/insert_list_empty_div.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../assert_selection.js"></script>
+<script>
+test(() => assert_selection(
+  '<div contenteditable>|</div>',
+  'InsertUnorderedList',
+  [
+  '<div contenteditable>',
+    '<ul><li>|<br></li></ul>',
+  '</div>'
+  ]),
+  'This tests InsertList inside an empty div with no placeholder');
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
index 91ccd6c..0c906de5 100644
--- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
+++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -4845,6 +4845,54 @@
      {}
     ]
    ],
+   "compat/webkit-linear-gradient-line-bottom.html": [
+    [
+     "/compat/webkit-linear-gradient-line-bottom.html",
+     [
+      [
+       "/compat/green-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "compat/webkit-linear-gradient-line-left.html": [
+    [
+     "/compat/webkit-linear-gradient-line-left.html",
+     [
+      [
+       "/compat/green-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "compat/webkit-linear-gradient-line-right.html": [
+    [
+     "/compat/webkit-linear-gradient-line-right.html",
+     [
+      [
+       "/compat/green-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "compat/webkit-linear-gradient-line-top.html": [
+    [
+     "/compat/webkit-linear-gradient-line-top.html",
+     [
+      [
+       "/compat/green-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "compat/webkit-text-fill-color-property-001a.html": [
     [
      "/compat/webkit-text-fill-color-property-001a.html",
@@ -68073,6 +68121,11 @@
      {}
     ]
    ],
+   "compat/green-ref.html": [
+    [
+     {}
+    ]
+   ],
    "compat/webkit-text-fill-color-property-001-ref.html": [
     [
      {}
@@ -79153,6 +79206,11 @@
      {}
     ]
    ],
+   "css/css-transforms-2/animation/resources/interpolation-testcommon.js": [
+    [
+     {}
+    ]
+   ],
    "css/css-transforms-2/css-rotate-2d-3d-001-ref.html": [
     [
      {}
@@ -83713,6 +83771,11 @@
      {}
     ]
    ],
+   "css/motion-1/animation/resources/interpolation-testcommon.js": [
+    [
+     {}
+    ]
+   ],
    "css/motion-1/offset-path-ray-ref.html": [
     [
      {}
@@ -86388,6 +86451,11 @@
      {}
     ]
    ],
+   "editing/data/insert-list-items-in-table-cells.js": [
+    [
+     {}
+    ]
+   ],
    "editing/data/inserthorizontalrule.js": [
     [
      {}
@@ -87848,7 +87916,17 @@
      {}
     ]
    ],
-   "fetch/api/abort/general.js": [
+   "fetch/api/abort/general-sharedworker-expected.txt": [
+    [
+     {}
+    ]
+   ],
+   "fetch/api/abort/general.any-expected.txt": [
+    [
+     {}
+    ]
+   ],
+   "fetch/api/abort/general.any.worker-expected.txt": [
     [
      {}
     ]
@@ -88173,6 +88251,11 @@
      {}
     ]
    ],
+   "fetch/api/request/request-error.js": [
+    [
+     {}
+    ]
+   ],
    "fetch/api/request/request-idl-expected.txt": [
     [
      {}
@@ -126320,6 +126403,24 @@
      {}
     ]
    ],
+   "css/css-transforms-2/animation/rotate-interpolation.html": [
+    [
+     "/css/css-transforms-2/animation/rotate-interpolation.html",
+     {}
+    ]
+   ],
+   "css/css-transforms-2/animation/scale-interpolation.html": [
+    [
+     "/css/css-transforms-2/animation/scale-interpolation.html",
+     {}
+    ]
+   ],
+   "css/css-transforms-2/animation/translate-interpolation.html": [
+    [
+     "/css/css-transforms-2/animation/translate-interpolation.html",
+     {}
+    ]
+   ],
    "css/css-transforms-2/parsing/rotate-parsing-invalid.html": [
     [
      "/css/css-transforms-2/parsing/rotate-parsing-invalid.html",
@@ -126860,6 +126961,30 @@
      {}
     ]
    ],
+   "css/motion-1/animation/offset-anchor-interpolation.html": [
+    [
+     "/css/motion-1/animation/offset-anchor-interpolation.html",
+     {}
+    ]
+   ],
+   "css/motion-1/animation/offset-distance-interpolation.html": [
+    [
+     "/css/motion-1/animation/offset-distance-interpolation.html",
+     {}
+    ]
+   ],
+   "css/motion-1/animation/offset-position-interpolation.html": [
+    [
+     "/css/motion-1/animation/offset-position-interpolation.html",
+     {}
+    ]
+   ],
+   "css/motion-1/animation/offset-rotate-interpolation.html": [
+    [
+     "/css/motion-1/animation/offset-rotate-interpolation.html",
+     {}
+    ]
+   ],
    "css/motion-1/parsing/offset-anchor-parsing-invalid.html": [
     [
      "/css/motion-1/parsing/offset-anchor-parsing-invalid.html",
@@ -129878,6 +130003,12 @@
      {}
     ]
    ],
+   "editing/run/insert-list-items-in-table-cell.html": [
+    [
+     "/editing/run/insert-list-items-in-table-cell.html",
+     {}
+    ]
+   ],
    "editing/run/inserthorizontalrule.html": [
     [
      "/editing/run/inserthorizontalrule.html",
@@ -131798,9 +131929,19 @@
      {}
     ]
    ],
-   "fetch/api/abort/general.html": [
+   "fetch/api/abort/general-sharedworker.html": [
     [
-     "/fetch/api/abort/general.html",
+     "/fetch/api/abort/general-sharedworker.html",
+     {}
+    ]
+   ],
+   "fetch/api/abort/general.any.js": [
+    [
+     "/fetch/api/abort/general.any.html",
+     {}
+    ],
+    [
+     "/fetch/api/abort/general.any.worker.html",
      {}
     ]
    ],
@@ -137284,6 +137425,30 @@
      {}
     ]
    ],
+   "html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html": [
+    [
+     "/html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html": [
+    [
+     "/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "html/semantics/embedded-content/the-img-element/decode/image-decode.html": [
+    [
+     "/html/semantics/embedded-content/the-img-element/decode/image-decode.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
    "html/semantics/embedded-content/the-img-element/delay-load-event-detached.html": [
     [
      "/html/semantics/embedded-content/the-img-element/delay-load-event-detached.html",
@@ -141514,30 +141679,6 @@
      {}
     ]
    ],
-   "image-decodes/image-decode-iframe.html": [
-    [
-     "/image-decodes/image-decode-iframe.html",
-     {
-      "timeout": "long"
-     }
-    ]
-   ],
-   "image-decodes/image-decode-path-changes.html": [
-    [
-     "/image-decodes/image-decode-path-changes.html",
-     {
-      "timeout": "long"
-     }
-    ]
-   ],
-   "image-decodes/image-decode.html": [
-    [
-     "/image-decodes/image-decode.html",
-     {
-      "timeout": "long"
-     }
-    ]
-   ],
    "imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html": [
     [
      "/imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html",
@@ -165638,6 +165779,12 @@
      {}
     ]
    ],
+   "wasm/create_multiple_memory.worker.js": [
+    [
+     "/wasm/create_multiple_memory.worker.html",
+     {}
+    ]
+   ],
    "wasm/wasm_indexeddb_test.html": [
     [
      "/wasm/wasm_indexeddb_test.html",
@@ -174884,7 +175031,7 @@
    "support"
   ],
   "./.travis.yml": [
-   "250f9bc8512445215c63504d28305b723c4b3385",
+   "8057d3e8925cb559271139ebbbfc516cad484a6c",
    "support"
   ],
   "./CONTRIBUTING.md": [
@@ -181644,7 +181791,7 @@
    "support"
   ],
   "WebIDL/current-realm.html": [
-   "167c7c1f53ae2bf457f6b3f917f0ef988c585c7c",
+   "3d9564314c7ce59ce6a29dfa94c35e496e214bf5",
    "testharness"
   ],
   "WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.js": [
@@ -181816,7 +181963,7 @@
    "support"
   ],
   "XMLHttpRequest/access-control-and-redirects.htm": [
-   "2b635d3c25e01a971ce2e75efa63ede57194a8b3",
+   "ff051032814b1242f527970edc58675e3e14fb98",
    "testharness"
   ],
   "XMLHttpRequest/access-control-basic-allow-access-control-origin-header.htm": [
@@ -183180,11 +183327,11 @@
    "support"
   ],
   "background-fetch/interfaces-expected.txt": [
-   "aa898874db8a0e7d1996e5c6edf908e630ad59f1",
+   "e1917d1f86972afa30445d34ab2666a1b30b7f6c",
    "support"
   ],
   "background-fetch/interfaces-worker.https-expected.txt": [
-   "d71d5e37ff9207c0f649048605c608ea4bdf381d",
+   "c0afe335a3e598594ab8779028b02548687db44e",
    "support"
   ],
   "background-fetch/interfaces-worker.https.html": [
@@ -183200,7 +183347,7 @@
    "support"
   ],
   "background-fetch/interfaces.worker-expected.txt": [
-   "460a2a19f8dffd1763bb3053f62e26b9374becf5",
+   "6d0f72fd0b1a601f7d29eb2c9f709494d8fbceb1",
    "support"
   ],
   "background-fetch/interfaces.worker.js": [
@@ -183272,7 +183419,7 @@
    "support"
   ],
   "beacon/headers/header-content-type-expected.txt": [
-   "369e5f74f98a790f954289e3786974c2941fb682",
+   "cfce1555852fb39dee45de50c96d2510d7c99267",
    "support"
   ],
   "beacon/headers/header-content-type.html": [
@@ -183595,6 +183742,26 @@
    "80579a1e88af8e60c7446f34446b90bd3e9cf8c7",
    "support"
   ],
+  "compat/green-ref.html": [
+   "4b23ea52d785a6dd19785bd4278bf700eb5547f8",
+   "support"
+  ],
+  "compat/webkit-linear-gradient-line-bottom.html": [
+   "af59a0aa3b8a195ba7ef401b582be9384a23a388",
+   "reftest"
+  ],
+  "compat/webkit-linear-gradient-line-left.html": [
+   "f131166051da9a82ede93f076f15832f61f39234",
+   "reftest"
+  ],
+  "compat/webkit-linear-gradient-line-right.html": [
+   "2d87c4a09d77f3171fa91bbf8f2f0b1a412b7d94",
+   "reftest"
+  ],
+  "compat/webkit-linear-gradient-line-top.html": [
+   "be7fb91dc6459617c20232cd5333e9b3340f3341",
+   "reftest"
+  ],
   "compat/webkit-text-fill-color-currentColor.html": [
    "7512b6ce45b5528ee7b9794c32954e954d736f88",
    "testharness"
@@ -185928,7 +186095,7 @@
    "testharness"
   ],
   "content-security-policy/securitypolicyviolation/idl-expected.txt": [
-   "8a26544297000dbcd2ad096b596bfb2b53e28807",
+   "375bdc2a72d96d28608acab81a57240d16a300e7",
    "support"
   ],
   "content-security-policy/securitypolicyviolation/idl.html": [
@@ -186596,7 +186763,7 @@
    "reftest"
   ],
   "css-fonts/variations/font-parse-numeric-stretch-style-weight.html": [
-   "421e402060f1418562819bb6efae85a7a1cc8958",
+   "b9aa593e5fcba0d7af8f66446d473608a7025f1c",
    "testharness"
   ],
   "css-fonts/variations/resources/variabletest_box.ttf": [
@@ -210843,6 +211010,22 @@
    "86257012c615c6580cea602a1ee2f8617dcbb336",
    "support"
   ],
+  "css/css-transforms-2/animation/resources/interpolation-testcommon.js": [
+   "e53ebd086f11169bf516f4d2e68449290943ba98",
+   "support"
+  ],
+  "css/css-transforms-2/animation/rotate-interpolation.html": [
+   "f5b8b30c9bc0789d59b3451789c24009b93dd21f",
+   "testharness"
+  ],
+  "css/css-transforms-2/animation/scale-interpolation.html": [
+   "51271e16c98a7a4e6405c28d149e77eb439e670c",
+   "testharness"
+  ],
+  "css/css-transforms-2/animation/translate-interpolation.html": [
+   "9a28f675c790c3dec66f655418051a5a7ba52ec7",
+   "testharness"
+  ],
   "css/css-transforms-2/backface-visibility-hidden-001.html": [
    "d12cfa3b31b7f98d0ff5693bfde49247d34cb156",
    "reftest"
@@ -220064,7 +220247,7 @@
    "testharness"
   ],
   "css/geometry-1/interfaces-expected.txt": [
-   "d78f1e1c8b781893ad6da9ee8bb2c60448f88066",
+   "52cba59f4b0eb6de5e3f4bbb42c7b0c4547b7de7",
    "support"
   ],
   "css/geometry-1/interfaces.html": [
@@ -220087,6 +220270,26 @@
    "13d88ccf8c2f03db7e1db7f6fc704ba46a06e0e1",
    "support"
   ],
+  "css/motion-1/animation/offset-anchor-interpolation.html": [
+   "30eb3ea68aa502d93125d4e54ff15c0a96458cfa",
+   "testharness"
+  ],
+  "css/motion-1/animation/offset-distance-interpolation.html": [
+   "f242f67f0d1a1c25a871d4ae949d42f9d1df0027",
+   "testharness"
+  ],
+  "css/motion-1/animation/offset-position-interpolation.html": [
+   "6c21c93c0715af758033d7b582f072988b379b15",
+   "testharness"
+  ],
+  "css/motion-1/animation/offset-rotate-interpolation.html": [
+   "37c091bd5a59d4853bc9f5c82e157ac3d4f29643",
+   "testharness"
+  ],
+  "css/motion-1/animation/resources/interpolation-testcommon.js": [
+   "51a3f4808392b7bcce4f2569256c540a3be817dc",
+   "support"
+  ],
   "css/motion-1/offset-path-ray-ref.html": [
    "dfea2bd9cadf9d1b83e95bc2dbffef3539937ff1",
    "support"
@@ -222900,7 +223103,7 @@
    "support"
   ],
   "cssom-view/scrollIntoView-empty-args.html": [
-   "c1bd398158cc935c8c69cb0291c2ef0e0faa6bad",
+   "57e22136750f54145c37722674389590b7f340b6",
    "testharness"
   ],
   "cssom-view/scrollIntoView-shadow.html": [
@@ -223304,7 +223507,7 @@
    "testharness"
   ],
   "cssom/interfaces-expected.txt": [
-   "5dc9fe830179160590e75ddf075deadc074f0c63",
+   "a42310bfdde44ca58b0070f39d8d1394e0dbbfab",
    "support"
   ],
   "cssom/interfaces.html": [
@@ -224112,7 +224315,7 @@
    "testharness"
   ],
   "dom/interfaces-expected.txt": [
-   "31cb05f866e726cfe568c3598b29a6eaf8ef29ab",
+   "077850253a4dbaab9b562bf3f435c192ba3bc223",
    "support"
   ],
   "dom/interfaces.html": [
@@ -225699,6 +225902,10 @@
    "821cc4fefcfce96832c1a4547698801b554ae426",
    "support"
   ],
+  "editing/data/insert-list-items-in-table-cells.js": [
+   "f6e8969d30a53e42c6adace5bd9598862b92c611",
+   "support"
+  ],
   "editing/data/inserthorizontalrule.js": [
    "118414ee839b94b9a747e0dfd2068d728c171db7",
    "support"
@@ -225951,6 +226158,10 @@
    "1bed1283ad3b220b2949c0720cba60105c888ec2",
    "testharness"
   ],
+  "editing/run/insert-list-items-in-table-cell.html": [
+   "7bb730a43273a9220ef491511acbdd5c91fbc9b7",
+   "testharness"
+  ],
   "editing/run/inserthorizontalrule-expected.txt": [
    "6535eed7f208b2eca892bdec4e712c240db6a9f5",
    "support"
@@ -228056,19 +228267,31 @@
    "testharness"
   ],
   "fetch/api/abort/general-serviceworker.https-expected.txt": [
-   "ebd3eaef4e979be418b0694548d8bb5c0b0fcbed",
+   "cddf57d551be890ab3f27755e15ebedf77874f30",
    "support"
   ],
   "fetch/api/abort/general-serviceworker.https.html": [
-   "c7baa6df72fb31f6e5463d1a459c3dbf37d106e2",
+   "ea0eda077eb4a5a234ad3b97595da16aee178fc9",
    "testharness"
   ],
-  "fetch/api/abort/general.html": [
-   "203afd95b91a83943d3d84db5d43bfe4245fa177",
+  "fetch/api/abort/general-sharedworker-expected.txt": [
+   "a46979591ba7c4632cebef4c904a48db5cec41f1",
+   "support"
+  ],
+  "fetch/api/abort/general-sharedworker.html": [
+   "96563c4324949b5dece964eaf6df0b25324e8365",
    "testharness"
   ],
-  "fetch/api/abort/general.js": [
-   "980a50cf0be82bc7ffb2e7024739173273ae1263",
+  "fetch/api/abort/general.any-expected.txt": [
+   "a46979591ba7c4632cebef4c904a48db5cec41f1",
+   "support"
+  ],
+  "fetch/api/abort/general.any.js": [
+   "69e4ceb672265f67535e2cc98f24b1cb47b66b5c",
+   "testharness"
+  ],
+  "fetch/api/abort/general.any.worker-expected.txt": [
+   "a46979591ba7c4632cebef4c904a48db5cec41f1",
    "support"
   ],
   "fetch/api/abort/serviceworker-intercepted.https-expected.txt": [
@@ -228728,19 +228951,23 @@
    "testharness"
   ],
   "fetch/api/request/request-error-expected.txt": [
-   "b77223e27d25a075956326f1a1bb4293adda8a83",
+   "2953657949847b572bc2b030de3ee9f58b3cab98",
    "support"
   ],
   "fetch/api/request/request-error.html": [
-   "ff308916884f69b3f4aa8f2017c4d9fe0caf0f00",
+   "ec4b12f1eca0a0c64c04269f67194cdc90571e0a",
    "testharness"
   ],
+  "fetch/api/request/request-error.js": [
+   "ad664c95b0de2ff02c4967cff601d5ed4d8fc2e4",
+   "support"
+  ],
   "fetch/api/request/request-headers.html": [
    "0a645876664c428f6ac8d170e991ccf257bb307e",
    "testharness"
   ],
   "fetch/api/request/request-idl-expected.txt": [
-   "8ca22265e999443344290f4cdfa2dfb9bc88e7a0",
+   "1492a19999f400ce9c84780ef4c5025585cf47fc",
    "support"
   ],
   "fetch/api/request/request-idl.html": [
@@ -228920,7 +229147,7 @@
    "testharness"
   ],
   "fetch/api/response/response-idl-expected.txt": [
-   "aedba6ed576b1adae6fba4311c276e8ef45c09aa",
+   "dbdf2f1d39394760cba0b90b3d0e5609bd53a87b",
    "support"
   ],
   "fetch/api/response/response-idl.html": [
@@ -229336,7 +229563,7 @@
    "testharness"
   ],
   "fullscreen/interfaces-expected.txt": [
-   "b9a34fdf818c6c0fcf06b2a91357fa1963b70066",
+   "dcf3f5ed6afbeec88d53490c67c9d3d3d71bd4aa",
    "support"
   ],
   "fullscreen/interfaces.html": [
@@ -229496,7 +229723,7 @@
    "testharness"
   ],
   "hr-time/idlharness-expected.txt": [
-   "0e4c8b54fc09dce8b64143477ccb1253cc234f0c",
+   "9b54045e82c2ae9fedf0612db7dc963b14acdbaa",
    "support"
   ],
   "hr-time/idlharness.html": [
@@ -229516,7 +229743,7 @@
    "testharness"
   ],
   "hr-time/timeOrigin.html": [
-   "3bb4eb8162169e582fea93a7cb1f6257325a0606",
+   "f07da265bb9d1036589ff116b14ea1370abc4194",
    "testharness"
   ],
   "hr-time/timing-attack.html": [
@@ -229664,7 +229891,7 @@
    "manual"
   ],
   "html-media-capture/idlharness-expected.txt": [
-   "a1fd1490201959a01f00647584a0dd47465d68f7",
+   "f581be5efe31ddca7a4bb3405c18a751dae21fe3",
    "support"
   ],
   "html-media-capture/idlharness.html": [
@@ -229708,7 +229935,7 @@
    "testharness"
   ],
   "html/browsers/browsing-the-web/history-traversal/PopStateEvent.html": [
-   "2a7ed0827fc61af7b3bdd238577887aff1902ea7",
+   "5a9c575a86adbbbca30734992b4d80c22f3973a1",
    "testharness"
   ],
   "html/browsers/browsing-the-web/history-traversal/browsing_context_name-0.html": [
@@ -233992,7 +234219,7 @@
    "support"
   ],
   "html/dom/interfaces-expected.txt": [
-   "0e0f256e79bf4c71a581dae5071fe1c916c3fa74",
+   "52d9b50e4d2c14f774cf4e69f746877b9a65824b",
    "support"
   ],
   "html/dom/interfaces.html": [
@@ -234000,7 +234227,7 @@
    "testharness"
   ],
   "html/dom/interfaces.worker-expected.txt": [
-   "259f9df6b1bc2bad20760c591893e5eac739e218",
+   "fc0cba1f6dfcb7ff77efd101a57f0255d1f217b1",
    "support"
   ],
   "html/dom/interfaces.worker.js": [
@@ -240471,6 +240698,18 @@
    "bdbfbe9a5908c6233bd7b9697a0762bd2e0f6ede",
    "testharness"
   ],
+  "html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html": [
+   "2632f69b005ea382ed91bfb71a7e0e2ee931a0c8",
+   "testharness"
+  ],
+  "html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html": [
+   "64dde3f7b1f9ed02e4433858f075123f18c092a4",
+   "testharness"
+  ],
+  "html/semantics/embedded-content/the-img-element/decode/image-decode.html": [
+   "02d38d593fb42587c3ef261c349f7c42db345005",
+   "testharness"
+  ],
   "html/semantics/embedded-content/the-img-element/delay-load-event-detached.html": [
    "6845b4a7fd45b083c1c380ad021860654baefc4f",
    "testharness"
@@ -245383,18 +245622,6 @@
    "bc4c7a8b5eef0e082a5fa7c8c763957d92730747",
    "support"
   ],
-  "image-decodes/image-decode-iframe.html": [
-   "2632f69b005ea382ed91bfb71a7e0e2ee931a0c8",
-   "testharness"
-  ],
-  "image-decodes/image-decode-path-changes.html": [
-   "64dde3f7b1f9ed02e4433858f075123f18c092a4",
-   "testharness"
-  ],
-  "image-decodes/image-decode.html": [
-   "02d38d593fb42587c3ef261c349f7c42db345005",
-   "testharness"
-  ],
   "imagebitmap-renderingcontext/OWNERS": [
    "2df4accfcd4bf31567eaf545e056469356f2529e",
    "support"
@@ -245640,7 +245867,7 @@
    "testharness"
   ],
   "input-events/input-events-typing-data-manual.html": [
-   "f94325d74e69fbd62bfdff3c0f4676a3d2c50d09",
+   "196d4a35b474ef3ad25a56a22a58cf421555903f",
    "manual"
   ],
   "interfaces/clipboard.idl": [
@@ -245800,7 +246027,7 @@
    "testharness"
   ],
   "intersection-observer/timestamp.html": [
-   "b26e1b4b295722e8def9a2d6870465fe4140873c",
+   "b9bf8d472d7751ec4a1ebee925d12668bedeee7a",
    "testharness"
   ],
   "intersection-observer/unclipped-root.html": [
@@ -245820,7 +246047,7 @@
    "support"
   ],
   "keyboard-lock/idlharness.https-expected.txt": [
-   "c78b5d669f56d9f602ca93c9e7492a7fee9839b1",
+   "47d938943455f98a229a6b3b66f81abc35eb6dc0",
    "support"
   ],
   "keyboard-lock/idlharness.https.html": [
@@ -245924,7 +246151,7 @@
    "testharness"
   ],
   "media-capabilities/idlharness-expected.txt": [
-   "63d4a0979b459e2d469d38042908a553016f446d",
+   "27f2c3b9e1a399f723ac51b9f81401ca66a8a389",
    "support"
   ],
   "media-capabilities/idlharness.html": [
@@ -245988,7 +246215,7 @@
    "support"
   ],
   "media-source/interfaces-expected.txt": [
-   "41a616b5f8c34187c445a473990bfadaecbda8e0",
+   "40b07412dc1a50737ed9d1887e7ada88d321b39d",
    "support"
   ],
   "media-source/interfaces.html": [
@@ -246544,7 +246771,7 @@
    "testharness"
   ],
   "mediacapture-fromelement/idlharness-expected.txt": [
-   "8a4cd1bf27e02170c3dace68de4bd1723a2f25fa",
+   "c40a2b1d040d63881489b806dbc05fd69d8b970f",
    "support"
   ],
   "mediacapture-fromelement/idlharness.html": [
@@ -246568,7 +246795,7 @@
    "support"
   ],
   "mediacapture-record/idlharness-expected.txt": [
-   "15c47d282eedba507c099d404e44848b4e4b6e74",
+   "a81911676e4584e569303a050b4474288836f588",
    "support"
   ],
   "mediacapture-record/idlharness.html": [
@@ -246620,7 +246847,7 @@
    "testharness"
   ],
   "mediacapture-streams/MediaDevices-IDL-all-expected.txt": [
-   "26a244770dd0578e9f9b8f0194e1c6837d926ad8",
+   "1cdc2218b94bba210533b4b4bc4821691fb7818b",
    "support"
   ],
   "mediacapture-streams/MediaDevices-IDL-all.html": [
@@ -246628,7 +246855,7 @@
    "testharness"
   ],
   "mediacapture-streams/MediaDevices-IDL-enumerateDevices-expected.txt": [
-   "0f2cdc842faac1e6425df74e8029cdea893e15c1",
+   "4ab4fb05ead702f828be7eb05b144f6ef917437f",
    "support"
   ],
   "mediacapture-streams/MediaDevices-IDL-enumerateDevices.html": [
@@ -246720,7 +246947,7 @@
    "testharness"
   ],
   "mediacapture-streams/MediaStreamTrack-init.https-expected.txt": [
-   "36aea560450ddb3cbeea30e6b8d3d34a55081699",
+   "13316326e8513f117457b3be5c383e2f01df9c2e",
    "support"
   ],
   "mediacapture-streams/MediaStreamTrack-init.https.html": [
@@ -246744,7 +246971,7 @@
    "support"
   ],
   "mediasession/idlharness-expected.txt": [
-   "5b32854f7c36eb7dcd421de90382bd664c6ac666",
+   "b10b66066037ac11bcae9dfb437a5d25b167f9ac",
    "support"
   ],
   "mediasession/idlharness.html": [
@@ -254888,7 +255115,7 @@
    "manual"
   ],
   "orientation-event/idlharness-expected.txt": [
-   "0ed66e5c56365883369a9dd2f6f9f318d04e511c",
+   "8a114868522547b2080271312b1950d57d5da3d9",
    "support"
   ],
   "orientation-event/idlharness.html": [
@@ -254980,7 +255207,7 @@
    "support"
   ],
   "page-visibility/idlharness-expected.txt": [
-   "b029990e4d570e3b511c3837007dae7797cc484e",
+   "f068bcd6833212e8d040fc3af6f38594e43a0fd0",
    "support"
   ],
   "page-visibility/idlharness.html": [
@@ -255156,11 +255383,11 @@
    "testharness"
   ],
   "payment-request/interfaces.https-expected.txt": [
-   "383ad10aa73720a986fff191e6e639de5fa03b6b",
+   "3b7338291e1f3b8bb040ac7706c220b26ec0277e",
    "support"
   ],
   "payment-request/interfaces.https.html": [
-   "8a171d3a4fb4a384b56caa8648f04451a65007fe",
+   "e531c0ceda2fa798e5e6df3c7131e6b80f342884",
    "testharness"
   ],
   "payment-request/payment-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html": [
@@ -255308,7 +255535,7 @@
    "testharness"
   ],
   "performance-timeline/idlharness-expected.txt": [
-   "f4d224a610cb977b6d28c0c9941f14e84b2e55c1",
+   "9143dd9c7542a602bc42e62da34577b97f99d4c5",
    "support"
   ],
   "performance-timeline/idlharness.html": [
@@ -255700,7 +255927,7 @@
    "testharness"
   ],
   "pointerlock/idlharness-expected.txt": [
-   "2ab8d7035e48deac2307e4fd3ea8846ef4837d8d",
+   "3c5ec9228841fd321af3f928116b66a1ebcb54f1",
    "support"
   ],
   "pointerlock/idlharness.html": [
@@ -263688,7 +263915,7 @@
    "support"
   ],
   "resource-timing/idlharness-expected.txt": [
-   "3a98bbc74b9ab03914d1f1bd5ee1c6acf55cfa6c",
+   "87d2343b126a54f9400a0815e2056c1477ce1b1b",
    "support"
   ],
   "resource-timing/idlharness.html": [
@@ -264300,7 +264527,7 @@
    "support"
   ],
   "server-timing/test_server_timing.html": [
-   "3f582e55c8d96a4fb1589ad9bd6e7ca26b75b7a2",
+   "bd80353850b822d6ee4a6b32ffae0e6e2120c61f",
    "testharness"
   ],
   "server-timing/test_server_timing.html.sub.headers": [
@@ -264976,7 +265203,7 @@
    "testharness"
   ],
   "service-workers/service-worker/interfaces-sw.https-expected.txt": [
-   "752f015a291ab6b0d0353005e6289dcb3fdcd52b",
+   "e67da250e73a7372d6bb00ec94ccb064d1781032",
    "support"
   ],
   "service-workers/service-worker/interfaces-sw.https.html": [
@@ -264984,7 +265211,7 @@
    "testharness"
   ],
   "service-workers/service-worker/interfaces-window.https-expected.txt": [
-   "7325bc8cf772cce2960c40096ee5acfc81ecf04e",
+   "5db8d214dc2b46707cedd5ef5082a8e557c8ea69",
    "support"
   ],
   "service-workers/service-worker/interfaces-window.https.html": [
@@ -267924,7 +268151,7 @@
    "testharness"
   ],
   "svg/interfaces-expected.txt": [
-   "b7a7340cd44da47b750faf350a0cd7e5c1b99c70",
+   "a17e04d6f78002714fc2682972624dc9a3f74b27",
    "support"
   ],
   "svg/interfaces.html": [
@@ -268500,7 +268727,7 @@
    "support"
   ],
   "url/interfaces.any-expected.txt": [
-   "d96f2ae8cf99df1be22793542a8c5d184843e172",
+   "91b54f60c8f56dbf3e256385b483b3d563f7153f",
    "support"
   ],
   "url/interfaces.any.js": [
@@ -268508,7 +268735,7 @@
    "testharness"
   ],
   "url/interfaces.any.worker-expected.txt": [
-   "d96f2ae8cf99df1be22793542a8c5d184843e172",
+   "91b54f60c8f56dbf3e256385b483b3d563f7153f",
    "support"
   ],
   "url/setters_tests.json": [
@@ -268847,6 +269074,10 @@
    "652193b876206d7a0f361f145469a604d03e3784",
    "support"
   ],
+  "wasm/create_multiple_memory.worker.js": [
+   "893d408fc56d030416a3c89ae3680dc028ecf1d7",
+   "testharness"
+  ],
   "wasm/incrementer.wasm": [
    "acdf9d22c042ea3b2637c14b1576b4c8ffb4e97a",
    "support"
@@ -269012,7 +269243,7 @@
    "testharness"
   ],
   "web-animations/interfaces/Animation/idlharness-expected.txt": [
-   "98bfa3e93e802537514d3791809cfec523149b73",
+   "112b0ebc2d142e9f5480eac54e872b2cefe9b711",
    "support"
   ],
   "web-animations/interfaces/Animation/idlharness.html": [
@@ -270388,7 +270619,7 @@
    "testharness"
   ],
   "webrtc/RTCPeerConnection-idl-expected.txt": [
-   "b0a742082027191a583c2982b3245cb18fa3aaad",
+   "97adb536e084d11fe49f9c0f48d5a5bc7bea4780",
    "support"
   ],
   "webrtc/RTCPeerConnection-idl.html": [
@@ -270668,7 +270899,7 @@
    "testharness"
   ],
   "webrtc/datachannel-idlharness-expected.txt": [
-   "de46e2abe3f943b563dad21be3840eff49284d39",
+   "70161bca80811ddfbc6349f1b04cb2ad8b4e0f35",
    "support"
   ],
   "webrtc/datachannel-idlharness.html": [
@@ -270700,7 +270931,7 @@
    "support"
   ],
   "webrtc/interfaces-expected.txt": [
-   "24a06be7ff2b7bcbf6bd857dc91f39ec5869206d",
+   "f2a0a84bec7eae80cc8fe85df244bffdd6d9beb7",
    "support"
   ],
   "webrtc/interfaces.html": [
@@ -271796,7 +272027,7 @@
    "support"
   ],
   "webstorage/idlharness-expected.txt": [
-   "72df62ee24b21ba10b13e605a4374af3c554c59c",
+   "5f6de914348f8340db088f5c8877e92902227f7f",
    "support"
   ],
   "webstorage/idlharness.html": [
@@ -271956,7 +272187,7 @@
    "support"
   ],
   "webusb/idlharness.https.html": [
-   "0da5e66dd0b0e82d25082733465c22c54a96d1de",
+   "135ae431cdac90d34b85fe1ea355abaf9a9fb732",
    "testharness"
   ],
   "webusb/resources/fake-devices.js": [
@@ -272188,7 +272419,7 @@
    "support"
   ],
   "webvtt/api/interfaces-expected.txt": [
-   "ddc368a5243a892afd8d14fc2cdb2c7f8a7db3c6",
+   "0293abe70348da9529ff369121f3e10064bbd88d",
    "support"
   ],
   "webvtt/api/interfaces.html": [
@@ -275076,7 +275307,7 @@
    "testharness"
   ],
   "workers/Worker_dispatchEvent_ErrorEvent.htm": [
-   "a1100df5a79ed7b484a8d5c5746bd646a165242b",
+   "a27efcba6fcdbb34bb07ac8553a6bbfa04761008",
    "testharness"
   ],
   "workers/Worker_script_mimetype.htm": [
@@ -275348,11 +275579,11 @@
    "testharness"
   ],
   "workers/data-url.html": [
-   "50abaf936cfb58ba14e6870c9b7f239f5d54f59c",
+   "8f854b63f97beae3d814478946ad86836a5cea0a",
    "testharness"
   ],
   "workers/interfaces.worker-expected.txt": [
-   "7b4b27c0bcfab473617d161f21242e06c7a689f6",
+   "4ae85cb913879ed9b1605223bc476aa763d4450a",
    "support"
   ],
   "workers/interfaces.worker.js": [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/.travis.yml b/third_party/WebKit/LayoutTests/external/wpt/.travis.yml
index 27448221..f4469e0 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/.travis.yml
+++ b/third_party/WebKit/LayoutTests/external/wpt/.travis.yml
@@ -83,11 +83,8 @@
     - env: JOB=build_css SCRIPT=css/build-css-testsuites.sh
     - env:
         - secure: "YTSXPwI0DyCA1GhYrLT9KMEV6b7QQKuEeaQgeFDP38OTzJ1+cIj3CC4SRNqbnJ/6SJwPGcdqSxLuV8m4e5HFFnyCcQnJe6h8EMsTehZ7W3j/fP9UYrJqYqvGpe3Vj3xblO5pwBYmq7sg3jAmmuCgAgOW6VGf7cRMucrsmFeo7VM="
-        - JOB=stability SCRIPT=tools/ci/ci_stability.sh PRODUCT=chrome:unstable
-    - env:
-        - secure: "YTSXPwI0DyCA1GhYrLT9KMEV6b7QQKuEeaQgeFDP38OTzJ1+cIj3CC4SRNqbnJ/6SJwPGcdqSxLuV8m4e5HFFnyCcQnJe6h8EMsTehZ7W3j/fP9UYrJqYqvGpe3Vj3xblO5pwBYmq7sg3jAmmuCgAgOW6VGf7cRMucrsmFeo7VM="
         - JOB=stability SCRIPT=tools/ci/ci_stability.sh PRODUCT=sauce:MicrosoftEdge:14.14393 PLATFORM='Windows 10'
-      env:
+    - env:
         - secure: "YTSXPwI0DyCA1GhYrLT9KMEV6b7QQKuEeaQgeFDP38OTzJ1+cIj3CC4SRNqbnJ/6SJwPGcdqSxLuV8m4e5HFFnyCcQnJe6h8EMsTehZ7W3j/fP9UYrJqYqvGpe3Vj3xblO5pwBYmq7sg3jAmmuCgAgOW6VGf7cRMucrsmFeo7VM="
         - JOB=stability SCRIPT=tools/ci/ci_stability.sh PRODUCT=sauce:safari:10.0 PLATFORM='macOS 10.12'
 script:
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/2x2-srgb.png b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/2x2-srgb.png
new file mode 100644
index 0000000..9be3156
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/2x2-srgb.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10_srgb.html
new file mode 100644
index 0000000..0b2a2f698
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10_srgb.html
@@ -0,0 +1,49 @@
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<canvas id="dest" height="100" width="100"></canvas>
+
+<script>
+var sourceWidth = 128;
+var sourceHeight = 128;
+var smoothingEnabled = false;
+var destCanvas = document.getElementById('dest');
+var sourceImg = document.createElement('img');
+sourceImg.src = '../2x2-srgb.png'
+sourceImg.width = sourceWidth;
+sourceImg.height = sourceHeight;
+var destCtx = destCanvas.getContext('2d');
+
+function checkPixel(x, y, expected, epsilon) {
+    var actual = destCtx.getImageData(x, y, 1, 1).data;
+    assert_true(actual.length === expected.length);
+    for (var i=0; i < actual.length; i++)
+        assert_approx_equals(actual[i], expected[i], epsilon);
+}
+
+var pixelTests = [
+    ['Pixel Top Left Image', 0, 0, [253, 140, 245, 255], 1],
+    ['Pixel Top Right Image', 0, 99, [253, 140, 245, 255], 1],
+    ['Pixel Bottom Left Image', 99, 0, [253, 140, 245, 255], 1],
+    ['Pixel Bottom Right Image', 99, 99, [253, 140, 245, 255], 1],
+];
+
+function runTest() {
+    destCtx.fillStyle = "#FF0000";
+    destCtx.fillRect(0, 0,  destCanvas.width, destCanvas.height);
+    destCtx.imageSmoothingEnabled = smoothingEnabled;
+    // The destination rectangle is larger than the destination canvas.
+    // When the destination rectangle is outside the destination image (the scratch bitmap),
+    // the pixels that land outside the scratch bitmap are discarded,
+    // as if the destination was an infinite canvas
+    // whose rendering was clipped to the dimensions of the scratch bitmap.
+    destCtx.drawImage(sourceImg, 0, 0, 512, 512, 0, 0, 256, 256);
+    generate_tests(checkPixel, pixelTests);
+}
+
+async_test(t => {
+        window.onload = function() {
+            t.step(runTest);
+            t.done();
+        }
+}, 'Draw a 100x100 image to a 100x100 canvas with resize and clipping.');
+</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1_srgb.html
new file mode 100644
index 0000000..e2e5a63
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1_srgb.html
@@ -0,0 +1,46 @@
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<canvas id="dest" height="100" width="100"></canvas>
+
+<script>
+var sourceWidth = 100;
+var sourceHeight = 100;
+var smoothingEnabled = false;
+var destCanvas = document.getElementById('dest');
+var sourceImg = document.createElement('img');
+sourceImg.src = '../2x2-srgb.png'
+sourceImg.width = sourceWidth;
+sourceImg.height = sourceHeight;
+var destCtx = destCanvas.getContext('2d');
+
+function checkPixel(x, y, expected, epsilon) {
+    var actual = destCtx.getImageData(x, y, 1, 1).data;
+    assert_true(actual.length === expected.length);
+    for (var i=0; i < actual.length; i++)
+        assert_approx_equals(actual[i], expected[i], epsilon);
+}
+
+var pixelTests = [
+    ['Pixel Top Left Image', 0, 0, [253, 140, 245, 255], 1],
+    ['Pixel Top Right Image', 0, 99, [253, 140, 245, 255], 1],
+    ['Pixel Bottom Left Image', 99, 0, [253, 140, 245, 255], 1],
+    ['Pixel Bottom Right Image', 99, 99, [253, 140, 245, 255], 1],
+];
+
+function runTest() {
+    destCtx.fillStyle = "#FF0000";
+    destCtx.fillRect(0, 0,  destCanvas.width, destCanvas.height);
+    destCtx.imageSmoothingEnabled = smoothingEnabled;
+    // 2 arguments, the dest origin is 0,0
+    // The source canvas will copied to the 0,0 position of the destination canvas
+    destCtx.drawImage(sourceImg, 0, 0);
+    generate_tests(checkPixel, pixelTests);
+}
+
+async_test(t => {
+        window.onload = function() {
+            t.step(runTest);
+            t.done();
+        }
+}, 'Draw 100x100 image to 100x100 canvas at 0,0.');
+</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2_srgb.html
new file mode 100644
index 0000000..14c78d1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2_srgb.html
@@ -0,0 +1,53 @@
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<canvas id="dest" height="100" width="100"></canvas>
+
+<script>
+var sourceWidth = 100;
+var sourceHeight = 100;
+var smoothingEnabled = false;
+var destCanvas = document.getElementById('dest');
+var sourceImg = document.createElement('img');
+sourceImg.src = '../2x2-srgb.png'
+sourceImg.width = sourceWidth;
+sourceImg.height = sourceHeight;
+var destCtx = destCanvas.getContext('2d');
+
+function checkPixel(x, y, expected, epsilon) {
+    var actual = destCtx.getImageData(x, y, 1, 1).data;
+    assert_true(actual.length === expected.length);
+    for (var i=0; i < actual.length; i++)
+        assert_approx_equals(actual[i], expected[i], epsilon);
+}
+
+var pixelTests = [
+    ['Pixel Top Left Canvas Background', 0, 0, [255, 0, 0, 255], 1],
+    ['Pixel Middle Middle Canvas Background', 24, 24, [255, 0, 0, 255], 1],
+    ['Pixel Top Middle Canvas Background', 0, 25, [255, 0, 0, 255], 1],
+    ['Pixel Middle Left Canvas Background', 25, 0, [255, 0, 0, 255], 1],
+    ['Pixel Top Right Canvas Background', 0, 99, [255, 0, 0, 255], 1],
+    ['Pixel Bottom Left Canvas Background', 99, 0, [255, 0, 0, 255], 1],
+
+    ['Pixel Top Left Image', 25, 25, [253, 140, 245, 255], 1],
+    ['Pixel Top Right Image', 25, 99, [253, 140, 245, 255], 1],
+    ['Pixel Bottom Left Image', 99, 25, [253, 140, 245, 255], 1],
+    ['Pixel Bottom Right Image', 99, 99, [253, 140, 245, 255], 1],
+];
+
+function runTest() {
+    destCtx.fillStyle = "#FF0000";
+    destCtx.fillRect(0, 0,  destCanvas.width, destCanvas.height);
+    destCtx.imageSmoothingEnabled = smoothingEnabled;
+    // 2 arguments, the dest origin is not 0,0
+    // The source canvas will copied to the 25,25 position of the destination canvas
+    destCtx.drawImage(sourceImg, 25, 25);
+    generate_tests(checkPixel, pixelTests);
+}
+
+async_test(t => {
+        window.onload = function() {
+            t.step(runTest);
+            t.done();
+        }
+}, 'Draw 100x100 image to 100x100 canvas at 25,25.');
+</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3_srgb.html
new file mode 100644
index 0000000..0e2c378
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3_srgb.html
@@ -0,0 +1,54 @@
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<canvas id="dest" height="100" width="100"></canvas>
+
+<script>
+var sourceWidth = 100;
+var sourceHeight = 100;
+var smoothingEnabled = false;
+var destCanvas = document.getElementById('dest');
+var sourceImg = document.createElement('img');
+sourceImg.src = '../2x2-srgb.png'
+sourceImg.width = sourceWidth;
+sourceImg.height = sourceHeight;
+var destCtx = destCanvas.getContext('2d');
+
+function checkPixel(x, y, expected, epsilon) {
+    var actual = destCtx.getImageData(x, y, 1, 1).data;
+    assert_true(actual.length === expected.length);
+    for (var i=0; i < actual.length; i++)
+        assert_approx_equals(actual[i], expected[i], epsilon);
+}
+
+var pixelTests = [
+    ['Pixel Top Left Canvas Background', 0, 0, [255, 0, 0, 255], 1],
+    ['Pixel Middle Middle Canvas Background', 49, 49, [255, 0, 0, 255], 1],
+    ['Pixel Top Middle Canvas Background', 0, 50, [255, 0, 0, 255], 1],
+    ['Pixel Middle Left Canvas Background', 50, 0, [255, 0, 0, 255], 1],
+    ['Pixel Top Right Canvas Background', 0, 99, [255, 0, 0, 255], 1],
+    ['Pixel Bottom Left Canvas Background', 99, 0, [255, 0, 0, 255], 1],
+
+    ['Pixel Top Left Image', 50, 50, [253, 140, 245, 255], 1],
+    ['Pixel Top Right Image', 50, 99, [41, 122, 115, 255], 1],
+    ['Pixel Bottom Left Image', 99, 50, [41, 122, 115, 255], 1],
+    ['Pixel Bottom Right Image', 99, 99, [253, 140, 245, 255], 1],
+];
+
+function runTest() {
+    destCtx.fillStyle = "#FF0000";
+    destCtx.fillRect(0, 0,  destCanvas.width, destCanvas.height);
+    destCtx.imageSmoothingEnabled = smoothingEnabled;
+    // 4 arguments, the source origin is not 0,0, the dest size is provided
+    // The source canvas will copied to the 50, 50 position of the destination canvas and
+    // on an area of 50x50 pixels
+    destCtx.drawImage(sourceImg, 50, 50, 50, 50);
+    generate_tests(checkPixel, pixelTests);
+}
+
+async_test(t => {
+        window.onload = function() {
+            t.step(runTest);
+            t.done();
+        }
+}, 'Draw 100x100 image to 100x100 canvas at 50,50 with resize to 50x50.');
+</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4_srgb.html
new file mode 100644
index 0000000..97b671f9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4_srgb.html
@@ -0,0 +1,58 @@
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<canvas id="dest" height="100" width="100"></canvas>
+
+<script>
+var sourceWidth = 100;
+var sourceHeight = 100;
+var smoothingEnabled = false;
+var destCanvas = document.getElementById('dest');
+var sourceImg = document.createElement('img');
+sourceImg.src = '../2x2-srgb.png'
+sourceImg.width = sourceWidth;
+sourceImg.height = sourceHeight;
+var destCtx = destCanvas.getContext('2d');
+
+function checkPixel(x, y, expected, epsilon) {
+    var actual = destCtx.getImageData(x, y, 1, 1).data;
+    assert_true(actual.length === expected.length);
+    for (var i=0; i < actual.length; i++)
+        assert_approx_equals(actual[i], expected[i], epsilon);
+}
+
+var pixelTests = [
+    ['Pixel Top Left Canvas Background', 0, 0, [255, 0, 0, 255], 1],
+    ['Pixel Top Right Canvas Background', 0, 99, [255, 0, 0, 255], 1],
+    ['Pixel Bottom Left Canvas Background', 99, 0, [255, 0, 0, 255], 1],
+    ['Pixel Bottom Right Canvas Background', 99, 99, [255, 0, 0, 255], 1],
+
+    ['Pixel Surrounding Top Left Canvas Background', 49, 49, [255, 0, 0, 255], 1],
+    ['Pixel Surrounding Top Right Canvas Background', 49, 66, [255, 0, 0, 255], 1],
+    ['Pixel Surrounding Bottom Left Canvas Background', 66, 49, [255, 0, 0, 255], 1],
+    ['Pixel Surrounding Bottom Right Canvas Background', 66, 66, [255, 0, 0, 255], 1],
+
+    ['Pixel Top Left Image', 50, 50, [253, 140, 245, 255], 1],
+    ['Pixel Top Right Image', 50, 65, [41, 122, 115, 255], 1],
+    ['Pixel Bottom Left Image', 65, 50, [41, 122, 115, 255], 1],
+    ['Pixel Bottom Right Image', 65, 65, [253, 140, 245, 255], 1],
+];
+
+function runTest() {
+    destCtx.fillStyle = "#FF0000";
+    destCtx.fillRect(0, 0,  destCanvas.width, destCanvas.height);
+    destCtx.imageSmoothingEnabled = smoothingEnabled;
+    // 4 arguments, the dest origin is not 0,0 and the dest size is provided but
+    // does not match the size of the source. The image will be distorted
+    // The source canvas will copied to the 50,50 position of the destination canvas
+    // and it will be shrunk to a and area of 16x16
+    destCtx.drawImage(sourceImg, 50, 50, 16, 16);
+    generate_tests(checkPixel, pixelTests);
+}
+
+async_test(t => {
+        window.onload = function() {
+            t.step(runTest);
+            t.done();
+        }
+}, 'Draw 100x100 image to 100x100 canvas at 50,50 with resize to 16x16.');
+</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5_srgb.html
new file mode 100644
index 0000000..3f3242b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5_srgb.html
@@ -0,0 +1,57 @@
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<canvas id="dest" height="100" width="100"></canvas>
+
+<script>
+var sourceWidth = 100;
+var sourceHeight = 100;
+var smoothingEnabled = false;
+var destCanvas = document.getElementById('dest');
+var sourceImg = document.createElement('img');
+sourceImg.src = '../2x2-srgb.png'
+sourceImg.width = sourceWidth;
+sourceImg.height = sourceHeight;
+var destCtx = destCanvas.getContext('2d');
+
+function checkPixel(x, y, expected, epsilon) {
+    var actual = destCtx.getImageData(x, y, 1, 1).data;
+    assert_true(actual.length === expected.length);
+    for (var i=0; i < actual.length; i++)
+        assert_approx_equals(actual[i], expected[i], epsilon);
+}
+
+var pixelTests = [
+    ['Pixel Top Left Canvas Background', 0, 0, [255, 0, 0, 255], 1],
+    ['Pixel Top Right Canvas Background', 0, 99, [255, 0, 0, 255], 1],
+    ['Pixel Bottom Left Canvas Background', 99, 0, [255, 0, 0, 255], 1],
+    ['Pixel Bottom Right Canvas Background', 99, 99, [255, 0, 0, 255], 1],
+
+    ['Pixel Surrounding Top Left Canvas Background', 49, 49, [255, 0, 0, 255], 1],
+    ['Pixel Surrounding Top Right Canvas Background', 49, 82, [255, 0, 0, 255], 1],
+    ['Pixel Surrounding Bottom Left Canvas Background', 99, 49, [255, 0, 0, 255], 1],
+    ['Pixel Surrounding Bottom Right Canvas Background', 99, 82, [255, 0, 0, 255], 1],
+
+    ['Pixel Top Left Image', 50, 50, [253, 140, 245, 255], 1],
+    ['Pixel Top Right Image', 50, 81, [41, 122, 115, 255], 1],
+    ['Pixel Bottom Left Image', 99, 50, [41, 122, 115, 255], 1],
+    ['Pixel Bottom Right Image', 99, 81, [253, 140, 245, 255], 1],
+];
+
+function runTest() {
+    destCtx.fillStyle = "#FF0000";
+    destCtx.fillRect(0, 0,  destCanvas.width, destCanvas.height);
+    destCtx.imageSmoothingEnabled = smoothingEnabled;
+    // The source canvas will copied to the 50,50 position of the destination canvas
+    // over an area of 64x32 pixels
+    // The copied image will be distorted along the x axis
+    destCtx.drawImage(sourceImg, 50, 50, 64, 32);
+    generate_tests(checkPixel, pixelTests);
+}
+
+async_test(t => {
+        window.onload = function() {
+            t.step(runTest);
+            t.done();
+        }
+}, 'Draw 100x100 image to 100x100 canvas at 50,50 with resize to 64x32.');
+</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6_srgb.html
new file mode 100644
index 0000000..79f9200
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6_srgb.html
@@ -0,0 +1,55 @@
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<canvas id="dest" height="100" width="100"></canvas>
+
+<script>
+var sourceWidth = 100;
+var sourceHeight = 100;
+var smoothingEnabled = false;
+var destCanvas = document.getElementById('dest');
+var sourceImg = document.createElement('img');
+sourceImg.src = '../2x2-srgb.png'
+sourceImg.width = sourceWidth;
+sourceImg.height = sourceHeight;
+var destCtx = destCanvas.getContext('2d');
+
+function checkPixel(x, y, expected, epsilon) {
+    var actual = destCtx.getImageData(x, y, 1, 1).data;
+    assert_true(actual.length === expected.length);
+    for (var i=0; i < actual.length; i++)
+        assert_approx_equals(actual[i], expected[i], epsilon);
+}
+
+var pixelTests = [
+    ['Pixel Top Right Canvas Background', 0, 99, [255, 0, 0, 255], 1],
+    ['Pixel Bottom Left Canvas Background', 99, 0, [255, 0, 0, 255], 1],
+    ['Pixel Bottom Right Canvas Background', 99, 99, [255, 0, 0, 255], 1],
+
+    ['Pixel Surrounding Top Left Canvas Background', 0, 32, [255, 0, 0, 255], 1],
+    ['Pixel Surrounding Bottom Left Canvas Background', 32, 0, [255, 0, 0, 255], 1],
+    ['Pixel Surrounding Orthogonal Canvas Background', 32, 32, [255, 0, 0, 255], 1],
+
+    ['Pixel Top Left Image', 0, 0, [253, 140, 245, 255], 1],
+    ['Pixel Top Right Image', 0, 31, [253, 140, 245, 255], 1],
+    ['Pixel Bottom Left Image', 31, 0, [253, 140, 245, 255], 1],
+    ['Pixel Bottom Right Image', 31, 31, [253, 140, 245, 255], 1],
+];
+
+function runTest() {
+    destCtx.fillStyle = "#FF0000";
+    destCtx.fillRect(0, 0,  destCanvas.width, destCanvas.height);
+    destCtx.imageSmoothingEnabled = smoothingEnabled;
+    // 8 arguments, both destination and source origins are 0, 0
+    // An area of 32x32 pixels of the source image will be copied to
+    // an area of 32x32 pixels of the destination canvas
+    destCtx.drawImage(sourceImg, 0, 0, 32, 32, 0, 0, 32, 32);
+    generate_tests(checkPixel, pixelTests);
+}
+
+async_test(t => {
+        window.onload = function() {
+            t.step(runTest);
+            t.done();
+        }
+}, 'Draw a 32x32 area of a 100x100 image to a 32x32 area of a 100x100 canvas at 0,0.');
+</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7_srgb.html
new file mode 100644
index 0000000..2214c20
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7_srgb.html
@@ -0,0 +1,57 @@
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<canvas id="dest" height="100" width="100"></canvas>
+
+<script>
+var sourceWidth = 100;
+var sourceHeight = 100;
+var smoothingEnabled = false;
+var destCanvas = document.getElementById('dest');
+var sourceImg = document.createElement('img');
+sourceImg.src = '../2x2-srgb.png'
+sourceImg.width = sourceWidth;
+sourceImg.height = sourceHeight;
+var destCtx = destCanvas.getContext('2d');
+
+function checkPixel(x, y, expected, epsilon) {
+    var actual = destCtx.getImageData(x, y, 1, 1).data;
+    assert_true(actual.length === expected.length);
+    for (var i=0; i < actual.length; i++)
+        assert_approx_equals(actual[i], expected[i], epsilon);
+}
+
+var pixelTests = [
+    ['Pixel Top Left Canvas Background', 0, 0, [255, 0, 0, 255], 1],
+    ['Pixel Top Right Canvas Background', 0, 99, [255, 0, 0, 255], 1],
+    ['Pixel Bottom Left Canvas Background', 99, 0, [255, 0, 0, 255], 1],
+    ['Pixel Bottom Right Canvas Background', 99, 99, [255, 0, 0, 255], 1],
+
+    ['Pixel Surrounding Top Left Canvas Background', 31, 31, [255, 0, 0, 255], 1],
+    ['Pixel Surrounding Top Right Canvas Background', 31, 64, [255, 0, 0, 255], 1],
+    ['Pixel Surrounding Bottom Left Canvas Background', 64, 31, [255, 0, 0, 255], 1],
+    ['Pixel Surrounding Bottom Right Canvas Background', 64, 64, [255, 0, 0, 255], 1],
+
+    ['Pixel Top Left Image', 32, 32, [253, 140, 245, 255], 1],
+    ['Pixel Top Right Image', 32, 63, [253, 140, 245, 255], 1],
+    ['Pixel Bottom Left Image', 63, 32, [253, 140, 245, 255], 1],
+    ['Pixel Bottom Right Image', 63, 63, [253, 140, 245, 255], 1],
+];
+
+function runTest() {
+    destCtx.fillStyle = "#FF0000";
+    destCtx.fillRect(0, 0,  destCanvas.width, destCanvas.height);
+    destCtx.imageSmoothingEnabled = smoothingEnabled;
+    // 8 arguments the destination origin is not 0,0
+    // An area of 32x32 pixels of the source image will be copied to
+    // an area of 32x32 pixels of the destination canvas in the position 32,32
+    destCtx.drawImage(sourceImg, 0, 0, 32, 32, 32, 32, 32, 32);
+    generate_tests(checkPixel, pixelTests);
+}
+
+async_test(t => {
+        window.onload = function() {
+            t.step(runTest);
+            t.done();
+        }
+}, 'Draw a 32x32 area of a 100x100 image to a 32x32 area of a 100x100 canvas at 32,32.');
+</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8_srgb.html
new file mode 100644
index 0000000..1197c4297
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8_srgb.html
@@ -0,0 +1,55 @@
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<canvas id="dest" height="100" width="100"></canvas>
+
+<script>
+var sourceWidth = 100;
+var sourceHeight = 100;
+var smoothingEnabled = false;
+var destCanvas = document.getElementById('dest');
+var sourceImg = document.createElement('img');
+sourceImg.src = '../2x2-srgb.png'
+sourceImg.width = sourceWidth;
+sourceImg.height = sourceHeight;
+var destCtx = destCanvas.getContext('2d');
+
+function checkPixel(x, y, expected, epsilon) {
+    var actual = destCtx.getImageData(x, y, 1, 1).data;
+    assert_true(actual.length === expected.length);
+    for (var i=0; i < actual.length; i++)
+        assert_approx_equals(actual[i], expected[i], epsilon);
+}
+
+var pixelTests = [
+    ['Pixel Top Right Canvas Background', 0, 99, [255, 0, 0, 255], 1],
+    ['Pixel Bottom Left Canvas Background', 99, 0, [255, 0, 0, 255], 1],
+    ['Pixel Bottom Right Canvas Background', 99, 99, [255, 0, 0, 255], 1],
+
+    ['Pixel Surrounding Top Left Canvas Background', 0, 32, [255, 0, 0, 255], 1],
+    ['Pixel Surrounding Bottom Left Canvas Background', 32, 0, [255, 0, 0, 255], 1],
+    ['Pixel Surrounding Orthogonal Canvas Background', 32, 32, [255, 0, 0, 255], 1],
+
+    ['Pixel Top Left Image', 0, 0, [253, 140, 245, 255], 1],
+    ['Pixel Top Right Image', 0, 31, [253, 140, 245, 255], 1],
+    ['Pixel Bottom Left Image', 31, 0, [253, 140, 245, 255], 1],
+    ['Pixel Bottom Right Image', 31, 31, [253, 140, 245, 255], 1],
+];
+
+function runTest() {
+    destCtx.fillStyle = "#FF0000";
+    destCtx.fillRect(0, 0,  destCanvas.width, destCanvas.height);
+    destCtx.imageSmoothingEnabled = smoothingEnabled;
+    // The source rectangle overflows the source image
+    // The source area is clipped to fit the source image
+    // and the destination are is clipped in the same proportion
+    destCtx.drawImage(sourceImg, 32, 32, 32, 32, 0, 0, 32, 32);
+    generate_tests(checkPixel, pixelTests);
+}
+
+async_test(t => {
+        window.onload = function() {
+            t.step(runTest);
+            t.done();
+        }
+}, 'Draw a 32x32 area of a 100x100 image to a 32x32 area of a 100x100 canvas at 32,32 with clipping.');
+</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1_srgb.html b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1_srgb.html
new file mode 100644
index 0000000..fbb614d8
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1_srgb.html
@@ -0,0 +1,46 @@
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<canvas id="dest" height="100" width="100"></canvas>
+
+<script>
+var sourceWidth = 100;
+var sourceHeight = 100;
+var smoothingEnabled = false;
+var destCanvas = document.getElementById('dest');
+var sourceImg = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+sourceImg.setAttributeNS('http://www.w3.org/1999/xlink', 'href', '../2x2-srgb.png');
+sourceImg.width = sourceWidth;
+sourceImg.height = sourceHeight;
+var destCtx = destCanvas.getContext('2d');
+
+function checkPixel(x, y, expected, epsilon) {
+    var actual = destCtx.getImageData(x, y, 1, 1).data;
+    assert_true(actual.length === expected.length);
+    for (var i=0; i < actual.length; i++)
+        assert_approx_equals(actual[i], expected[i], epsilon);
+}
+
+var pixelTests = [
+    ['Pixel Top Left Image', 0, 0, [253, 140, 245, 255], 1],
+    ['Pixel Top Right Image', 0, 99, [253, 140, 245, 255], 1],
+    ['Pixel Bottom Left Image', 99, 0, [253, 140, 245, 255], 1],
+    ['Pixel Bottom Right Image', 99, 99, [253, 140, 245, 255], 1],
+];
+
+function runTest() {
+    destCtx.fillStyle = "#FF0000";
+    destCtx.fillRect(0, 0,  destCanvas.width, destCanvas.height);
+    destCtx.imageSmoothingEnabled = smoothingEnabled;
+    // 2 arguments, the dest origin is 0,0
+    // The source canvas will copied to the 0,0 position of the destination canvas
+    destCtx.drawImage(sourceImg, 0, 0);
+    generate_tests(checkPixel, pixelTests);
+}
+
+async_test(t => {
+        window.onload = function() {
+            t.step(runTest);
+            t.done();
+        }
+}, 'Load a 100x100 image to a SVG image and draw it to a 100x100 canvas.');
+</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/current-realm.html b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/current-realm.html
index fd24709b..e015ec5 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/WebIDL/current-realm.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/WebIDL/current-realm.html
@@ -110,8 +110,13 @@
      test(function() {
        var c = self[0].document.createElement("canvas"),
            obj = c.getContext(val)
-       assert_global(obj)
 
+       // WebGL might not be enabled in this environment
+       if (!obj && val === "webgl") {
+         return;
+       }
+
+       assert_global(obj)
        obj = HTMLCanvasElement.prototype.getContext.call(c, val)
        assert_global(obj)
      }, "getContext " + val)
diff --git a/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/access-control-and-redirects.htm b/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/access-control-and-redirects.htm
index 10c5e2f5..dcdf4004 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/access-control-and-redirects.htm
+++ b/third_party/WebKit/LayoutTests/external/wpt/XMLHttpRequest/access-control-and-redirects.htm
@@ -16,7 +16,6 @@
       assert_equals(xhr.responseText, "PASS: Cross-domain access allowed.");
       test.done();
     }
-
     function runAsync(test, url)
     {
       const xhr = new XMLHttpRequest();
@@ -28,7 +27,6 @@
       xhr.send();
       test.done();
     }
-
     test(t => {
       runSync(t, "resources/redirect-cors.py?location=" + get_host_info().HTTP_REMOTE_ORIGIN +
           "/XMLHttpRequest/resources/access-control-basic-allow.py")
@@ -37,7 +35,6 @@
       runAsync(t, "resources/redirect-cors.py?location=" + get_host_info().HTTP_REMOTE_ORIGIN +
           "/XMLHttpRequest/resources/access-control-basic-allow.py")
     }, "Local async redirect to remote origin");
-
     test(t => {
       runSync(t, get_host_info().HTTP_REMOTE_ORIGIN +
           "/XMLHttpRequest/resources/redirect-cors.py?location=" + get_host_info().HTTP_ORIGIN +
@@ -48,7 +45,6 @@
           "/XMLHttpRequest/resources/redirect-cors.py?location=" + get_host_info().HTTP_ORIGIN +
           "/XMLHttpRequest/resources/access-control-basic-allow.py&allow_origin=true")
     }, "Remote async redirect to local origin");
-
     test(t => {
       runSync(t, get_host_info().HTTP_REMOTE_ORIGIN +
           "/XMLHttpRequest/resources/redirect-cors.py?location=" + get_host_info().HTTP_REMOTE_ORIGIN +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-expected.txt
index 74040ad..681ed9db 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-expected.txt
@@ -7,7 +7,7 @@
 PASS BackgroundFetchManager interface object name 
 PASS BackgroundFetchManager interface: existence and properties of interface prototype object 
 PASS BackgroundFetchManager interface: existence and properties of interface prototype object's "constructor" property 
-PASS BackgroundFetchManager interface: operation fetch(DOMString,[object Object],[object Object],BackgroundFetchOptions) 
+PASS BackgroundFetchManager interface: operation fetch(DOMString, [object Object],[object Object], BackgroundFetchOptions) 
 PASS BackgroundFetchManager interface: operation get(DOMString) 
 PASS BackgroundFetchManager interface: operation getIds() 
 PASS BackgroundFetchRegistration interface: existence and properties of interface object 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-worker.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-worker.https-expected.txt
index ca4bf05..ad9c0a0 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-worker.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-worker.https-expected.txt
@@ -11,7 +11,7 @@
 PASS BackgroundFetchManager interface object name 
 PASS BackgroundFetchManager interface: existence and properties of interface prototype object 
 PASS BackgroundFetchManager interface: existence and properties of interface prototype object's "constructor" property 
-PASS BackgroundFetchManager interface: operation fetch(DOMString,[object Object],[object Object],BackgroundFetchOptions) 
+PASS BackgroundFetchManager interface: operation fetch(DOMString, [object Object],[object Object], BackgroundFetchOptions) 
 PASS BackgroundFetchManager interface: operation get(DOMString) 
 PASS BackgroundFetchManager interface: operation getIds() 
 PASS BackgroundFetchRegistration interface: existence and properties of interface object 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.worker-expected.txt
index 6434ce8..01308ef 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.worker-expected.txt
@@ -8,7 +8,7 @@
 PASS BackgroundFetchManager interface object name 
 PASS BackgroundFetchManager interface: existence and properties of interface prototype object 
 PASS BackgroundFetchManager interface: existence and properties of interface prototype object's "constructor" property 
-PASS BackgroundFetchManager interface: operation fetch(DOMString,[object Object],[object Object],BackgroundFetchOptions) 
+PASS BackgroundFetchManager interface: operation fetch(DOMString, [object Object],[object Object], BackgroundFetchOptions) 
 PASS BackgroundFetchManager interface: operation get(DOMString) 
 PASS BackgroundFetchManager interface: operation getIds() 
 PASS BackgroundFetchRegistration interface: existence and properties of interface object 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/compat/green-ref.html b/third_party/WebKit/LayoutTests/external/wpt/compat/green-ref.html
new file mode 100644
index 0000000..2671ff6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/compat/green-ref.html
@@ -0,0 +1,6 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>A green 100x100 block</title>
+<link rel="author" title="Xidorn Quan" href="me@upsuper.ort">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<div style="width: 100px; height: 100px; background: green;"></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-bottom.html b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-bottom.html
new file mode 100644
index 0000000..21e1c894
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-bottom.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<title>-webkit-linear-gradient(bottom)</title>
+<link rel="author" title="Xidorn Quan" href="me@upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://compat.spec.whatwg.org/#css-gradients-webkit-linear-gradient">
+<meta name="assert" content="'bottom' in -webkit-linear-gradient is equivalent to 'to top' in modern syntax">
+<link rel="match" href="green-ref.html">
+<style>
+  #outer {
+    width: 100px;
+    height: 100px;
+    overflow: hidden;
+  }
+  #inner {
+    width: 100px;
+    height: 200px;
+    background-image: -webkit-linear-gradient(bottom, red 50%, green 50%);
+  }
+</style>
+<div id="outer">
+  <div id="inner"></div>
+</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-left.html b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-left.html
new file mode 100644
index 0000000..b0e13c1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-left.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<title>-webkit-linear-gradient(left)</title>
+<link rel="author" title="Xidorn Quan" href="me@upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://compat.spec.whatwg.org/#css-gradients-webkit-linear-gradient">
+<meta name="assert" content="'left' in -webkit-linear-gradient is equivalent to 'to right' in modern syntax">
+<link rel="match" href="green-ref.html">
+<style>
+  #outer {
+    width: 100px;
+    height: 100px;
+    overflow: hidden;
+  }
+  #inner {
+    width: 200px;
+    height: 100px;
+    background-image: -webkit-linear-gradient(left, green 50%, red 50%);
+  }
+</style>
+<div id="outer">
+  <div id="inner"></div>
+</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-right.html b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-right.html
new file mode 100644
index 0000000..0f1a4b9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-right.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<title>-webkit-linear-gradient(right)</title>
+<link rel="author" title="Xidorn Quan" href="me@upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://compat.spec.whatwg.org/#css-gradients-webkit-linear-gradient">
+<meta name="assert" content="'right' in -webkit-linear-gradient is equivalent to 'to left' in modern syntax">
+<link rel="match" href="green-ref.html">
+<style>
+  #outer {
+    width: 100px;
+    height: 100px;
+    overflow: hidden;
+  }
+  #inner {
+    width: 200px;
+    height: 100px;
+    background-image: -webkit-linear-gradient(right, red 50%, green 50%);
+  }
+</style>
+<div id="outer">
+  <div id="inner"></div>
+</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-top.html b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-top.html
new file mode 100644
index 0000000..579d882
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/compat/webkit-linear-gradient-line-top.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<title>-webkit-linear-gradient(top)</title>
+<link rel="author" title="Xidorn Quan" href="me@upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://compat.spec.whatwg.org/#css-gradients-webkit-linear-gradient">
+<meta name="assert" content="'top' in -webkit-linear-gradient is equivalent to 'to bottom' in modern syntax">
+<link rel="match" href="green-ref.html">
+<style>
+  #outer {
+    width: 100px;
+    height: 100px;
+    overflow: hidden;
+  }
+  #inner {
+    width: 100px;
+    height: 200px;
+    background-image: -webkit-linear-gradient(top, green 50%, red 50%);
+  }
+</style>
+<div id="outer">
+  <div id="inner"></div>
+</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt
index ccc4c579..57e9e4c 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/securitypolicyviolation/idl-expected.txt
@@ -17,16 +17,16 @@
 PASS SecurityPolicyViolationEvent interface: attribute columnNumber 
 PASS SecurityPolicyViolationEvent must be primary interface of new SecurityPolicyViolationEvent({}) 
 FAIL Stringification of new SecurityPolicyViolationEvent({}) Cannot read property 'has_stringifier' of undefined
-PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "documentURI" with the proper type (0) 
-PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "referrer" with the proper type (1) 
-PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "blockedURI" with the proper type (2) 
-PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "violatedDirective" with the proper type (3) 
-PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "effectiveDirective" with the proper type (4) 
-PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "originalPolicy" with the proper type (5) 
-PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "sourceFile" with the proper type (6) 
-PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "disposition" with the proper type (7) 
-PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "statusCode" with the proper type (8) 
-PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "lineNumber" with the proper type (9) 
-PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "columnNumber" with the proper type (10) 
+PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "documentURI" with the proper type 
+PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "referrer" with the proper type 
+PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "blockedURI" with the proper type 
+PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "violatedDirective" with the proper type 
+PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "effectiveDirective" with the proper type 
+PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "originalPolicy" with the proper type 
+PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "sourceFile" with the proper type 
+PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "disposition" with the proper type 
+PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "statusCode" with the proper type 
+PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "lineNumber" with the proper type 
+PASS SecurityPolicyViolationEvent interface: new SecurityPolicyViolationEvent({}) must inherit property "columnNumber" with the proper type 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css-fonts/variations/font-parse-numeric-stretch-style-weight.html b/third_party/WebKit/LayoutTests/external/wpt/css-fonts/variations/font-parse-numeric-stretch-style-weight.html
index 53cef20..5152424 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css-fonts/variations/font-parse-numeric-stretch-style-weight.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css-fonts/variations/font-parse-numeric-stretch-style-weight.html
@@ -21,12 +21,15 @@
     'calc(100 + 300)',
     'calc(0.2 + 205.5)',
   ],
-  'stretch': ['51%', '199%', 'calc(10% + 20%)']
+  'stretch': ['51%', '199%', 'calc(10% + 20%)'],
+  'style' : [ 'normal', 'italic', 'oblique', 'oblique 50deg', 'oblique -90deg', 'oblique 90deg',
+              'oblique calc(30deg + 20deg)' ]
 };
 
 var styleInvalidTests = {
   'weight': ['100 400', 'calc(0 - 100)', 'calc(200 + 801)'],
-  'stretch': ['100% 110%', '0%', '100% 150%', 'calc(1 + 10%)']
+  'stretch': ['100% 110%', '0%', '100% 150%', 'calc(1 + 10%)'],
+  'style' : [ 'normal 10deg', 'italic 10deg', 'oblique -91deg', 'oblique 91deg', 'oblique calc(90deg + 20deg)']
 };
 
 function testParseStyle() {
@@ -70,6 +73,13 @@
     ['ultra-condensed', 'ultra-condensed'],
     ['ultra-expanded', 'ultra-expanded'],
   ],
+  'style' : [
+    [ "normal", "normal" ],
+    [ "italic", "italic" ],
+    [ "oblique", "oblique" ],
+    [ "oblique 10deg", "oblique 10deg" ],
+    [ "oblique 10deg 20deg", "oblique 10deg 20deg" ]
+  ]
 };
 
 var faceInvalidTests = {
@@ -87,9 +97,11 @@
     'a b c',
   ],
   'stretch': [
-    '0%', '60% 70% 80%', 'a%', 'a b c', '0.1', '-60% 80%', 'ultra-expannnned',
-    '50% 0'
+    '-0.5%', '-1%', '0%', 'calc(0% - 10%)', '60% 70% 80%', 'a%', 'a b c', '0.1',
+    '-60% 80%', 'ultra-expannnned', '50% 0'
   ],
+  'style' : [ 'oblique 100deg', 'oblique italic', 'oblique -91deg', 'oblique 0',
+              'oblique 10', 'iiitalic', '90deg', '11', 'italic 90deg' ]
 };
 
 function testParseFace() {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-fonts-3/OWNERS b/third_party/WebKit/LayoutTests/external/wpt/css/css-fonts-3/OWNERS
new file mode 100644
index 0000000..7da8d64
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-fonts-3/OWNERS
@@ -0,0 +1,2 @@
+drott@chromium.org
+kojii@chromium.org
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/interfaces-expected.txt
index 0a3f72c..07a93ad 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/interfaces-expected.txt
@@ -14,13 +14,13 @@
 PASS DOMPointReadOnly interface: operation matrixTransform(DOMMatrixInit) 
 PASS DOMPointReadOnly must be primary interface of new DOMPointReadOnly() 
 PASS Stringification of new DOMPointReadOnly() 
-PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "fromPoint" with the proper type (0) 
+PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "fromPoint(DOMPointInit)" with the proper type 
 PASS DOMPointReadOnly interface: calling fromPoint(DOMPointInit) on new DOMPointReadOnly() with too few arguments must throw TypeError 
-PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "x" with the proper type (1) 
-PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "y" with the proper type (2) 
-PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "z" with the proper type (3) 
-PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "w" with the proper type (4) 
-PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "matrixTransform" with the proper type (5) 
+PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "x" with the proper type 
+PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "y" with the proper type 
+PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "z" with the proper type 
+PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "w" with the proper type 
+PASS DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "matrixTransform(DOMMatrixInit)" with the proper type 
 PASS DOMPointReadOnly interface: calling matrixTransform(DOMMatrixInit) on new DOMPointReadOnly() with too few arguments must throw TypeError 
 PASS DOMPoint interface: existence and properties of interface object 
 PASS DOMPoint interface object length 
@@ -35,19 +35,19 @@
 PASS DOMPoint interface: attribute w 
 PASS DOMPoint must be primary interface of new DOMPoint() 
 PASS Stringification of new DOMPoint() 
-PASS DOMPoint interface: new DOMPoint() must inherit property "fromPoint" with the proper type (0) 
+PASS DOMPoint interface: new DOMPoint() must inherit property "fromPoint(DOMPointInit)" with the proper type 
 PASS DOMPoint interface: calling fromPoint(DOMPointInit) on new DOMPoint() with too few arguments must throw TypeError 
-PASS DOMPoint interface: new DOMPoint() must inherit property "x" with the proper type (1) 
-PASS DOMPoint interface: new DOMPoint() must inherit property "y" with the proper type (2) 
-PASS DOMPoint interface: new DOMPoint() must inherit property "z" with the proper type (3) 
-PASS DOMPoint interface: new DOMPoint() must inherit property "w" with the proper type (4) 
-PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "fromPoint" with the proper type (0) 
+PASS DOMPoint interface: new DOMPoint() must inherit property "x" with the proper type 
+PASS DOMPoint interface: new DOMPoint() must inherit property "y" with the proper type 
+PASS DOMPoint interface: new DOMPoint() must inherit property "z" with the proper type 
+PASS DOMPoint interface: new DOMPoint() must inherit property "w" with the proper type 
+PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "fromPoint(DOMPointInit)" with the proper type 
 PASS DOMPointReadOnly interface: calling fromPoint(DOMPointInit) on new DOMPoint() with too few arguments must throw TypeError 
-PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "x" with the proper type (1) 
-PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "y" with the proper type (2) 
-PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "z" with the proper type (3) 
-PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "w" with the proper type (4) 
-PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "matrixTransform" with the proper type (5) 
+PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "x" with the proper type 
+PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "y" with the proper type 
+PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "z" with the proper type 
+PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "w" with the proper type 
+PASS DOMPointReadOnly interface: new DOMPoint() must inherit property "matrixTransform(DOMMatrixInit)" with the proper type 
 PASS DOMPointReadOnly interface: calling matrixTransform(DOMMatrixInit) on new DOMPoint() with too few arguments must throw TypeError 
 PASS DOMRectReadOnly interface: existence and properties of interface object 
 PASS DOMRectReadOnly interface object length 
@@ -65,16 +65,16 @@
 PASS DOMRectReadOnly interface: attribute left 
 PASS DOMRectReadOnly must be primary interface of new DOMRectReadOnly() 
 PASS Stringification of new DOMRectReadOnly() 
-PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "fromRect" with the proper type (0) 
+PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "fromRect(DOMRectInit)" with the proper type 
 PASS DOMRectReadOnly interface: calling fromRect(DOMRectInit) on new DOMRectReadOnly() with too few arguments must throw TypeError 
-PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "x" with the proper type (1) 
-PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "y" with the proper type (2) 
-PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "width" with the proper type (3) 
-PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "height" with the proper type (4) 
-PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "top" with the proper type (5) 
-PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "right" with the proper type (6) 
-PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "bottom" with the proper type (7) 
-PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "left" with the proper type (8) 
+PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "x" with the proper type 
+PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "y" with the proper type 
+PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "width" with the proper type 
+PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "height" with the proper type 
+PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "top" with the proper type 
+PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "right" with the proper type 
+PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "bottom" with the proper type 
+PASS DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "left" with the proper type 
 PASS DOMRect interface: existence and properties of interface object 
 PASS DOMRect interface object length 
 PASS DOMRect interface object name 
@@ -88,25 +88,25 @@
 PASS DOMRect interface: attribute height 
 PASS DOMRect must be primary interface of new DOMRect() 
 PASS Stringification of new DOMRect() 
-PASS DOMRect interface: new DOMRect() must inherit property "fromRect" with the proper type (0) 
+PASS DOMRect interface: new DOMRect() must inherit property "fromRect(DOMRectInit)" with the proper type 
 PASS DOMRect interface: calling fromRect(DOMRectInit) on new DOMRect() with too few arguments must throw TypeError 
-PASS DOMRect interface: new DOMRect() must inherit property "x" with the proper type (1) 
-PASS DOMRect interface: new DOMRect() must inherit property "y" with the proper type (2) 
-PASS DOMRect interface: new DOMRect() must inherit property "width" with the proper type (3) 
-PASS DOMRect interface: new DOMRect() must inherit property "height" with the proper type (4) 
-PASS DOMRectReadOnly interface: new DOMRect() must inherit property "fromRect" with the proper type (0) 
+PASS DOMRect interface: new DOMRect() must inherit property "x" with the proper type 
+PASS DOMRect interface: new DOMRect() must inherit property "y" with the proper type 
+PASS DOMRect interface: new DOMRect() must inherit property "width" with the proper type 
+PASS DOMRect interface: new DOMRect() must inherit property "height" with the proper type 
+PASS DOMRectReadOnly interface: new DOMRect() must inherit property "fromRect(DOMRectInit)" with the proper type 
 PASS DOMRectReadOnly interface: calling fromRect(DOMRectInit) on new DOMRect() with too few arguments must throw TypeError 
-PASS DOMRectReadOnly interface: new DOMRect() must inherit property "x" with the proper type (1) 
-PASS DOMRectReadOnly interface: new DOMRect() must inherit property "y" with the proper type (2) 
-PASS DOMRectReadOnly interface: new DOMRect() must inherit property "width" with the proper type (3) 
-PASS DOMRectReadOnly interface: new DOMRect() must inherit property "height" with the proper type (4) 
-PASS DOMRectReadOnly interface: new DOMRect() must inherit property "top" with the proper type (5) 
-PASS DOMRectReadOnly interface: new DOMRect() must inherit property "right" with the proper type (6) 
-PASS DOMRectReadOnly interface: new DOMRect() must inherit property "bottom" with the proper type (7) 
-PASS DOMRectReadOnly interface: new DOMRect() must inherit property "left" with the proper type (8) 
+PASS DOMRectReadOnly interface: new DOMRect() must inherit property "x" with the proper type 
+PASS DOMRectReadOnly interface: new DOMRect() must inherit property "y" with the proper type 
+PASS DOMRectReadOnly interface: new DOMRect() must inherit property "width" with the proper type 
+PASS DOMRectReadOnly interface: new DOMRect() must inherit property "height" with the proper type 
+PASS DOMRectReadOnly interface: new DOMRect() must inherit property "top" with the proper type 
+PASS DOMRectReadOnly interface: new DOMRect() must inherit property "right" with the proper type 
+PASS DOMRectReadOnly interface: new DOMRect() must inherit property "bottom" with the proper type 
+PASS DOMRectReadOnly interface: new DOMRect() must inherit property "left" with the proper type 
 PASS Stringification of [object DOMRectList] 
-PASS DOMRectList interface: [object DOMRectList] must inherit property "length" with the proper type (0) 
-PASS DOMRectList interface: [object DOMRectList] must inherit property "item" with the proper type (1) 
+PASS DOMRectList interface: [object DOMRectList] must inherit property "length" with the proper type 
+PASS DOMRectList interface: [object DOMRectList] must inherit property "item(unsigned long)" with the proper type 
 PASS DOMRectList interface: calling item(unsigned long) on [object DOMRectList] with too few arguments must throw TypeError 
 PASS DOMQuad interface: existence and properties of interface object 
 PASS DOMQuad interface object length 
@@ -122,15 +122,15 @@
 PASS DOMQuad interface: operation getBounds() 
 PASS DOMQuad must be primary interface of new DOMQuad() 
 PASS Stringification of new DOMQuad() 
-PASS DOMQuad interface: new DOMQuad() must inherit property "fromRect" with the proper type (0) 
+PASS DOMQuad interface: new DOMQuad() must inherit property "fromRect(DOMRectInit)" with the proper type 
 PASS DOMQuad interface: calling fromRect(DOMRectInit) on new DOMQuad() with too few arguments must throw TypeError 
-PASS DOMQuad interface: new DOMQuad() must inherit property "fromQuad" with the proper type (1) 
+PASS DOMQuad interface: new DOMQuad() must inherit property "fromQuad(DOMQuadInit)" with the proper type 
 PASS DOMQuad interface: calling fromQuad(DOMQuadInit) on new DOMQuad() with too few arguments must throw TypeError 
-PASS DOMQuad interface: new DOMQuad() must inherit property "p1" with the proper type (2) 
-PASS DOMQuad interface: new DOMQuad() must inherit property "p2" with the proper type (3) 
-PASS DOMQuad interface: new DOMQuad() must inherit property "p3" with the proper type (4) 
-PASS DOMQuad interface: new DOMQuad() must inherit property "p4" with the proper type (5) 
-PASS DOMQuad interface: new DOMQuad() must inherit property "getBounds" with the proper type (6) 
+PASS DOMQuad interface: new DOMQuad() must inherit property "p1" with the proper type 
+PASS DOMQuad interface: new DOMQuad() must inherit property "p2" with the proper type 
+PASS DOMQuad interface: new DOMQuad() must inherit property "p3" with the proper type 
+PASS DOMQuad interface: new DOMQuad() must inherit property "p4" with the proper type 
+PASS DOMQuad interface: new DOMQuad() must inherit property "getBounds()" with the proper type 
 PASS DOMMatrixReadOnly interface: existence and properties of interface object 
 PASS DOMMatrixReadOnly interface object length 
 PASS DOMMatrixReadOnly interface object name 
@@ -163,12 +163,12 @@
 PASS DOMMatrixReadOnly interface: attribute m44 
 PASS DOMMatrixReadOnly interface: attribute is2D 
 PASS DOMMatrixReadOnly interface: attribute isIdentity 
-PASS DOMMatrixReadOnly interface: operation translate(unrestricted double,unrestricted double,unrestricted double) 
-PASS DOMMatrixReadOnly interface: operation scale(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS DOMMatrixReadOnly interface: operation scale3d(unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS DOMMatrixReadOnly interface: operation rotate(unrestricted double,unrestricted double,unrestricted double) 
-PASS DOMMatrixReadOnly interface: operation rotateFromVector(unrestricted double,unrestricted double) 
-PASS DOMMatrixReadOnly interface: operation rotateAxisAngle(unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
+PASS DOMMatrixReadOnly interface: operation translate(unrestricted double, unrestricted double, unrestricted double) 
+PASS DOMMatrixReadOnly interface: operation scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS DOMMatrixReadOnly interface: operation scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS DOMMatrixReadOnly interface: operation rotate(unrestricted double, unrestricted double, unrestricted double) 
+PASS DOMMatrixReadOnly interface: operation rotateFromVector(unrestricted double, unrestricted double) 
+PASS DOMMatrixReadOnly interface: operation rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
 PASS DOMMatrixReadOnly interface: operation skewX(unrestricted double) 
 PASS DOMMatrixReadOnly interface: operation skewY(unrestricted double) 
 PASS DOMMatrixReadOnly interface: operation multiply(DOMMatrixInit) 
@@ -181,118 +181,118 @@
 PASS DOMMatrixReadOnly interface: stringifier 
 PASS DOMMatrixReadOnly must be primary interface of new DOMMatrixReadOnly() 
 PASS Stringification of new DOMMatrixReadOnly() 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "fromMatrix" with the proper type (0) 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "fromMatrix(DOMMatrixInit)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling fromMatrix(DOMMatrixInit) on new DOMMatrixReadOnly() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "fromFloat32Array" with the proper type (1) 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "fromFloat32Array(Float32Array)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling fromFloat32Array(Float32Array) on new DOMMatrixReadOnly() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "fromFloat64Array" with the proper type (2) 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "fromFloat64Array(Float64Array)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling fromFloat64Array(Float64Array) on new DOMMatrixReadOnly() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "a" with the proper type (3) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "b" with the proper type (4) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "c" with the proper type (5) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "d" with the proper type (6) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "e" with the proper type (7) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "f" with the proper type (8) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m11" with the proper type (9) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m12" with the proper type (10) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m13" with the proper type (11) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m14" with the proper type (12) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m21" with the proper type (13) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m22" with the proper type (14) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m23" with the proper type (15) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m24" with the proper type (16) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m31" with the proper type (17) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m32" with the proper type (18) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m33" with the proper type (19) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m34" with the proper type (20) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m41" with the proper type (21) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m42" with the proper type (22) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m43" with the proper type (23) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m44" with the proper type (24) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "is2D" with the proper type (25) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "isIdentity" with the proper type (26) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "translate" with the proper type (27) 
-PASS DOMMatrixReadOnly interface: calling translate(unrestricted double,unrestricted double,unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "scale" with the proper type (28) 
-PASS DOMMatrixReadOnly interface: calling scale(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "scale3d" with the proper type (29) 
-PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "rotate" with the proper type (30) 
-PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double,unrestricted double,unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "rotateFromVector" with the proper type (31) 
-PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double,unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "rotateAxisAngle" with the proper type (32) 
-PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "skewX" with the proper type (33) 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "a" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "b" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "c" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "d" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "e" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "f" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m11" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m12" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m13" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m14" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m21" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m22" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m23" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m24" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m31" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m32" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m33" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m34" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m41" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m42" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m43" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "m44" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "is2D" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "isIdentity" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "translate(unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling translate(unrestricted double, unrestricted double, unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "rotate(unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double, unrestricted double, unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "rotateFromVector(unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double, unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "skewX(unrestricted double)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling skewX(unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "skewY" with the proper type (34) 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "skewY(unrestricted double)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling skewY(unrestricted double) on new DOMMatrixReadOnly() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "multiply" with the proper type (35) 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "multiply(DOMMatrixInit)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling multiply(DOMMatrixInit) on new DOMMatrixReadOnly() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "flipX" with the proper type (36) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "flipY" with the proper type (37) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "inverse" with the proper type (38) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "transformPoint" with the proper type (39) 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "flipX()" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "flipY()" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "inverse()" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "transformPoint(DOMPointInit)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling transformPoint(DOMPointInit) on new DOMMatrixReadOnly() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "toFloat32Array" with the proper type (40) 
-PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "toFloat64Array" with the proper type (41) 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "toFloat32Array()" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "toFloat64Array()" with the proper type 
 PASS DOMMatrixReadOnly must be primary interface of DOMMatrixReadOnly.fromMatrix({is2D: false}) 
 PASS Stringification of DOMMatrixReadOnly.fromMatrix({is2D: false}) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "fromMatrix" with the proper type (0) 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "fromMatrix(DOMMatrixInit)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling fromMatrix(DOMMatrixInit) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "fromFloat32Array" with the proper type (1) 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "fromFloat32Array(Float32Array)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling fromFloat32Array(Float32Array) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "fromFloat64Array" with the proper type (2) 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "fromFloat64Array(Float64Array)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling fromFloat64Array(Float64Array) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "a" with the proper type (3) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "b" with the proper type (4) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "c" with the proper type (5) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "d" with the proper type (6) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "e" with the proper type (7) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "f" with the proper type (8) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m11" with the proper type (9) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m12" with the proper type (10) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m13" with the proper type (11) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m14" with the proper type (12) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m21" with the proper type (13) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m22" with the proper type (14) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m23" with the proper type (15) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m24" with the proper type (16) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m31" with the proper type (17) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m32" with the proper type (18) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m33" with the proper type (19) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m34" with the proper type (20) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m41" with the proper type (21) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m42" with the proper type (22) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m43" with the proper type (23) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m44" with the proper type (24) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "is2D" with the proper type (25) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "isIdentity" with the proper type (26) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "translate" with the proper type (27) 
-PASS DOMMatrixReadOnly interface: calling translate(unrestricted double,unrestricted double,unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "scale" with the proper type (28) 
-PASS DOMMatrixReadOnly interface: calling scale(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "scale3d" with the proper type (29) 
-PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "rotate" with the proper type (30) 
-PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double,unrestricted double,unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "rotateFromVector" with the proper type (31) 
-PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double,unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "rotateAxisAngle" with the proper type (32) 
-PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "skewX" with the proper type (33) 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "a" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "b" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "c" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "d" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "e" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "f" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m11" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m12" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m13" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m14" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m21" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m22" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m23" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m24" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m31" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m32" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m33" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m34" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m41" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m42" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m43" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "m44" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "is2D" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "isIdentity" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "translate(unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling translate(unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "rotate(unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "rotateFromVector(unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double, unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "skewX(unrestricted double)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling skewX(unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "skewY" with the proper type (34) 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "skewY(unrestricted double)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling skewY(unrestricted double) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "multiply" with the proper type (35) 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "multiply(DOMMatrixInit)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling multiply(DOMMatrixInit) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "flipX" with the proper type (36) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "flipY" with the proper type (37) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "inverse" with the proper type (38) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "transformPoint" with the proper type (39) 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "flipX()" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "flipY()" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "inverse()" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "transformPoint(DOMPointInit)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling transformPoint(DOMPointInit) on DOMMatrixReadOnly.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "toFloat32Array" with the proper type (40) 
-PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "toFloat64Array" with the proper type (41) 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "toFloat32Array()" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrixReadOnly.fromMatrix({is2D: false}) must inherit property "toFloat64Array()" with the proper type 
 PASS DOMMatrix interface: existence and properties of interface object 
 PASS DOMMatrix interface object length 
 PASS DOMMatrix interface object name 
@@ -326,231 +326,231 @@
 PASS DOMMatrix interface: attribute m44 
 PASS DOMMatrix interface: operation multiplySelf(DOMMatrixInit) 
 PASS DOMMatrix interface: operation preMultiplySelf(DOMMatrixInit) 
-PASS DOMMatrix interface: operation translateSelf(unrestricted double,unrestricted double,unrestricted double) 
-PASS DOMMatrix interface: operation scaleSelf(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS DOMMatrix interface: operation scale3dSelf(unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS DOMMatrix interface: operation rotateSelf(unrestricted double,unrestricted double,unrestricted double) 
-PASS DOMMatrix interface: operation rotateFromVectorSelf(unrestricted double,unrestricted double) 
-PASS DOMMatrix interface: operation rotateAxisAngleSelf(unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
+PASS DOMMatrix interface: operation translateSelf(unrestricted double, unrestricted double, unrestricted double) 
+PASS DOMMatrix interface: operation scaleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS DOMMatrix interface: operation scale3dSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS DOMMatrix interface: operation rotateSelf(unrestricted double, unrestricted double, unrestricted double) 
+PASS DOMMatrix interface: operation rotateFromVectorSelf(unrestricted double, unrestricted double) 
+PASS DOMMatrix interface: operation rotateAxisAngleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
 PASS DOMMatrix interface: operation skewXSelf(unrestricted double) 
 PASS DOMMatrix interface: operation skewYSelf(unrestricted double) 
 PASS DOMMatrix interface: operation invertSelf() 
 PASS DOMMatrix interface: operation setMatrixValue(DOMString) 
 PASS DOMMatrix must be primary interface of new DOMMatrix() 
 PASS Stringification of new DOMMatrix() 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "fromMatrix" with the proper type (0) 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "fromMatrix(DOMMatrixInit)" with the proper type 
 PASS DOMMatrix interface: calling fromMatrix(DOMMatrixInit) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "fromFloat32Array" with the proper type (1) 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "fromFloat32Array(Float32Array)" with the proper type 
 PASS DOMMatrix interface: calling fromFloat32Array(Float32Array) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "fromFloat64Array" with the proper type (2) 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "fromFloat64Array(Float64Array)" with the proper type 
 PASS DOMMatrix interface: calling fromFloat64Array(Float64Array) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "a" with the proper type (3) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "b" with the proper type (4) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "c" with the proper type (5) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "d" with the proper type (6) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "e" with the proper type (7) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "f" with the proper type (8) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m11" with the proper type (9) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m12" with the proper type (10) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m13" with the proper type (11) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m14" with the proper type (12) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m21" with the proper type (13) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m22" with the proper type (14) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m23" with the proper type (15) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m24" with the proper type (16) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m31" with the proper type (17) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m32" with the proper type (18) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m33" with the proper type (19) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m34" with the proper type (20) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m41" with the proper type (21) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m42" with the proper type (22) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m43" with the proper type (23) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "m44" with the proper type (24) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "multiplySelf" with the proper type (25) 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "a" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "b" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "c" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "d" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "e" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "f" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "m11" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "m12" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "m13" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "m14" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "m21" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "m22" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "m23" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "m24" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "m31" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "m32" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "m33" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "m34" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "m41" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "m42" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "m43" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "m44" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "multiplySelf(DOMMatrixInit)" with the proper type 
 PASS DOMMatrix interface: calling multiplySelf(DOMMatrixInit) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "preMultiplySelf" with the proper type (26) 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "preMultiplySelf(DOMMatrixInit)" with the proper type 
 PASS DOMMatrix interface: calling preMultiplySelf(DOMMatrixInit) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "translateSelf" with the proper type (27) 
-PASS DOMMatrix interface: calling translateSelf(unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "scaleSelf" with the proper type (28) 
-PASS DOMMatrix interface: calling scaleSelf(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "scale3dSelf" with the proper type (29) 
-PASS DOMMatrix interface: calling scale3dSelf(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "rotateSelf" with the proper type (30) 
-PASS DOMMatrix interface: calling rotateSelf(unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "rotateFromVectorSelf" with the proper type (31) 
-PASS DOMMatrix interface: calling rotateFromVectorSelf(unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "rotateAxisAngleSelf" with the proper type (32) 
-PASS DOMMatrix interface: calling rotateAxisAngleSelf(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "skewXSelf" with the proper type (33) 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "translateSelf(unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrix interface: calling translateSelf(unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "scaleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrix interface: calling scaleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "scale3dSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrix interface: calling scale3dSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "rotateSelf(unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrix interface: calling rotateSelf(unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "rotateFromVectorSelf(unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrix interface: calling rotateFromVectorSelf(unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "rotateAxisAngleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrix interface: calling rotateAxisAngleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "skewXSelf(unrestricted double)" with the proper type 
 PASS DOMMatrix interface: calling skewXSelf(unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "skewYSelf" with the proper type (34) 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "skewYSelf(unrestricted double)" with the proper type 
 PASS DOMMatrix interface: calling skewYSelf(unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "invertSelf" with the proper type (35) 
-PASS DOMMatrix interface: new DOMMatrix() must inherit property "setMatrixValue" with the proper type (36) 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "invertSelf()" with the proper type 
+PASS DOMMatrix interface: new DOMMatrix() must inherit property "setMatrixValue(DOMString)" with the proper type 
 PASS DOMMatrix interface: calling setMatrixValue(DOMString) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "fromMatrix" with the proper type (0) 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "fromMatrix(DOMMatrixInit)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling fromMatrix(DOMMatrixInit) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "fromFloat32Array" with the proper type (1) 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "fromFloat32Array(Float32Array)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling fromFloat32Array(Float32Array) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "fromFloat64Array" with the proper type (2) 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "fromFloat64Array(Float64Array)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling fromFloat64Array(Float64Array) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "a" with the proper type (3) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "b" with the proper type (4) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "c" with the proper type (5) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "d" with the proper type (6) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "e" with the proper type (7) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "f" with the proper type (8) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m11" with the proper type (9) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m12" with the proper type (10) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m13" with the proper type (11) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m14" with the proper type (12) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m21" with the proper type (13) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m22" with the proper type (14) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m23" with the proper type (15) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m24" with the proper type (16) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m31" with the proper type (17) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m32" with the proper type (18) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m33" with the proper type (19) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m34" with the proper type (20) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m41" with the proper type (21) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m42" with the proper type (22) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m43" with the proper type (23) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m44" with the proper type (24) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "is2D" with the proper type (25) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "isIdentity" with the proper type (26) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "translate" with the proper type (27) 
-PASS DOMMatrixReadOnly interface: calling translate(unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "scale" with the proper type (28) 
-PASS DOMMatrixReadOnly interface: calling scale(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "scale3d" with the proper type (29) 
-PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "rotate" with the proper type (30) 
-PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "rotateFromVector" with the proper type (31) 
-PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "rotateAxisAngle" with the proper type (32) 
-PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "skewX" with the proper type (33) 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "a" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "b" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "c" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "d" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "e" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "f" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m11" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m12" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m13" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m14" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m21" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m22" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m23" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m24" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m31" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m32" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m33" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m34" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m41" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m42" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m43" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "m44" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "is2D" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "isIdentity" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "translate(unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling translate(unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "rotate(unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "rotateFromVector(unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "skewX(unrestricted double)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling skewX(unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "skewY" with the proper type (34) 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "skewY(unrestricted double)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling skewY(unrestricted double) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "multiply" with the proper type (35) 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "multiply(DOMMatrixInit)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling multiply(DOMMatrixInit) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "flipX" with the proper type (36) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "flipY" with the proper type (37) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "inverse" with the proper type (38) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "transformPoint" with the proper type (39) 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "flipX()" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "flipY()" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "inverse()" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "transformPoint(DOMPointInit)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling transformPoint(DOMPointInit) on new DOMMatrix() with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "toFloat32Array" with the proper type (40) 
-PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "toFloat64Array" with the proper type (41) 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "toFloat32Array()" with the proper type 
+PASS DOMMatrixReadOnly interface: new DOMMatrix() must inherit property "toFloat64Array()" with the proper type 
 PASS DOMMatrix must be primary interface of DOMMatrix.fromMatrix({is2D: false}) 
 PASS Stringification of DOMMatrix.fromMatrix({is2D: false}) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromMatrix" with the proper type (0) 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromMatrix(DOMMatrixInit)" with the proper type 
 PASS DOMMatrix interface: calling fromMatrix(DOMMatrixInit) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat32Array" with the proper type (1) 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat32Array(Float32Array)" with the proper type 
 PASS DOMMatrix interface: calling fromFloat32Array(Float32Array) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat64Array" with the proper type (2) 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat64Array(Float64Array)" with the proper type 
 PASS DOMMatrix interface: calling fromFloat64Array(Float64Array) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "a" with the proper type (3) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "b" with the proper type (4) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "c" with the proper type (5) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "d" with the proper type (6) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "e" with the proper type (7) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "f" with the proper type (8) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m11" with the proper type (9) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m12" with the proper type (10) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m13" with the proper type (11) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m14" with the proper type (12) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m21" with the proper type (13) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m22" with the proper type (14) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m23" with the proper type (15) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m24" with the proper type (16) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m31" with the proper type (17) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m32" with the proper type (18) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m33" with the proper type (19) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m34" with the proper type (20) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m41" with the proper type (21) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m42" with the proper type (22) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m43" with the proper type (23) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m44" with the proper type (24) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "multiplySelf" with the proper type (25) 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "a" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "b" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "c" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "d" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "e" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "f" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m11" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m12" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m13" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m14" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m21" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m22" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m23" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m24" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m31" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m32" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m33" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m34" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m41" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m42" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m43" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m44" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "multiplySelf(DOMMatrixInit)" with the proper type 
 PASS DOMMatrix interface: calling multiplySelf(DOMMatrixInit) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "preMultiplySelf" with the proper type (26) 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "preMultiplySelf(DOMMatrixInit)" with the proper type 
 PASS DOMMatrix interface: calling preMultiplySelf(DOMMatrixInit) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "translateSelf" with the proper type (27) 
-PASS DOMMatrix interface: calling translateSelf(unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scaleSelf" with the proper type (28) 
-PASS DOMMatrix interface: calling scaleSelf(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scale3dSelf" with the proper type (29) 
-PASS DOMMatrix interface: calling scale3dSelf(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateSelf" with the proper type (30) 
-PASS DOMMatrix interface: calling rotateSelf(unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateFromVectorSelf" with the proper type (31) 
-PASS DOMMatrix interface: calling rotateFromVectorSelf(unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateAxisAngleSelf" with the proper type (32) 
-PASS DOMMatrix interface: calling rotateAxisAngleSelf(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewXSelf" with the proper type (33) 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "translateSelf(unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrix interface: calling translateSelf(unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scaleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrix interface: calling scaleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scale3dSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrix interface: calling scale3dSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateSelf(unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrix interface: calling rotateSelf(unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateFromVectorSelf(unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrix interface: calling rotateFromVectorSelf(unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateAxisAngleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrix interface: calling rotateAxisAngleSelf(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewXSelf(unrestricted double)" with the proper type 
 PASS DOMMatrix interface: calling skewXSelf(unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewYSelf" with the proper type (34) 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewYSelf(unrestricted double)" with the proper type 
 PASS DOMMatrix interface: calling skewYSelf(unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "invertSelf" with the proper type (35) 
-PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "setMatrixValue" with the proper type (36) 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "invertSelf()" with the proper type 
+PASS DOMMatrix interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "setMatrixValue(DOMString)" with the proper type 
 PASS DOMMatrix interface: calling setMatrixValue(DOMString) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromMatrix" with the proper type (0) 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromMatrix(DOMMatrixInit)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling fromMatrix(DOMMatrixInit) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat32Array" with the proper type (1) 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat32Array(Float32Array)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling fromFloat32Array(Float32Array) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat64Array" with the proper type (2) 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "fromFloat64Array(Float64Array)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling fromFloat64Array(Float64Array) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "a" with the proper type (3) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "b" with the proper type (4) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "c" with the proper type (5) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "d" with the proper type (6) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "e" with the proper type (7) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "f" with the proper type (8) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m11" with the proper type (9) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m12" with the proper type (10) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m13" with the proper type (11) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m14" with the proper type (12) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m21" with the proper type (13) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m22" with the proper type (14) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m23" with the proper type (15) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m24" with the proper type (16) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m31" with the proper type (17) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m32" with the proper type (18) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m33" with the proper type (19) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m34" with the proper type (20) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m41" with the proper type (21) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m42" with the proper type (22) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m43" with the proper type (23) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m44" with the proper type (24) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "is2D" with the proper type (25) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "isIdentity" with the proper type (26) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "translate" with the proper type (27) 
-PASS DOMMatrixReadOnly interface: calling translate(unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scale" with the proper type (28) 
-PASS DOMMatrixReadOnly interface: calling scale(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scale3d" with the proper type (29) 
-PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotate" with the proper type (30) 
-PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateFromVector" with the proper type (31) 
-PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateAxisAngle" with the proper type (32) 
-PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewX" with the proper type (33) 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "a" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "b" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "c" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "d" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "e" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "f" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m11" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m12" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m13" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m14" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m21" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m22" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m23" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m24" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m31" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m32" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m33" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m34" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m41" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m42" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m43" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "m44" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "is2D" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "isIdentity" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "translate(unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling translate(unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling scale(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling scale3d(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotate(unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling rotate(unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateFromVector(unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling rotateFromVector(unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS DOMMatrixReadOnly interface: calling rotateAxisAngle(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewX(unrestricted double)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling skewX(unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewY" with the proper type (34) 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "skewY(unrestricted double)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling skewY(unrestricted double) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "multiply" with the proper type (35) 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "multiply(DOMMatrixInit)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling multiply(DOMMatrixInit) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "flipX" with the proper type (36) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "flipY" with the proper type (37) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "inverse" with the proper type (38) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "transformPoint" with the proper type (39) 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "flipX()" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "flipY()" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "inverse()" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "transformPoint(DOMPointInit)" with the proper type 
 PASS DOMMatrixReadOnly interface: calling transformPoint(DOMPointInit) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "toFloat32Array" with the proper type (40) 
-PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "toFloat64Array" with the proper type (41) 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "toFloat32Array()" with the proper type 
+PASS DOMMatrixReadOnly interface: DOMMatrix.fromMatrix({is2D: false}) must inherit property "toFloat64Array()" with the proper type 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-anchor-interpolation.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-anchor-interpolation.html
new file mode 100644
index 0000000..414a0bd0d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-anchor-interpolation.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>offset-anchor interpolation</title>
+    <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+    <link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-anchor-property">
+    <meta name="assert" content="offset-anchor supports <position> animation.">
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="resources/interpolation-testcommon.js"></script>
+    <style>
+      body {
+        width: 500px;
+        height: 500px;
+        transform: rotate(0deg);
+      }
+      div {
+        width: 10px;
+        height: 10px;
+      }
+    </style>
+  </head>
+  <body>
+    <script>
+      test_interpolation({
+        property: 'offset-anchor',
+        from: '220px 240px',
+        to: '300px 400px',
+      }, [
+        {at: -1, expect: '140px 80px'},
+        {at: 0, expect: '220px 240px'},
+        {at: 0.125, expect: '230px 260px'},
+        {at: 0.875, expect: '290px 380px'},
+        {at: 1, expect: '300px 400px'},
+        {at: 2, expect: '380px 560px'}
+      ]);
+
+      test_interpolation({
+        property: 'offset-anchor',
+        from: 'left 480px top 400px',
+        to: 'right -140% bottom -60%',
+      }, [
+        {at: -1, expect: 'calc(960px - 240%) calc(800px - 160%)'},
+        {at: 0, expect: 'left 480px top 400px'},
+        {at: 0.125, expect: 'calc(420px + 30%) calc(350px + 20%)'},
+        {at: 0.875, expect: 'calc(210% + 60px) calc(140% + 50px)'},
+        {at: 1, expect: 'right -140% bottom -60%'},
+        {at: 2, expect: 'calc(480% - 480px) calc(320% - 400px)'}
+      ]);
+
+      test_interpolation({
+        property: 'offset-anchor',
+        from: 'left top',
+        to: 'left 8px bottom 20%',
+      }, [
+        {at: -1, expect: '-8px -80%'},
+        {at: 0, expect: 'left top'},
+        {at: 0.125, expect: '1px 10%'},
+        {at: 0.875, expect: '7px 70%'},
+        {at: 1, expect: 'left 8px bottom 20%'},
+        {at: 2, expect: '16px 160%'}
+      ]);
+
+      test_no_interpolation({
+        property: 'offset-anchor',
+        from: 'right 10px top 20%',
+        to: 'auto'
+      });
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-distance-interpolation.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-distance-interpolation.html
new file mode 100644
index 0000000..a56878a0
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-distance-interpolation.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>offset-distance interpolation</title>
+    <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+    <link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-distance-property">
+    <meta name="assert" content="offset-distance supports animation.">
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="resources/interpolation-testcommon.js"></script>
+  </head>
+  <body>
+    <script>
+      test_interpolation({
+        property: 'offset-distance',
+        from: '-30px',
+        to: '50px',
+      }, [
+        {at: -1, expect: '-110px'},
+        {at: 0, expect: '-30px'},
+        {at: 0.125, expect: '-20px'},
+        {at: 0.875, expect: '40px'},
+        {at: 1, expect: '50px'},
+        {at: 2, expect: '130px'}
+      ]);
+
+      test_interpolation({
+        property: 'offset-distance',
+        from: '20%',
+        to: '100%',
+      }, [
+        {at: -1, expect: '-60%'},
+        {at: 0, expect: '20%'},
+        {at: 0.125, expect: '30%'},
+        {at: 0.875, expect: '90%'},
+        {at: 1, expect: '100%'},
+        {at: 2, expect: '180%'}
+      ]);
+
+      test_interpolation({
+        property: 'offset-distance',
+        from: 'calc(20% - 30px)',
+        to: 'calc(50px + 100%)',
+      }, [
+        {at: -1, expect: 'calc(-110px + -60%)'},
+        {at: 0, expect: 'calc(20% - 30px)'},
+        {at: 0.125, expect: 'calc(-20px + 30%)'},
+        {at: 0.875, expect: 'calc(40px + 90%)'},
+        {at: 1, expect: 'calc(50px + 100%)'},
+        {at: 2, expect: 'calc(130px + 180%)'}
+      ]);
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-position-interpolation.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-position-interpolation.html
new file mode 100644
index 0000000..c31034d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-position-interpolation.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>offset-position interpolation</title>
+    <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+    <link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-position-property">
+    <meta name="assert" content="offset-position supports <position> animation.">
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="resources/interpolation-testcommon.js"></script>
+    <style>
+      body {
+        width: 500px;
+        height: 500px;
+        transform: rotate(0deg);
+      }
+      div {
+        width: 10px;
+        height: 10px;
+      }
+    </style>
+  </head>
+  <body>
+    <script>
+      test_interpolation({
+        property: 'offset-position',
+        from: '220px 240px',
+        to: '300px 400px',
+      }, [
+        {at: -1, expect: '140px 80px'},
+        {at: 0, expect: '220px 240px'},
+        {at: 0.125, expect: '230px 260px'},
+        {at: 0.875, expect: '290px 380px'},
+        {at: 1, expect: '300px 400px'},
+        {at: 2, expect: '380px 560px'}
+      ]);
+
+      test_interpolation({
+        property: 'offset-position',
+        from: 'left 480px top 400px',
+        to: 'right -140% bottom -60%',
+      }, [
+        {at: -1, expect: 'calc(960px - 240%) calc(800px - 160%)'},
+        {at: 0, expect: 'left 480px top 400px'},
+        {at: 0.125, expect: 'calc(420px + 30%) calc(350px + 20%)'},
+        {at: 0.875, expect: 'calc(210% + 60px) calc(140% + 50px)'},
+        {at: 1, expect: 'right -140% bottom -60%'},
+        {at: 2, expect: 'calc(480% - 480px) calc(320% - 400px)'}
+      ]);
+
+      test_interpolation({
+        property: 'offset-position',
+        from: 'left top',
+        to: 'left 8px bottom 20%',
+      }, [
+        {at: -1, expect: '-8px -80%'},
+        {at: 0, expect: 'left top'},
+        {at: 0.125, expect: '1px 10%'},
+        {at: 0.875, expect: '7px 70%'},
+        {at: 1, expect: 'left 8px bottom 20%'},
+        {at: 2, expect: '16px 160%'}
+      ]);
+
+      test_no_interpolation({
+        property: 'offset-position',
+        from: 'right 10px top 20%',
+        to: 'auto'
+      });
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-rotate-interpolation.html b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-rotate-interpolation.html
new file mode 100644
index 0000000..a73c1a4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/offset-rotate-interpolation.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>offset-rotate interpolation</title>
+    <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+    <link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-rotate-property">
+    <meta name="assert" content="offset-rotate supports animation.">
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="resources/interpolation-testcommon.js"></script>
+  </head>
+  <body>
+    <script>
+      test_interpolation({
+        property: 'offset-rotate',
+        from: '100deg',
+        to: '180deg',
+      }, [
+        {at: -1, expect: '20deg'},
+        {at: 0, expect: '100deg'},
+        {at: 0.125, expect: '110deg'},
+        {at: 0.875, expect: '170deg'},
+        {at: 1, expect: '180deg'},
+        {at: 2, expect: '260deg'}
+      ]);
+
+      test_interpolation({
+        property: 'offset-rotate',
+        from: 'auto 100deg',
+        to: 'reverse',
+      }, [
+        {at: -1, expect: 'auto 20deg'},
+        {at: 0, expect: 'auto 100deg'},
+        {at: 0.125, expect: 'auto 110deg'},
+        {at: 0.875, expect: 'auto 170deg'},
+        {at: 1, expect: 'reverse'},
+        {at: 2, expect: 'auto 260deg'}
+      ]);
+
+      // No interpolation between auto/reverse and angle.
+      test_no_interpolation({
+        property: 'offset-rotate',
+        from: 'reverse 90deg',
+        to: '360deg',
+      });
+
+      test_no_interpolation({
+        property: 'offset-rotate',
+        from: '6rad',
+        to: 'auto',
+      });
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/resources/interpolation-testcommon.js b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/resources/interpolation-testcommon.js
new file mode 100644
index 0000000..be86c43
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/motion-1/animation/resources/interpolation-testcommon.js
@@ -0,0 +1,65 @@
+'use strict';
+function test_interpolation(settings, expectations) {
+  // Returns a timing function that at 0.5 evaluates to progress.
+  function timingFunction(progress) {
+    if (progress === 0)
+      return 'steps(1, end)';
+    if (progress === 1)
+      return 'steps(1, start)';
+    var y = (8 * progress - 1) / 6;
+    return 'cubic-bezier(0, ' + y + ', 1, ' + y + ')';
+  }
+
+  test(function(){
+    assert_true(CSS.supports(settings.property, settings.from), 'Value "' + settings.from + '" is supported by ' + settings.property);
+    assert_true(CSS.supports(settings.property, settings.to), 'Value "' + settings.to + '" is supported by ' + settings.property);
+  }, '"' + settings.from + '" and "' + settings.to + '" are valid ' + settings.property + ' values');
+
+  for (var i = 0; i < expectations.length; ++i) {
+    var progress = expectations[i].at;
+    var expectation = expectations[i].expect;
+    var animationId = 'anim' + i;
+    var targetId = 'target' + i;
+    var referenceId = 'reference' + i;
+
+    test(function(){
+      assert_true(CSS.supports(settings.property, expectation), 'Value "' + expectation + '" is supported by ' + settings.property);
+
+      var stylesheet = document.createElement('style');
+      stylesheet.textContent =
+        '#' + targetId + ' {\n' +
+        '  animation: 2s ' + timingFunction(progress) + ' -1s paused ' + animationId + ';\n' +
+        '}\n' +
+        '@keyframes ' + animationId + ' {\n' +
+        '  0% { ' + settings.property + ': ' + settings.from + '; }\n' +
+        '  100% { ' + settings.property + ': ' + settings.to + '; }\n' +
+        '}\n' +
+        '#' + referenceId + ' {\n' +
+        '  ' + settings.property + ': ' + expectation + ';\n' +
+        '}\n';
+      document.head.appendChild(stylesheet);
+
+      var target = document.createElement('div');
+      target.id = targetId;
+      document.body.appendChild(target);
+
+      var reference = document.createElement('div');
+      reference.id = referenceId;
+      document.body.appendChild(reference);
+      reference.style = '';
+
+      assert_equals(getComputedStyle(target)[settings.property], getComputedStyle(reference)[settings.property]);
+    }, 'Animation between "' + settings.from + '" and "' + settings.to + '" at progress ' + progress);
+  }
+}
+
+function test_no_interpolation(settings) {
+  var expectatFrom = [-1, 0, 0.125].map(function (progress) {
+    return {at: progress, expect: settings.from};
+  });
+  var expectatTo = [0.875, 1, 2].map(function (progress) {
+    return {at: progress, expect: settings.to};
+  });
+
+  test_interpolation(settings, expectatFrom.concat(expectatTo));
+}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cssom-view/scrollIntoView-empty-args.html b/third_party/WebKit/LayoutTests/external/wpt/cssom-view/scrollIntoView-empty-args.html
index 8ffd68a..3ea8cfc 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/cssom-view/scrollIntoView-empty-args.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/cssom-view/scrollIntoView-empty-args.html
@@ -2,49 +2,82 @@
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <title>Check End Position of scrollIntoView when arg is not fully specified</title>
-<div id="container" style="height: 2500px; width: 2500px;">
-  <div id="content" style="height: 500px; width: 500px;margin-left: 1000px; margin-right: 1000px; margin-top: 1000px;margin-bottom: 1000px;background-color: red">
-  </div>
+
+<style>
+  #container {
+    position: relative;
+    height: 1000px;
+    width: 800px;
+    overflow: scroll;
+  }
+
+  #content {
+    position: absolute;
+    height: 500px;
+    width: 400px;
+    left: 1000px;
+    top: 1000px;
+    background-color: red;
+  }
+</style>
+
+<div id="container">
+  <div id="filler" style="height: 2500px; width: 2500px"></div>
+  <div id="content">I must become visible</div>
 </div>
+
 <script>
-add_completion_callback(() => document.getElementById("container").remove());
-var content_height = 500;
-var content_width = 500;
-var window_height = document.documentElement.clientHeight;
-var window_width = document.documentElement.clientWidth;
-var content = document.getElementById("content");
+  add_completion_callback(() => document.getElementById("container").remove());
+  var content = document.getElementById("content");
+  var container = document.getElementById("container");
 
-function instantScrollToTestArgs(arg, expected_x, expected_y) {
-  window.scrollTo(0, 0);
-  assert_not_equals(window.scrollX, expected_x);
-  assert_not_equals(window.scrollY, expected_y);
-  if (arg == "omitted")
-    content.scrollIntoView();
-  else
-    content.scrollIntoView(arg);
-  assert_approx_equals(window.scrollX, expected_x, 1);
-  assert_approx_equals(window.scrollY, expected_y, 1);
-}
+  var remaining_width = container.clientWidth - content.clientWidth;
+  var remaining_height = container.clientHeight - content.clientHeight;
 
-test(t => {
+  function instantScrollToTestArgs(arg, expected_x, expected_y) {
+    test(t => {
+      container.scrollTop = container.scrollLeft = 0;
+
+      assert_not_equals(container.scrollLeft, expected_x);
+      assert_not_equals(container.scrollTop, expected_y);
+      if (arg == "omitted")
+        content.scrollIntoView();
+      else
+        content.scrollIntoView(arg);
+      assert_approx_equals(container.scrollTop, expected_y, 1, "verify scroll top");
+      assert_approx_equals(container.scrollLeft, expected_x, 1, "verify scroll left");
+
+    }, "scrollIntoView should behave correctly when the arg is " + arg);
+  }
+
+  // expected alignment: inline => nearest, block => start
   instantScrollToTestArgs("omitted",
-    content.offsetLeft + content_width - window_width,
+    content.offsetLeft - remaining_width,
     content.offsetTop);
+
+  // expected alignment: inline => nearest, block => start
   instantScrollToTestArgs(true,
-    content.offsetLeft + content_width - window_width,
+    content.offsetLeft - remaining_width,
     content.offsetTop);
+
+  // expected alignment: inline => nearest, block => end
   instantScrollToTestArgs(false,
-    content.offsetLeft + content_width - window_width,
-    content.offsetTop + content_height - window_height);
+    content.offsetLeft - remaining_width,
+    content.offsetTop - remaining_height);
+
+  // expected alignment: inline => center, block => center
   instantScrollToTestArgs({},
-    content.offsetLeft + (content_width - window_width) / 2,
-    content.offsetTop + (content_height - window_height) / 2);
+    content.offsetLeft - remaining_width / 2,
+    content.offsetTop - remaining_height / 2);
+
+  // expected alignment: inline => center, block => center
   instantScrollToTestArgs(null,
-    content.offsetLeft + (content_width - window_width) / 2,
-    content.offsetTop + (content_height - window_height) / 2);
+    content.offsetLeft - remaining_width / 2,
+    content.offsetTop - remaining_height / 2);
+
+  // expected alignment: inline => nearest, block => start
   instantScrollToTestArgs(undefined,
-    content.offsetLeft + content_width - window_width,
+    content.offsetLeft - remaining_width,
     content.offsetTop);
-}, "scrollIntoView should behave correctly when the arg is not fully specified as ScrollIntoViewOptions");
 
 </script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cssom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/cssom/interfaces-expected.txt
index 884990cd..bc49385a 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/cssom/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/cssom/interfaces-expected.txt
@@ -1,12 +1,12 @@
 This is a testharness.js-based test.
 Found 191 tests; 165 PASS, 26 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Document interface: attribute styleSheets 
-PASS Document interface: document must inherit property "styleSheets" with the proper type (0) 
-PASS Document interface: new Document() must inherit property "styleSheets" with the proper type (0) 
+PASS Document interface: document must inherit property "styleSheets" with the proper type 
+PASS Document interface: new Document() must inherit property "styleSheets" with the proper type 
 PASS ProcessingInstruction interface: attribute sheet 
 PASS HTMLElement interface: attribute style 
 PASS SVGElement interface: attribute style 
-PASS Window interface: operation getComputedStyle(Element,DOMString) 
+PASS Window interface: operation getComputedStyle(Element, DOMString) 
 PASS MediaList interface: existence and properties of interface object 
 PASS MediaList interface object length 
 PASS MediaList interface object name 
@@ -37,25 +37,25 @@
 PASS CSSStyleSheet interface: existence and properties of interface prototype object's "constructor" property 
 PASS CSSStyleSheet interface: attribute ownerRule 
 PASS CSSStyleSheet interface: attribute cssRules 
-FAIL CSSStyleSheet interface: operation insertRule(DOMString,unsigned long) assert_equals: property has wrong .length expected 2 but got 1
+FAIL CSSStyleSheet interface: operation insertRule(DOMString, unsigned long) assert_equals: property has wrong .length expected 2 but got 1
 PASS CSSStyleSheet interface: operation deleteRule(unsigned long) 
 PASS CSSStyleSheet must be primary interface of style_element.sheet 
 PASS Stringification of style_element.sheet 
-PASS CSSStyleSheet interface: style_element.sheet must inherit property "ownerRule" with the proper type (0) 
-PASS CSSStyleSheet interface: style_element.sheet must inherit property "cssRules" with the proper type (1) 
-PASS CSSStyleSheet interface: style_element.sheet must inherit property "insertRule" with the proper type (2) 
-FAIL CSSStyleSheet interface: calling insertRule(DOMString,unsigned long) on style_element.sheet with too few arguments must throw TypeError assert_throws: Called with 1 arguments function "function () {
+PASS CSSStyleSheet interface: style_element.sheet must inherit property "ownerRule" with the proper type 
+PASS CSSStyleSheet interface: style_element.sheet must inherit property "cssRules" with the proper type 
+PASS CSSStyleSheet interface: style_element.sheet must inherit property "insertRule(DOMString, unsigned long)" with the proper type 
+FAIL CSSStyleSheet interface: calling insertRule(DOMString, unsigned long) on style_element.sheet with too few arguments must throw TypeError assert_throws: Called with 1 arguments function "function () {
             fn.apply(obj, args);
         }" threw object "SyntaxError: Failed to execute 'insertRule' on 'CSSStyleSheet': Failed to parse the rule 'foo'." ("SyntaxError") expected object "TypeError" ("TypeError")
-PASS CSSStyleSheet interface: style_element.sheet must inherit property "deleteRule" with the proper type (3) 
+PASS CSSStyleSheet interface: style_element.sheet must inherit property "deleteRule(unsigned long)" with the proper type 
 PASS CSSStyleSheet interface: calling deleteRule(unsigned long) on style_element.sheet with too few arguments must throw TypeError 
-PASS StyleSheet interface: style_element.sheet must inherit property "type" with the proper type (0) 
-PASS StyleSheet interface: style_element.sheet must inherit property "href" with the proper type (1) 
-PASS StyleSheet interface: style_element.sheet must inherit property "ownerNode" with the proper type (2) 
-PASS StyleSheet interface: style_element.sheet must inherit property "parentStyleSheet" with the proper type (3) 
-PASS StyleSheet interface: style_element.sheet must inherit property "title" with the proper type (4) 
-PASS StyleSheet interface: style_element.sheet must inherit property "media" with the proper type (5) 
-PASS StyleSheet interface: style_element.sheet must inherit property "disabled" with the proper type (6) 
+PASS StyleSheet interface: style_element.sheet must inherit property "type" with the proper type 
+PASS StyleSheet interface: style_element.sheet must inherit property "href" with the proper type 
+PASS StyleSheet interface: style_element.sheet must inherit property "ownerNode" with the proper type 
+PASS StyleSheet interface: style_element.sheet must inherit property "parentStyleSheet" with the proper type 
+PASS StyleSheet interface: style_element.sheet must inherit property "title" with the proper type 
+PASS StyleSheet interface: style_element.sheet must inherit property "media" with the proper type 
+PASS StyleSheet interface: style_element.sheet must inherit property "disabled" with the proper type 
 PASS StyleSheetList interface: existence and properties of interface object 
 PASS StyleSheetList interface object length 
 PASS StyleSheetList interface object name 
@@ -65,9 +65,9 @@
 PASS StyleSheetList interface: attribute length 
 PASS StyleSheetList must be primary interface of document.styleSheets 
 PASS Stringification of document.styleSheets 
-PASS StyleSheetList interface: document.styleSheets must inherit property "item" with the proper type (0) 
+PASS StyleSheetList interface: document.styleSheets must inherit property "item(unsigned long)" with the proper type 
 PASS StyleSheetList interface: calling item(unsigned long) on document.styleSheets with too few arguments must throw TypeError 
-PASS StyleSheetList interface: document.styleSheets must inherit property "length" with the proper type (1) 
+PASS StyleSheetList interface: document.styleSheets must inherit property "length" with the proper type 
 PASS CSSRuleList interface: existence and properties of interface object 
 PASS CSSRuleList interface object length 
 PASS CSSRuleList interface object name 
@@ -77,9 +77,9 @@
 PASS CSSRuleList interface: attribute length 
 PASS CSSRuleList must be primary interface of style_element.sheet.cssRules 
 PASS Stringification of style_element.sheet.cssRules 
-PASS CSSRuleList interface: style_element.sheet.cssRules must inherit property "item" with the proper type (0) 
+PASS CSSRuleList interface: style_element.sheet.cssRules must inherit property "item(unsigned long)" with the proper type 
 PASS CSSRuleList interface: calling item(unsigned long) on style_element.sheet.cssRules with too few arguments must throw TypeError 
-PASS CSSRuleList interface: style_element.sheet.cssRules must inherit property "length" with the proper type (1) 
+PASS CSSRuleList interface: style_element.sheet.cssRules must inherit property "length" with the proper type 
 PASS CSSRule interface: existence and properties of interface object 
 PASS CSSRule interface object length 
 PASS CSSRule interface object name 
@@ -114,20 +114,20 @@
 PASS CSSStyleRule interface: attribute style 
 PASS CSSStyleRule must be primary interface of style_element.sheet.cssRules[0] 
 PASS Stringification of style_element.sheet.cssRules[0] 
-PASS CSSStyleRule interface: style_element.sheet.cssRules[0] must inherit property "selectorText" with the proper type (0) 
-PASS CSSStyleRule interface: style_element.sheet.cssRules[0] must inherit property "style" with the proper type (1) 
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "STYLE_RULE" with the proper type (0) 
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "CHARSET_RULE" with the proper type (1) 
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "IMPORT_RULE" with the proper type (2) 
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "MEDIA_RULE" with the proper type (3) 
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type (4) 
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "PAGE_RULE" with the proper type (5) 
-FAIL CSSRule interface: style_element.sheet.cssRules[0] must inherit property "MARGIN_RULE" with the proper type (6) assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type (7) 
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "type" with the proper type (8) 
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "cssText" with the proper type (9) 
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "parentRule" with the proper type (10) 
-PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "parentStyleSheet" with the proper type (11) 
+PASS CSSStyleRule interface: style_element.sheet.cssRules[0] must inherit property "selectorText" with the proper type 
+PASS CSSStyleRule interface: style_element.sheet.cssRules[0] must inherit property "style" with the proper type 
+PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "STYLE_RULE" with the proper type 
+PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "CHARSET_RULE" with the proper type 
+PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "IMPORT_RULE" with the proper type 
+PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "MEDIA_RULE" with the proper type 
+PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type 
+PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "PAGE_RULE" with the proper type 
+FAIL CSSRule interface: style_element.sheet.cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
+PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type 
+PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "type" with the proper type 
+PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "cssText" with the proper type 
+PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "parentRule" with the proper type 
+PASS CSSRule interface: style_element.sheet.cssRules[0] must inherit property "parentStyleSheet" with the proper type 
 PASS CSSImportRule interface: existence and properties of interface object 
 PASS CSSImportRule interface object length 
 PASS CSSImportRule interface object name 
@@ -142,7 +142,7 @@
 PASS CSSGroupingRule interface: existence and properties of interface prototype object 
 PASS CSSGroupingRule interface: existence and properties of interface prototype object's "constructor" property 
 PASS CSSGroupingRule interface: attribute cssRules 
-PASS CSSGroupingRule interface: operation insertRule(DOMString,unsigned long) 
+PASS CSSGroupingRule interface: operation insertRule(DOMString, unsigned long) 
 PASS CSSGroupingRule interface: operation deleteRule(unsigned long) 
 FAIL CSSMediaRule interface: existence and properties of interface object assert_equals: prototype of CSSMediaRule is not CSSGroupingRule expected function "function CSSGroupingRule() { [native code] }" but got function "function CSSConditionRule() { [native code] }"
 PASS CSSMediaRule interface object length 
@@ -181,9 +181,9 @@
 PASS CSSStyleDeclaration interface: operation item(unsigned long) 
 PASS CSSStyleDeclaration interface: operation getPropertyValue(DOMString) 
 PASS CSSStyleDeclaration interface: operation getPropertyPriority(DOMString) 
-PASS CSSStyleDeclaration interface: operation setProperty(DOMString,DOMString,DOMString) 
-FAIL CSSStyleDeclaration interface: operation setPropertyValue(DOMString,DOMString) assert_own_property: interface prototype object missing non-static operation expected property "setPropertyValue" missing
-FAIL CSSStyleDeclaration interface: operation setPropertyPriority(DOMString,DOMString) assert_own_property: interface prototype object missing non-static operation expected property "setPropertyPriority" missing
+PASS CSSStyleDeclaration interface: operation setProperty(DOMString, DOMString, DOMString) 
+FAIL CSSStyleDeclaration interface: operation setPropertyValue(DOMString, DOMString) assert_own_property: interface prototype object missing non-static operation expected property "setPropertyValue" missing
+FAIL CSSStyleDeclaration interface: operation setPropertyPriority(DOMString, DOMString) assert_own_property: interface prototype object missing non-static operation expected property "setPropertyPriority" missing
 PASS CSSStyleDeclaration interface: operation removeProperty(DOMString) 
 PASS CSSStyleDeclaration interface: attribute parentRule 
 PASS CSSStyleDeclaration interface: attribute cssFloat 
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 d102b79..13e41f99 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces-expected.txt
@@ -25,92 +25,92 @@
 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 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 inherit property "type" with the proper type 
+PASS Event interface: document.createEvent("Event") must inherit property "target" with the proper type 
+PASS Event interface: document.createEvent("Event") must inherit property "currentTarget" with the proper type 
+PASS Event interface: document.createEvent("Event") must inherit property "NONE" with the proper type 
+PASS Event interface: document.createEvent("Event") must inherit property "CAPTURING_PHASE" with the proper type 
+PASS Event interface: document.createEvent("Event") must inherit property "AT_TARGET" with the proper type 
+PASS Event interface: document.createEvent("Event") must inherit property "BUBBLING_PHASE" with the proper type 
+PASS Event interface: document.createEvent("Event") must inherit property "eventPhase" with the proper type 
+PASS Event interface: document.createEvent("Event") must inherit property "stopPropagation()" with the proper type 
+PASS Event interface: document.createEvent("Event") must inherit property "stopImmediatePropagation()" with the proper type 
+PASS Event interface: document.createEvent("Event") must inherit property "bubbles" with the proper type 
+PASS Event interface: document.createEvent("Event") must inherit property "cancelable" with the proper type 
+PASS Event interface: document.createEvent("Event") must inherit property "preventDefault()" with the proper type 
+PASS Event interface: document.createEvent("Event") must inherit property "defaultPrevented" with the proper type 
 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 interface: document.createEvent("Event") must inherit property "timeStamp" with the proper type 
+PASS Event interface: document.createEvent("Event") must inherit property "initEvent(DOMString, boolean, boolean)" with the proper type 
+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 inherit property "type" with the proper type 
+PASS Event interface: new Event("foo") must inherit property "target" with the proper type 
+PASS Event interface: new Event("foo") must inherit property "currentTarget" with the proper type 
+PASS Event interface: new Event("foo") must inherit property "NONE" with the proper type 
+PASS Event interface: new Event("foo") must inherit property "CAPTURING_PHASE" with the proper type 
+PASS Event interface: new Event("foo") must inherit property "AT_TARGET" with the proper type 
+PASS Event interface: new Event("foo") must inherit property "BUBBLING_PHASE" with the proper type 
+PASS Event interface: new Event("foo") must inherit property "eventPhase" with the proper type 
+PASS Event interface: new Event("foo") must inherit property "stopPropagation()" with the proper type 
+PASS Event interface: new Event("foo") must inherit property "stopImmediatePropagation()" with the proper type 
+PASS Event interface: new Event("foo") must inherit property "bubbles" with the proper type 
+PASS Event interface: new Event("foo") must inherit property "cancelable" with the proper type 
+PASS Event interface: new Event("foo") must inherit property "preventDefault()" with the proper type 
+PASS Event interface: new Event("foo") must inherit property "defaultPrevented" with the proper type 
 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 Event interface: new Event("foo") must inherit property "timeStamp" with the proper type 
+PASS Event interface: new Event("foo") must inherit property "initEvent(DOMString, boolean, boolean)" with the proper type 
+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 
 PASS CustomEvent interface: existence and properties of interface prototype object 
 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 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 CustomEvent interface: new CustomEvent("foo") must inherit property "detail" with the proper type 
+PASS CustomEvent interface: new CustomEvent("foo") must inherit property "initCustomEvent(DOMString, boolean, boolean, any)" with the proper type 
+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 
+PASS Event interface: new CustomEvent("foo") must inherit property "target" with the proper type 
+PASS Event interface: new CustomEvent("foo") must inherit property "currentTarget" with the proper type 
+PASS Event interface: new CustomEvent("foo") must inherit property "NONE" with the proper type 
+PASS Event interface: new CustomEvent("foo") must inherit property "CAPTURING_PHASE" with the proper type 
+PASS Event interface: new CustomEvent("foo") must inherit property "AT_TARGET" with the proper type 
+PASS Event interface: new CustomEvent("foo") must inherit property "BUBBLING_PHASE" with the proper type 
+PASS Event interface: new CustomEvent("foo") must inherit property "eventPhase" with the proper type 
+PASS Event interface: new CustomEvent("foo") must inherit property "stopPropagation()" with the proper type 
+PASS Event interface: new CustomEvent("foo") must inherit property "stopImmediatePropagation()" with the proper type 
+PASS Event interface: new CustomEvent("foo") must inherit property "bubbles" with the proper type 
+PASS Event interface: new CustomEvent("foo") must inherit property "cancelable" with the proper type 
+PASS Event interface: new CustomEvent("foo") must inherit property "preventDefault()" with the proper type 
+PASS Event interface: new CustomEvent("foo") must inherit property "defaultPrevented" with the proper type 
 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 Event interface: new CustomEvent("foo") must inherit property "timeStamp" with the proper type 
+PASS Event interface: new CustomEvent("foo") must inherit property "initEvent(DOMString, boolean, boolean)" with the proper type 
+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 
 PASS EventTarget interface: existence and properties of interface prototype object 
 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 addEventListener(DOMString, EventListener, [object Object],[object Object]) 
+PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, [object Object],[object Object]) 
 PASS EventTarget interface: operation dispatchEvent(Event) 
 FAIL EventTarget must be primary interface of new EventTarget() assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
 FAIL Stringification of new EventTarget() assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
-FAIL EventTarget interface: new EventTarget() 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 EventTarget() 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 EventTarget() 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 EventTarget() 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 EventTarget() 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: new EventTarget() must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 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 EventTarget() 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 EventTarget() must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 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 EventTarget() 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 EventTarget() must inherit property "dispatchEvent(Event)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
 FAIL EventTarget interface: calling dispatchEvent(Event) on new EventTarget() with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
 PASS EventListener interface: existence and properties of interface object 
 PASS EventListener interface: existence and properties of interface prototype object 
@@ -125,8 +125,8 @@
 FAIL AbortController interface: operation abort() assert_own_property: self does not have own property "AbortController" expected property "AbortController" missing
 FAIL AbortController must be primary interface of new AbortController() assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
 FAIL Stringification of new AbortController() assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
-FAIL AbortController interface: new AbortController() must inherit property "signal" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
-FAIL AbortController interface: new AbortController() must inherit property "abort" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
+FAIL AbortController interface: new AbortController() must inherit property "signal" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
+FAIL AbortController interface: new AbortController() must inherit property "abort()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
 FAIL AbortSignal interface: existence and properties of interface object assert_own_property: self does not have own property "AbortSignal" expected property "AbortSignal" missing
 FAIL AbortSignal interface object length assert_own_property: self does not have own property "AbortSignal" expected property "AbortSignal" missing
 FAIL AbortSignal interface object name assert_own_property: self does not have own property "AbortSignal" expected property "AbortSignal" missing
@@ -136,13 +136,13 @@
 FAIL AbortSignal interface: attribute onabort assert_own_property: self does not have own property "AbortSignal" expected property "AbortSignal" missing
 FAIL AbortSignal must be primary interface of new AbortController().signal assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
 FAIL Stringification of new AbortController().signal assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
-FAIL AbortSignal interface: new AbortController().signal must inherit property "aborted" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
-FAIL AbortSignal interface: new AbortController().signal must inherit property "onabort" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
-FAIL EventTarget interface: new AbortController().signal must inherit property "addEventListener" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
-FAIL EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on new AbortController().signal with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
-FAIL EventTarget interface: new AbortController().signal must inherit property "removeEventListener" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
-FAIL EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on new AbortController().signal with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
-FAIL EventTarget interface: new AbortController().signal must inherit property "dispatchEvent" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
+FAIL AbortSignal interface: new AbortController().signal must inherit property "aborted" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
+FAIL AbortSignal interface: new AbortController().signal must inherit property "onabort" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
+FAIL EventTarget interface: new AbortController().signal must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
+FAIL EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on new AbortController().signal with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
+FAIL EventTarget interface: new AbortController().signal must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
+FAIL EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on new AbortController().signal with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
+FAIL EventTarget interface: new AbortController().signal must inherit property "dispatchEvent(Event)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
 FAIL EventTarget interface: calling dispatchEvent(Event) on new AbortController().signal with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: AbortController is not defined"
 PASS NodeList interface: existence and properties of interface object 
 PASS NodeList interface object length 
@@ -153,9 +153,9 @@
 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: document.querySelectorAll("script") must inherit property "item(unsigned long)" with the proper type 
 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 NodeList interface: document.querySelectorAll("script") must inherit property "length" with the proper type 
 PASS HTMLCollection interface: existence and properties of interface object 
 PASS HTMLCollection interface object length 
 PASS HTMLCollection interface object name 
@@ -166,17 +166,17 @@
 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: document.body.children must inherit property "length" with the proper type 
+PASS HTMLCollection interface: document.body.children must inherit property "item(unsigned long)" with the proper type 
 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: document.body.children must inherit property "namedItem(DOMString)" with the proper type 
 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 
 PASS MutationObserver interface: existence and properties of interface prototype object 
 PASS MutationObserver interface: existence and properties of interface prototype object's "constructor" property 
-PASS MutationObserver interface: operation observe(Node,MutationObserverInit) 
+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 
@@ -259,9 +259,9 @@
 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 insertBefore(Node, Node) 
 PASS Node interface: operation appendChild(Node) 
-PASS Node interface: operation replaceChild(Node,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 
@@ -280,23 +280,23 @@
 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 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 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 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 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 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 
@@ -308,130 +308,130 @@
 PASS Document interface: operation querySelectorAll(DOMString) 
 PASS Document must be primary interface of new Document() 
 PASS Stringification of new Document() 
-PASS Document interface: new Document() must inherit property "implementation" with the proper type (0) 
-PASS Document interface: new Document() must inherit property "URL" with the proper type (1) 
-PASS Document interface: new Document() must inherit property "documentURI" with the proper type (2) 
-PASS Document interface: new Document() must inherit property "origin" with the proper type (3) 
-PASS Document interface: new Document() must inherit property "compatMode" with the proper type (4) 
-PASS Document interface: new Document() must inherit property "characterSet" with the proper type (5) 
-PASS Document interface: new Document() must inherit property "charset" with the proper type (6) 
-PASS Document interface: new Document() must inherit property "inputEncoding" with the proper type (7) 
-PASS Document interface: new Document() must inherit property "contentType" with the proper type (8) 
-PASS Document interface: new Document() must inherit property "doctype" with the proper type (9) 
-PASS Document interface: new Document() must inherit property "documentElement" with the proper type (10) 
-PASS Document interface: new Document() must inherit property "getElementsByTagName" with the proper type (11) 
+PASS Document interface: new Document() must inherit property "implementation" with the proper type 
+PASS Document interface: new Document() must inherit property "URL" with the proper type 
+PASS Document interface: new Document() must inherit property "documentURI" with the proper type 
+PASS Document interface: new Document() must inherit property "origin" with the proper type 
+PASS Document interface: new Document() must inherit property "compatMode" with the proper type 
+PASS Document interface: new Document() must inherit property "characterSet" with the proper type 
+PASS Document interface: new Document() must inherit property "charset" with the proper type 
+PASS Document interface: new Document() must inherit property "inputEncoding" with the proper type 
+PASS Document interface: new Document() must inherit property "contentType" with the proper type 
+PASS Document interface: new Document() must inherit property "doctype" with the proper type 
+PASS Document interface: new Document() must inherit property "documentElement" with the proper type 
+PASS Document interface: new Document() must inherit property "getElementsByTagName(DOMString)" with the proper type 
 PASS Document interface: calling getElementsByTagName(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "getElementsByTagNameNS" with the proper type (12) 
-PASS Document interface: calling getElementsByTagNameNS(DOMString,DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "getElementsByClassName" with the proper type (13) 
+PASS Document interface: new Document() must inherit property "getElementsByTagNameNS(DOMString, DOMString)" with the proper type 
+PASS Document interface: calling getElementsByTagNameNS(DOMString, DOMString) on new Document() with too few arguments must throw TypeError 
+PASS Document interface: new Document() must inherit property "getElementsByClassName(DOMString)" with the proper type 
 PASS Document interface: calling getElementsByClassName(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "createElement" with the proper type (14) 
-PASS Document interface: calling createElement(DOMString,ElementCreationOptions) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "createElementNS" with the proper type (15) 
-PASS Document interface: calling createElementNS(DOMString,DOMString,ElementCreationOptions) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "createDocumentFragment" with the proper type (16) 
-PASS Document interface: new Document() must inherit property "createTextNode" with the proper type (17) 
+PASS Document interface: new Document() must inherit property "createElement(DOMString, ElementCreationOptions)" with the proper type 
+PASS Document interface: calling createElement(DOMString, ElementCreationOptions) on new Document() with too few arguments must throw TypeError 
+PASS Document interface: new Document() must inherit property "createElementNS(DOMString, DOMString, ElementCreationOptions)" with the proper type 
+PASS Document interface: calling createElementNS(DOMString, DOMString, ElementCreationOptions) on new Document() with too few arguments must throw TypeError 
+PASS Document interface: new Document() must inherit property "createDocumentFragment()" with the proper type 
+PASS Document interface: new Document() must inherit property "createTextNode(DOMString)" with the proper type 
 PASS Document interface: calling createTextNode(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "createCDATASection" with the proper type (18) 
+PASS Document interface: new Document() must inherit property "createCDATASection(DOMString)" with the proper type 
 PASS Document interface: calling createCDATASection(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "createComment" with the proper type (19) 
+PASS Document interface: new Document() must inherit property "createComment(DOMString)" with the proper type 
 PASS Document interface: calling createComment(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "createProcessingInstruction" with the proper type (20) 
-PASS Document interface: calling createProcessingInstruction(DOMString,DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "importNode" with the proper type (21) 
-PASS Document interface: calling importNode(Node,boolean) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "adoptNode" with the proper type (22) 
+PASS Document interface: new Document() must inherit property "createProcessingInstruction(DOMString, DOMString)" with the proper type 
+PASS Document interface: calling createProcessingInstruction(DOMString, DOMString) on new Document() with too few arguments must throw TypeError 
+PASS Document interface: new Document() must inherit property "importNode(Node, boolean)" with the proper type 
+PASS Document interface: calling importNode(Node, boolean) on new Document() with too few arguments must throw TypeError 
+PASS Document interface: new Document() must inherit property "adoptNode(Node)" with the proper type 
 PASS Document interface: calling adoptNode(Node) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "createAttribute" with the proper type (23) 
+PASS Document interface: new Document() must inherit property "createAttribute(DOMString)" with the proper type 
 PASS Document interface: calling createAttribute(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "createAttributeNS" with the proper type (24) 
-PASS Document interface: calling createAttributeNS(DOMString,DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "createEvent" with the proper type (25) 
+PASS Document interface: new Document() must inherit property "createAttributeNS(DOMString, DOMString)" with the proper type 
+PASS Document interface: calling createAttributeNS(DOMString, DOMString) on new Document() with too few arguments must throw TypeError 
+PASS Document interface: new Document() must inherit property "createEvent(DOMString)" with the proper type 
 PASS Document interface: calling createEvent(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "createRange" with the proper type (26) 
-PASS Document interface: new Document() must inherit property "createNodeIterator" with the proper type (27) 
-PASS Document interface: calling createNodeIterator(Node,unsigned long,NodeFilter) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "createTreeWalker" with the proper type (28) 
-PASS Document interface: calling createTreeWalker(Node,unsigned long,NodeFilter) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "getElementById" with the proper type (29) 
+PASS Document interface: new Document() must inherit property "createRange()" with the proper type 
+PASS Document interface: new Document() must inherit property "createNodeIterator(Node, unsigned long, NodeFilter)" with the proper type 
+PASS Document interface: calling createNodeIterator(Node, unsigned long, NodeFilter) on new Document() with too few arguments must throw TypeError 
+PASS Document interface: new Document() must inherit property "createTreeWalker(Node, unsigned long, NodeFilter)" with the proper type 
+PASS Document interface: calling createTreeWalker(Node, unsigned long, NodeFilter) on new Document() with too few arguments must throw TypeError 
+PASS Document interface: new Document() must inherit property "getElementById(DOMString)" with the proper type 
 PASS Document interface: calling getElementById(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "children" with the proper type (30) 
-PASS Document interface: new Document() must inherit property "firstElementChild" with the proper type (31) 
-PASS Document interface: new Document() must inherit property "lastElementChild" with the proper type (32) 
-PASS Document interface: new Document() must inherit property "childElementCount" with the proper type (33) 
-PASS Document interface: new Document() must inherit property "prepend" with the proper type (34) 
+PASS Document interface: new Document() must inherit property "children" with the proper type 
+PASS Document interface: new Document() must inherit property "firstElementChild" with the proper type 
+PASS Document interface: new Document() must inherit property "lastElementChild" with the proper type 
+PASS Document interface: new Document() must inherit property "childElementCount" with the proper type 
+PASS Document interface: new Document() must inherit property "prepend([object Object],[object Object])" with the proper type 
 PASS Document interface: calling prepend([object Object],[object Object]) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "append" with the proper type (35) 
+PASS Document interface: new Document() must inherit property "append([object Object],[object Object])" with the proper type 
 PASS Document interface: calling append([object Object],[object Object]) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "querySelector" with the proper type (36) 
+PASS Document interface: new Document() must inherit property "querySelector(DOMString)" with the proper type 
 PASS Document interface: calling querySelector(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "querySelectorAll" with the proper type (37) 
+PASS Document interface: new Document() must inherit property "querySelectorAll(DOMString)" with the proper type 
 PASS Document interface: calling querySelectorAll(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Node interface: new Document() must inherit property "ELEMENT_NODE" with the proper type (0) 
-PASS Node interface: new Document() must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
-PASS Node interface: new Document() must inherit property "TEXT_NODE" with the proper type (2) 
-PASS Node interface: new Document() must inherit property "CDATA_SECTION_NODE" with the proper type (3) 
-PASS Node interface: new Document() must inherit property "ENTITY_REFERENCE_NODE" with the proper type (4) 
-PASS Node interface: new Document() must inherit property "ENTITY_NODE" with the proper type (5) 
-PASS Node interface: new Document() must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type (6) 
-PASS Node interface: new Document() must inherit property "COMMENT_NODE" with the proper type (7) 
-PASS Node interface: new Document() must inherit property "DOCUMENT_NODE" with the proper type (8) 
-PASS Node interface: new Document() must inherit property "DOCUMENT_TYPE_NODE" with the proper type (9) 
-PASS Node interface: new Document() must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type (10) 
-PASS Node interface: new Document() must inherit property "NOTATION_NODE" with the proper type (11) 
-PASS Node interface: new Document() must inherit property "nodeType" with the proper type (12) 
-PASS Node interface: new Document() must inherit property "nodeName" with the proper type (13) 
-PASS Node interface: new Document() must inherit property "baseURI" with the proper type (14) 
-PASS Node interface: new Document() must inherit property "isConnected" with the proper type (15) 
-PASS Node interface: new Document() must inherit property "ownerDocument" with the proper type (16) 
-PASS Node interface: new Document() must inherit property "getRootNode" with the proper type (17) 
+PASS Node interface: new Document() must inherit property "ELEMENT_NODE" with the proper type 
+PASS Node interface: new Document() must inherit property "ATTRIBUTE_NODE" with the proper type 
+PASS Node interface: new Document() must inherit property "TEXT_NODE" with the proper type 
+PASS Node interface: new Document() must inherit property "CDATA_SECTION_NODE" with the proper type 
+PASS Node interface: new Document() must inherit property "ENTITY_REFERENCE_NODE" with the proper type 
+PASS Node interface: new Document() must inherit property "ENTITY_NODE" with the proper type 
+PASS Node interface: new Document() must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type 
+PASS Node interface: new Document() must inherit property "COMMENT_NODE" with the proper type 
+PASS Node interface: new Document() must inherit property "DOCUMENT_NODE" with the proper type 
+PASS Node interface: new Document() must inherit property "DOCUMENT_TYPE_NODE" with the proper type 
+PASS Node interface: new Document() must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type 
+PASS Node interface: new Document() must inherit property "NOTATION_NODE" with the proper type 
+PASS Node interface: new Document() must inherit property "nodeType" with the proper type 
+PASS Node interface: new Document() must inherit property "nodeName" with the proper type 
+PASS Node interface: new Document() must inherit property "baseURI" with the proper type 
+PASS Node interface: new Document() must inherit property "isConnected" with the proper type 
+PASS Node interface: new Document() must inherit property "ownerDocument" with the proper type 
+PASS Node interface: new Document() must inherit property "getRootNode(GetRootNodeOptions)" with the proper type 
 PASS Node interface: calling getRootNode(GetRootNodeOptions) on new Document() with too few arguments must throw TypeError 
-PASS Node interface: new Document() must inherit property "parentNode" with the proper type (18) 
-PASS Node interface: new Document() must inherit property "parentElement" with the proper type (19) 
-PASS Node interface: new Document() must inherit property "hasChildNodes" with the proper type (20) 
-PASS Node interface: new Document() must inherit property "childNodes" with the proper type (21) 
-PASS Node interface: new Document() must inherit property "firstChild" with the proper type (22) 
-PASS Node interface: new Document() must inherit property "lastChild" with the proper type (23) 
-PASS Node interface: new Document() must inherit property "previousSibling" with the proper type (24) 
-PASS Node interface: new Document() must inherit property "nextSibling" with the proper type (25) 
-PASS Node interface: new Document() must inherit property "nodeValue" with the proper type (26) 
-PASS Node interface: new Document() must inherit property "textContent" with the proper type (27) 
-PASS Node interface: new Document() must inherit property "normalize" with the proper type (28) 
-PASS Node interface: new Document() must inherit property "cloneNode" with the proper type (29) 
+PASS Node interface: new Document() must inherit property "parentNode" with the proper type 
+PASS Node interface: new Document() must inherit property "parentElement" with the proper type 
+PASS Node interface: new Document() must inherit property "hasChildNodes()" with the proper type 
+PASS Node interface: new Document() must inherit property "childNodes" with the proper type 
+PASS Node interface: new Document() must inherit property "firstChild" with the proper type 
+PASS Node interface: new Document() must inherit property "lastChild" with the proper type 
+PASS Node interface: new Document() must inherit property "previousSibling" with the proper type 
+PASS Node interface: new Document() must inherit property "nextSibling" with the proper type 
+PASS Node interface: new Document() must inherit property "nodeValue" with the proper type 
+PASS Node interface: new Document() must inherit property "textContent" with the proper type 
+PASS Node interface: new Document() must inherit property "normalize()" with the proper type 
+PASS Node interface: new Document() must inherit property "cloneNode(boolean)" with the proper type 
 PASS Node interface: calling cloneNode(boolean) on new Document() with too few arguments must throw TypeError 
-PASS Node interface: new Document() must inherit property "isEqualNode" with the proper type (30) 
+PASS Node interface: new Document() must inherit property "isEqualNode(Node)" with the proper type 
 PASS Node interface: calling isEqualNode(Node) on new Document() with too few arguments must throw TypeError 
-PASS Node interface: new Document() must inherit property "isSameNode" with the proper type (31) 
+PASS Node interface: new Document() must inherit property "isSameNode(Node)" with the proper type 
 PASS Node interface: calling isSameNode(Node) on new Document() with too few arguments must throw TypeError 
-PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type (32) 
-PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type (33) 
-PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type (34) 
-PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type (35) 
-PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type (36) 
-PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type (37) 
-PASS Node interface: new Document() must inherit property "compareDocumentPosition" with the proper type (38) 
+PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type 
+PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type 
+PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type 
+PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type 
+PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type 
+PASS Node interface: new Document() must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type 
+PASS Node interface: new Document() must inherit property "compareDocumentPosition(Node)" with the proper type 
 PASS Node interface: calling compareDocumentPosition(Node) on new Document() with too few arguments must throw TypeError 
-PASS Node interface: new Document() must inherit property "contains" with the proper type (39) 
+PASS Node interface: new Document() must inherit property "contains(Node)" with the proper type 
 PASS Node interface: calling contains(Node) on new Document() with too few arguments must throw TypeError 
-PASS Node interface: new Document() must inherit property "lookupPrefix" with the proper type (40) 
+PASS Node interface: new Document() must inherit property "lookupPrefix(DOMString)" with the proper type 
 PASS Node interface: calling lookupPrefix(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Node interface: new Document() must inherit property "lookupNamespaceURI" with the proper type (41) 
+PASS Node interface: new Document() must inherit property "lookupNamespaceURI(DOMString)" with the proper type 
 PASS Node interface: calling lookupNamespaceURI(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Node interface: new Document() must inherit property "isDefaultNamespace" with the proper type (42) 
+PASS Node interface: new Document() must inherit property "isDefaultNamespace(DOMString)" with the proper type 
 PASS Node interface: calling isDefaultNamespace(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Node interface: new Document() must inherit property "insertBefore" with the proper type (43) 
-PASS Node interface: calling insertBefore(Node,Node) on new Document() with too few arguments must throw TypeError 
-PASS Node interface: new Document() must inherit property "appendChild" with the proper type (44) 
+PASS Node interface: new Document() must inherit property "insertBefore(Node, Node)" with the proper type 
+PASS Node interface: calling insertBefore(Node, Node) on new Document() with too few arguments must throw TypeError 
+PASS Node interface: new Document() must inherit property "appendChild(Node)" with the proper type 
 PASS Node interface: calling appendChild(Node) on new Document() with too few arguments must throw TypeError 
-PASS Node interface: new Document() must inherit property "replaceChild" with the proper type (45) 
-PASS Node interface: calling replaceChild(Node,Node) on new Document() with too few arguments must throw TypeError 
-PASS Node interface: new Document() must inherit property "removeChild" with the proper type (46) 
+PASS Node interface: new Document() must inherit property "replaceChild(Node, Node)" with the proper type 
+PASS Node interface: calling replaceChild(Node, Node) on new Document() with too few arguments must throw TypeError 
+PASS Node interface: new Document() must inherit property "removeChild(Node)" with the proper type 
 PASS Node interface: calling removeChild(Node) on new Document() with too few arguments must throw TypeError 
-PASS EventTarget interface: new Document() must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on new Document() with too few arguments must throw TypeError 
-PASS EventTarget interface: new Document() must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on new Document() with too few arguments must throw TypeError 
-PASS EventTarget interface: new Document() must inherit property "dispatchEvent" with the proper type (2) 
+PASS EventTarget interface: new Document() must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on new Document() with too few arguments must throw TypeError 
+PASS EventTarget interface: new Document() must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on new Document() with too few arguments must throw TypeError 
+PASS EventTarget interface: new Document() must inherit property "dispatchEvent(Event)" with the proper type 
 PASS EventTarget interface: calling dispatchEvent(Event) on new Document() with too few arguments must throw TypeError 
 PASS XMLDocument interface: existence and properties of interface object 
 PASS XMLDocument interface object length 
@@ -440,149 +440,149 @@
 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) 
-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) 
-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: xmlDoc must inherit property "implementation" with the proper type 
+PASS Document interface: xmlDoc must inherit property "URL" with the proper type 
+PASS Document interface: xmlDoc must inherit property "documentURI" with the proper type 
+PASS Document interface: xmlDoc must inherit property "origin" with the proper type 
+PASS Document interface: xmlDoc must inherit property "compatMode" with the proper type 
+PASS Document interface: xmlDoc must inherit property "characterSet" with the proper type 
+PASS Document interface: xmlDoc must inherit property "charset" with the proper type 
+PASS Document interface: xmlDoc must inherit property "inputEncoding" with the proper type 
+PASS Document interface: xmlDoc must inherit property "contentType" with the proper type 
+PASS Document interface: xmlDoc must inherit property "doctype" with the proper type 
+PASS Document interface: xmlDoc must inherit property "documentElement" with the proper type 
+PASS Document interface: xmlDoc must inherit property "getElementsByTagName(DOMString)" with the proper type 
 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: xmlDoc must inherit property "getElementsByTagNameNS(DOMString, DOMString)" with the proper type 
+PASS Document interface: calling getElementsByTagNameNS(DOMString, DOMString) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "getElementsByClassName(DOMString)" with the proper type 
 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: xmlDoc must inherit property "createElement(DOMString, ElementCreationOptions)" with the proper type 
+PASS Document interface: calling createElement(DOMString, ElementCreationOptions) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "createElementNS(DOMString, DOMString, ElementCreationOptions)" with the proper type 
+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 
+PASS Document interface: xmlDoc must inherit property "createTextNode(DOMString)" with the proper type 
 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: xmlDoc must inherit property "createCDATASection(DOMString)" with the proper type 
 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: xmlDoc must inherit property "createComment(DOMString)" with the proper type 
 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: xmlDoc must inherit property "createProcessingInstruction(DOMString, DOMString)" with the proper type 
+PASS Document interface: calling createProcessingInstruction(DOMString, DOMString) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "importNode(Node, boolean)" with the proper type 
+PASS Document interface: calling importNode(Node, boolean) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "adoptNode(Node)" with the proper type 
 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: xmlDoc must inherit property "createAttribute(DOMString)" with the proper type 
 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: xmlDoc must inherit property "createAttributeNS(DOMString, DOMString)" with the proper type 
+PASS Document interface: calling createAttributeNS(DOMString, DOMString) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "createEvent(DOMString)" with the proper type 
 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: xmlDoc must inherit property "createRange()" with the proper type 
+PASS Document interface: xmlDoc must inherit property "createNodeIterator(Node, unsigned long, NodeFilter)" with the proper type 
+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(Node, unsigned long, NodeFilter)" with the proper type 
+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(DOMString)" with the proper type 
 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: xmlDoc must inherit property "children" with the proper type 
+PASS Document interface: xmlDoc must inherit property "firstElementChild" with the proper type 
+PASS Document interface: xmlDoc must inherit property "lastElementChild" with the proper type 
+PASS Document interface: xmlDoc must inherit property "childElementCount" with the proper type 
+PASS Document interface: xmlDoc must inherit property "prepend([object Object],[object Object])" with the proper type 
 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: xmlDoc must inherit property "append([object Object],[object Object])" with the proper type 
 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: xmlDoc must inherit property "querySelector(DOMString)" with the proper type 
 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: xmlDoc must inherit property "querySelectorAll(DOMString)" with the proper type 
 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) 
-PASS Node interface: xmlDoc must inherit property "baseURI" with the proper type (14) 
-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: xmlDoc must inherit property "ELEMENT_NODE" with the proper type 
+PASS Node interface: xmlDoc must inherit property "ATTRIBUTE_NODE" with the proper type 
+PASS Node interface: xmlDoc must inherit property "TEXT_NODE" with the proper type 
+PASS Node interface: xmlDoc must inherit property "CDATA_SECTION_NODE" with the proper type 
+PASS Node interface: xmlDoc must inherit property "ENTITY_REFERENCE_NODE" with the proper type 
+PASS Node interface: xmlDoc must inherit property "ENTITY_NODE" with the proper type 
+PASS Node interface: xmlDoc must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type 
+PASS Node interface: xmlDoc must inherit property "COMMENT_NODE" with the proper type 
+PASS Node interface: xmlDoc must inherit property "DOCUMENT_NODE" with the proper type 
+PASS Node interface: xmlDoc must inherit property "DOCUMENT_TYPE_NODE" with the proper type 
+PASS Node interface: xmlDoc must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type 
+PASS Node interface: xmlDoc must inherit property "NOTATION_NODE" with the proper type 
+PASS Node interface: xmlDoc must inherit property "nodeType" with the proper type 
+PASS Node interface: xmlDoc must inherit property "nodeName" with the proper type 
+PASS Node interface: xmlDoc must inherit property "baseURI" with the proper type 
+PASS Node interface: xmlDoc must inherit property "isConnected" with the proper type 
+PASS Node interface: xmlDoc must inherit property "ownerDocument" with the proper type 
+PASS Node interface: xmlDoc must inherit property "getRootNode(GetRootNodeOptions)" with the proper type 
 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: xmlDoc must inherit property "parentNode" with the proper type 
+PASS Node interface: xmlDoc must inherit property "parentElement" with the proper type 
+PASS Node interface: xmlDoc must inherit property "hasChildNodes()" with the proper type 
+PASS Node interface: xmlDoc must inherit property "childNodes" with the proper type 
+PASS Node interface: xmlDoc must inherit property "firstChild" with the proper type 
+PASS Node interface: xmlDoc must inherit property "lastChild" with the proper type 
+PASS Node interface: xmlDoc must inherit property "previousSibling" with the proper type 
+PASS Node interface: xmlDoc must inherit property "nextSibling" with the proper type 
+PASS Node interface: xmlDoc must inherit property "nodeValue" with the proper type 
+PASS Node interface: xmlDoc must inherit property "textContent" with the proper type 
+PASS Node interface: xmlDoc must inherit property "normalize()" with the proper type 
+PASS Node interface: xmlDoc must inherit property "cloneNode(boolean)" with the proper type 
 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: xmlDoc must inherit property "isEqualNode(Node)" with the proper type 
 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: xmlDoc must inherit property "isSameNode(Node)" with the proper type 
 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: xmlDoc must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type 
+PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type 
+PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type 
+PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type 
+PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type 
+PASS Node interface: xmlDoc must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type 
+PASS Node interface: xmlDoc must inherit property "compareDocumentPosition(Node)" with the proper type 
 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: xmlDoc must inherit property "contains(Node)" with the proper type 
 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: xmlDoc must inherit property "lookupPrefix(DOMString)" with the proper type 
 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: xmlDoc must inherit property "lookupNamespaceURI(DOMString)" with the proper type 
 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: xmlDoc must inherit property "isDefaultNamespace(DOMString)" with the proper type 
 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: xmlDoc must inherit property "insertBefore(Node, Node)" with the proper type 
+PASS Node interface: calling insertBefore(Node, Node) on xmlDoc with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc must inherit property "appendChild(Node)" with the proper type 
 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: xmlDoc must inherit property "replaceChild(Node, Node)" with the proper type 
+PASS Node interface: calling replaceChild(Node, Node) on xmlDoc with too few arguments must throw TypeError 
+PASS Node interface: xmlDoc must inherit property "removeChild(Node)" with the proper type 
 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: xmlDoc must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+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(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+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(Event)" with the proper type 
 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 
 PASS DOMImplementation interface: existence and properties of interface prototype object 
 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 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: document.implementation must inherit property "createDocumentType(DOMString, DOMString, DOMString)" with the proper type 
+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(DOMString, DOMString, DocumentType)" with the proper type 
+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(DOMString)" with the proper type 
 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 DOMImplementation interface: document.implementation must inherit property "hasFeature()" with the proper type 
 PASS DocumentType interface: existence and properties of interface object 
 PASS DocumentType interface object length 
 PASS DocumentType interface object name 
@@ -597,81 +597,81 @@
 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: document.doctype must inherit property "name" with the proper type 
+PASS DocumentType interface: document.doctype must inherit property "publicId" with the proper type 
+PASS DocumentType interface: document.doctype must inherit property "systemId" with the proper type 
+PASS DocumentType interface: document.doctype must inherit property "before([object Object],[object Object])" with the proper type 
 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: document.doctype must inherit property "after([object Object],[object Object])" with the proper type 
 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: document.doctype must inherit property "replaceWith([object Object],[object Object])" with the proper type 
 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 DocumentType interface: document.doctype must inherit property "remove()" with the proper type 
+PASS Node interface: document.doctype must inherit property "ELEMENT_NODE" with the proper type 
+PASS Node interface: document.doctype must inherit property "ATTRIBUTE_NODE" with the proper type 
+PASS Node interface: document.doctype must inherit property "TEXT_NODE" with the proper type 
+PASS Node interface: document.doctype must inherit property "CDATA_SECTION_NODE" with the proper type 
+PASS Node interface: document.doctype must inherit property "ENTITY_REFERENCE_NODE" with the proper type 
+PASS Node interface: document.doctype must inherit property "ENTITY_NODE" with the proper type 
+PASS Node interface: document.doctype must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type 
+PASS Node interface: document.doctype must inherit property "COMMENT_NODE" with the proper type 
+PASS Node interface: document.doctype must inherit property "DOCUMENT_NODE" with the proper type 
+PASS Node interface: document.doctype must inherit property "DOCUMENT_TYPE_NODE" with the proper type 
+PASS Node interface: document.doctype must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type 
+PASS Node interface: document.doctype must inherit property "NOTATION_NODE" with the proper type 
+PASS Node interface: document.doctype must inherit property "nodeType" with the proper type 
+PASS Node interface: document.doctype must inherit property "nodeName" with the proper type 
+PASS Node interface: document.doctype must inherit property "baseURI" with the proper type 
+PASS Node interface: document.doctype must inherit property "isConnected" with the proper type 
+PASS Node interface: document.doctype must inherit property "ownerDocument" with the proper type 
+PASS Node interface: document.doctype must inherit property "getRootNode(GetRootNodeOptions)" with the proper type 
 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: document.doctype must inherit property "parentNode" with the proper type 
+PASS Node interface: document.doctype must inherit property "parentElement" with the proper type 
+PASS Node interface: document.doctype must inherit property "hasChildNodes()" with the proper type 
+PASS Node interface: document.doctype must inherit property "childNodes" with the proper type 
+PASS Node interface: document.doctype must inherit property "firstChild" with the proper type 
+PASS Node interface: document.doctype must inherit property "lastChild" with the proper type 
+PASS Node interface: document.doctype must inherit property "previousSibling" with the proper type 
+PASS Node interface: document.doctype must inherit property "nextSibling" with the proper type 
+PASS Node interface: document.doctype must inherit property "nodeValue" with the proper type 
+PASS Node interface: document.doctype must inherit property "textContent" with the proper type 
+PASS Node interface: document.doctype must inherit property "normalize()" with the proper type 
+PASS Node interface: document.doctype must inherit property "cloneNode(boolean)" with the proper type 
 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: document.doctype must inherit property "isEqualNode(Node)" with the proper type 
 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: document.doctype must inherit property "isSameNode(Node)" with the proper type 
 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: document.doctype must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type 
+PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type 
+PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type 
+PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type 
+PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type 
+PASS Node interface: document.doctype must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type 
+PASS Node interface: document.doctype must inherit property "compareDocumentPosition(Node)" with the proper type 
 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: document.doctype must inherit property "contains(Node)" with the proper type 
 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: document.doctype must inherit property "lookupPrefix(DOMString)" with the proper type 
 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: document.doctype must inherit property "lookupNamespaceURI(DOMString)" with the proper type 
 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: document.doctype must inherit property "isDefaultNamespace(DOMString)" with the proper type 
 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: document.doctype must inherit property "insertBefore(Node, Node)" with the proper type 
+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(Node)" with the proper type 
 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: document.doctype must inherit property "replaceChild(Node, Node)" with the proper type 
+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(Node)" with the proper type 
 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: document.doctype must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+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(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+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(Event)" with the proper type 
 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 
@@ -689,85 +689,85 @@
 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: document.createDocumentFragment() must inherit property "getElementById(DOMString)" with the proper type 
 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: document.createDocumentFragment() must inherit property "children" with the proper type 
+PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "firstElementChild" with the proper type 
+PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "lastElementChild" with the proper type 
+PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "childElementCount" with the proper type 
+PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "prepend([object Object],[object Object])" with the proper type 
 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: document.createDocumentFragment() must inherit property "append([object Object],[object Object])" with the proper type 
 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: document.createDocumentFragment() must inherit property "querySelector(DOMString)" with the proper type 
 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: document.createDocumentFragment() must inherit property "querySelectorAll(DOMString)" with the proper type 
 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: document.createDocumentFragment() must inherit property "ELEMENT_NODE" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "ATTRIBUTE_NODE" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "TEXT_NODE" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "CDATA_SECTION_NODE" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "ENTITY_REFERENCE_NODE" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "ENTITY_NODE" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "COMMENT_NODE" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_NODE" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_TYPE_NODE" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "NOTATION_NODE" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "nodeType" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "nodeName" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "baseURI" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "isConnected" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "ownerDocument" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "getRootNode(GetRootNodeOptions)" with the proper type 
 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: document.createDocumentFragment() must inherit property "parentNode" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "parentElement" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "hasChildNodes()" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "childNodes" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "firstChild" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "lastChild" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "previousSibling" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "nextSibling" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "nodeValue" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "textContent" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "normalize()" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "cloneNode(boolean)" with the proper type 
 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: document.createDocumentFragment() must inherit property "isEqualNode(Node)" with the proper type 
 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: document.createDocumentFragment() must inherit property "isSameNode(Node)" with the proper type 
 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: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type 
+PASS Node interface: document.createDocumentFragment() must inherit property "compareDocumentPosition(Node)" with the proper type 
 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: document.createDocumentFragment() must inherit property "contains(Node)" with the proper type 
 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: document.createDocumentFragment() must inherit property "lookupPrefix(DOMString)" with the proper type 
 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: document.createDocumentFragment() must inherit property "lookupNamespaceURI(DOMString)" with the proper type 
 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: document.createDocumentFragment() must inherit property "isDefaultNamespace(DOMString)" with the proper type 
 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: document.createDocumentFragment() must inherit property "insertBefore(Node, Node)" with the proper type 
+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(Node)" with the proper type 
 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: document.createDocumentFragment() must inherit property "replaceChild(Node, Node)" with the proper type 
+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(Node)" with the proper type 
 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: document.createDocumentFragment() must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+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(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+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(Event)" with the proper type 
 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 
@@ -793,15 +793,15 @@
 PASS Element interface: attribute attributes 
 PASS Element interface: operation getAttributeNames() 
 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 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 removeAttributeNS(DOMString, DOMString) 
 PASS Element interface: operation hasAttribute(DOMString) 
-PASS Element interface: operation hasAttributeNS(DOMString,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 getAttributeNodeNS(DOMString, DOMString) 
 PASS Element interface: operation setAttributeNode(Attr) 
 PASS Element interface: operation setAttributeNodeNS(Attr) 
 PASS Element interface: operation removeAttributeNode(Attr) 
@@ -811,10 +811,10 @@
 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 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: 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 
@@ -832,149 +832,149 @@
 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) 
-PASS Element interface: element must inherit property "getAttributeNames" with the proper type (10) 
-PASS Element interface: element must inherit property "getAttribute" with the proper type (11) 
+PASS Element interface: element must inherit property "namespaceURI" with the proper type 
+PASS Element interface: element must inherit property "prefix" with the proper type 
+PASS Element interface: element must inherit property "localName" with the proper type 
+PASS Element interface: element must inherit property "tagName" with the proper type 
+PASS Element interface: element must inherit property "id" with the proper type 
+PASS Element interface: element must inherit property "className" with the proper type 
+PASS Element interface: element must inherit property "classList" with the proper type 
+PASS Element interface: element must inherit property "slot" with the proper type 
+PASS Element interface: element must inherit property "hasAttributes()" with the proper type 
+PASS Element interface: element must inherit property "attributes" with the proper type 
+PASS Element interface: element must inherit property "getAttributeNames()" with the proper type 
+PASS Element interface: element must inherit property "getAttribute(DOMString)" with the proper type 
 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: element must inherit property "getAttributeNS(DOMString, DOMString)" with the proper type 
+PASS Element interface: calling getAttributeNS(DOMString, DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "setAttribute(DOMString, DOMString)" with the proper type 
+PASS Element interface: calling setAttribute(DOMString, DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "setAttributeNS(DOMString, DOMString, DOMString)" with the proper type 
+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(DOMString)" with the proper type 
 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: element must inherit property "removeAttributeNS(DOMString, DOMString)" with the proper type 
+PASS Element interface: calling removeAttributeNS(DOMString, DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "hasAttribute(DOMString)" with the proper type 
 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: element must inherit property "hasAttributeNS(DOMString, DOMString)" with the proper type 
+PASS Element interface: calling hasAttributeNS(DOMString, DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "getAttributeNode(DOMString)" with the proper type 
 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: element must inherit property "getAttributeNodeNS(DOMString, DOMString)" with the proper type 
+PASS Element interface: calling getAttributeNodeNS(DOMString, DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "setAttributeNode(Attr)" with the proper type 
 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: element must inherit property "setAttributeNodeNS(Attr)" with the proper type 
 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: element must inherit property "removeAttributeNode(Attr)" with the proper type 
 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: element must inherit property "attachShadow(ShadowRootInit)" with the proper type 
 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: element must inherit property "shadowRoot" with the proper type 
+PASS Element interface: element must inherit property "closest(DOMString)" with the proper type 
 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: element must inherit property "matches(DOMString)" with the proper type 
 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: element must inherit property "webkitMatchesSelector(DOMString)" with the proper type 
 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: element must inherit property "getElementsByTagName(DOMString)" with the proper type 
 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: element must inherit property "getElementsByTagNameNS(DOMString, DOMString)" with the proper type 
+PASS Element interface: calling getElementsByTagNameNS(DOMString, DOMString) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "getElementsByClassName(DOMString)" with the proper type 
 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: element must inherit property "insertAdjacentElement(DOMString, Element)" with the proper type 
+PASS Element interface: calling insertAdjacentElement(DOMString, Element) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "insertAdjacentText(DOMString, DOMString)" with the proper type 
+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 
+PASS Element interface: element must inherit property "firstElementChild" with the proper type 
+PASS Element interface: element must inherit property "lastElementChild" with the proper type 
+PASS Element interface: element must inherit property "childElementCount" with the proper type 
+PASS Element interface: element must inherit property "prepend([object Object],[object Object])" with the proper type 
 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: element must inherit property "append([object Object],[object Object])" with the proper type 
 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: element must inherit property "querySelector(DOMString)" with the proper type 
 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: element must inherit property "querySelectorAll(DOMString)" with the proper type 
 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: element must inherit property "previousElementSibling" with the proper type 
+PASS Element interface: element must inherit property "nextElementSibling" with the proper type 
+PASS Element interface: element must inherit property "before([object Object],[object Object])" with the proper type 
 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: element must inherit property "after([object Object],[object Object])" with the proper type 
 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: element must inherit property "replaceWith([object Object],[object Object])" with the proper type 
 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) 
-PASS Node interface: element must inherit property "baseURI" with the proper type (14) 
-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 Element interface: element must inherit property "remove()" with the proper type 
+PASS Element interface: element must inherit property "assignedSlot" with the proper type 
+PASS Node interface: element must inherit property "ELEMENT_NODE" with the proper type 
+PASS Node interface: element must inherit property "ATTRIBUTE_NODE" with the proper type 
+PASS Node interface: element must inherit property "TEXT_NODE" with the proper type 
+PASS Node interface: element must inherit property "CDATA_SECTION_NODE" with the proper type 
+PASS Node interface: element must inherit property "ENTITY_REFERENCE_NODE" with the proper type 
+PASS Node interface: element must inherit property "ENTITY_NODE" with the proper type 
+PASS Node interface: element must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type 
+PASS Node interface: element must inherit property "COMMENT_NODE" with the proper type 
+PASS Node interface: element must inherit property "DOCUMENT_NODE" with the proper type 
+PASS Node interface: element must inherit property "DOCUMENT_TYPE_NODE" with the proper type 
+PASS Node interface: element must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type 
+PASS Node interface: element must inherit property "NOTATION_NODE" with the proper type 
+PASS Node interface: element must inherit property "nodeType" with the proper type 
+PASS Node interface: element must inherit property "nodeName" with the proper type 
+PASS Node interface: element must inherit property "baseURI" with the proper type 
+PASS Node interface: element must inherit property "isConnected" with the proper type 
+PASS Node interface: element must inherit property "ownerDocument" with the proper type 
+PASS Node interface: element must inherit property "getRootNode(GetRootNodeOptions)" with the proper type 
 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: element must inherit property "parentNode" with the proper type 
+PASS Node interface: element must inherit property "parentElement" with the proper type 
+PASS Node interface: element must inherit property "hasChildNodes()" with the proper type 
+PASS Node interface: element must inherit property "childNodes" with the proper type 
+PASS Node interface: element must inherit property "firstChild" with the proper type 
+PASS Node interface: element must inherit property "lastChild" with the proper type 
+PASS Node interface: element must inherit property "previousSibling" with the proper type 
+PASS Node interface: element must inherit property "nextSibling" with the proper type 
+PASS Node interface: element must inherit property "nodeValue" with the proper type 
+PASS Node interface: element must inherit property "textContent" with the proper type 
+PASS Node interface: element must inherit property "normalize()" with the proper type 
+PASS Node interface: element must inherit property "cloneNode(boolean)" with the proper type 
 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: element must inherit property "isEqualNode(Node)" with the proper type 
 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: element must inherit property "isSameNode(Node)" with the proper type 
 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: element must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type 
+PASS Node interface: element must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type 
+PASS Node interface: element must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type 
+PASS Node interface: element must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type 
+PASS Node interface: element must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type 
+PASS Node interface: element must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type 
+PASS Node interface: element must inherit property "compareDocumentPosition(Node)" with the proper type 
 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: element must inherit property "contains(Node)" with the proper type 
 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: element must inherit property "lookupPrefix(DOMString)" with the proper type 
 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: element must inherit property "lookupNamespaceURI(DOMString)" with the proper type 
 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: element must inherit property "isDefaultNamespace(DOMString)" with the proper type 
 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: element must inherit property "insertBefore(Node, Node)" with the proper type 
+PASS Node interface: calling insertBefore(Node, Node) on element with too few arguments must throw TypeError 
+PASS Node interface: element must inherit property "appendChild(Node)" with the proper type 
 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: element must inherit property "replaceChild(Node, Node)" with the proper type 
+PASS Node interface: calling replaceChild(Node, Node) on element with too few arguments must throw TypeError 
+PASS Node interface: element must inherit property "removeChild(Node)" with the proper type 
 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: element must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+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(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+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(Event)" with the proper type 
 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 
@@ -984,11 +984,11 @@
 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 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 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 
@@ -1003,78 +1003,78 @@
 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 Attr interface: document.querySelector("[id]").attributes[0] must inherit property "namespaceURI" with the proper type 
+PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "prefix" with the proper type 
+PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "localName" with the proper type 
+PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "name" with the proper type 
+PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "value" with the proper type 
+PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "ownerElement" with the proper type 
+PASS Attr interface: document.querySelector("[id]").attributes[0] must inherit property "specified" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ELEMENT_NODE" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ATTRIBUTE_NODE" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "TEXT_NODE" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "CDATA_SECTION_NODE" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ENTITY_REFERENCE_NODE" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ENTITY_NODE" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "COMMENT_NODE" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_NODE" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_TYPE_NODE" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "NOTATION_NODE" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeType" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeName" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "baseURI" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "isConnected" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "ownerDocument" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "getRootNode(GetRootNodeOptions)" with the proper type 
 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: document.querySelector("[id]").attributes[0] must inherit property "parentNode" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "parentElement" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "hasChildNodes()" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "childNodes" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "firstChild" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "lastChild" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "previousSibling" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nextSibling" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "nodeValue" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "textContent" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "normalize()" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "cloneNode(boolean)" with the proper type 
 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: document.querySelector("[id]").attributes[0] must inherit property "isEqualNode(Node)" with the proper type 
 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: document.querySelector("[id]").attributes[0] must inherit property "isSameNode(Node)" with the proper type 
 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: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type 
+PASS Node interface: document.querySelector("[id]").attributes[0] must inherit property "compareDocumentPosition(Node)" with the proper type 
 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: document.querySelector("[id]").attributes[0] must inherit property "contains(Node)" with the proper type 
 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: document.querySelector("[id]").attributes[0] must inherit property "lookupPrefix(DOMString)" with the proper type 
 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: document.querySelector("[id]").attributes[0] must inherit property "lookupNamespaceURI(DOMString)" with the proper type 
 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: document.querySelector("[id]").attributes[0] must inherit property "isDefaultNamespace(DOMString)" with the proper type 
 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: document.querySelector("[id]").attributes[0] must inherit property "insertBefore(Node, Node)" with the proper type 
+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(Node)" with the proper type 
 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: document.querySelector("[id]").attributes[0] must inherit property "replaceChild(Node, Node)" with the proper type 
+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(Node)" with the proper type 
 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: document.querySelector("[id]").attributes[0] must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+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(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+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(Event)" with the proper type 
 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 
@@ -1083,11 +1083,11 @@
 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 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: 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]) 
@@ -1104,96 +1104,96 @@
 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: document.createTextNode("abc") must inherit property "splitText(unsigned long)" with the proper type 
 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 Text interface: document.createTextNode("abc") must inherit property "wholeText" with the proper type 
+PASS Text interface: document.createTextNode("abc") must inherit property "assignedSlot" with the proper type 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "data" with the proper type 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "length" with the proper type 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "substringData(unsigned long, unsigned long)" with the proper type 
+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(DOMString)" with the proper type 
 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: document.createTextNode("abc") must inherit property "insertData(unsigned long, DOMString)" with the proper type 
+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(unsigned long, unsigned long)" with the proper type 
+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(unsigned long, unsigned long, DOMString)" with the proper type 
+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 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "nextElementSibling" with the proper type 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "before([object Object],[object Object])" with the proper type 
 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: document.createTextNode("abc") must inherit property "after([object Object],[object Object])" with the proper type 
 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: document.createTextNode("abc") must inherit property "replaceWith([object Object],[object Object])" with the proper type 
 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 CharacterData interface: document.createTextNode("abc") must inherit property "remove()" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "ELEMENT_NODE" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "ATTRIBUTE_NODE" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "TEXT_NODE" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "CDATA_SECTION_NODE" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "ENTITY_REFERENCE_NODE" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "ENTITY_NODE" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "COMMENT_NODE" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_NODE" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_TYPE_NODE" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "NOTATION_NODE" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "nodeType" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "nodeName" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "baseURI" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "isConnected" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "ownerDocument" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "getRootNode(GetRootNodeOptions)" with the proper type 
 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: document.createTextNode("abc") must inherit property "parentNode" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "parentElement" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "hasChildNodes()" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "childNodes" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "firstChild" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "lastChild" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "previousSibling" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "nextSibling" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "nodeValue" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "textContent" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "normalize()" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "cloneNode(boolean)" with the proper type 
 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: document.createTextNode("abc") must inherit property "isEqualNode(Node)" with the proper type 
 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: document.createTextNode("abc") must inherit property "isSameNode(Node)" with the proper type 
 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: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type 
+PASS Node interface: document.createTextNode("abc") must inherit property "compareDocumentPosition(Node)" with the proper type 
 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: document.createTextNode("abc") must inherit property "contains(Node)" with the proper type 
 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: document.createTextNode("abc") must inherit property "lookupPrefix(DOMString)" with the proper type 
 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: document.createTextNode("abc") must inherit property "lookupNamespaceURI(DOMString)" with the proper type 
 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: document.createTextNode("abc") must inherit property "isDefaultNamespace(DOMString)" with the proper type 
 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: document.createTextNode("abc") must inherit property "insertBefore(Node, Node)" with the proper type 
+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(Node)" with the proper type 
 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: document.createTextNode("abc") must inherit property "replaceChild(Node, Node)" with the proper type 
+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(Node)" with the proper type 
 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: document.createTextNode("abc") must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+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(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+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(Event)" with the proper type 
 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 
@@ -1208,93 +1208,93 @@
 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 ProcessingInstruction interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "target" with the proper type 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "data" with the proper type 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "length" with the proper type 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "substringData(unsigned long, unsigned long)" with the proper type 
+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(DOMString)" with the proper type 
 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: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "insertData(unsigned long, DOMString)" with the proper type 
+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(unsigned long, unsigned long)" with the proper type 
+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(unsigned long, unsigned long, DOMString)" with the proper type 
+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 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nextElementSibling" with the proper type 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "before([object Object],[object Object])" with the proper type 
 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: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "after([object Object],[object Object])" with the proper type 
 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: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceWith([object Object],[object Object])" with the proper type 
 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) 
-PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "baseURI" with the proper type (14) 
-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 CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "remove()" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ELEMENT_NODE" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ATTRIBUTE_NODE" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "TEXT_NODE" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "CDATA_SECTION_NODE" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ENTITY_REFERENCE_NODE" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ENTITY_NODE" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "COMMENT_NODE" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_NODE" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_TYPE_NODE" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "NOTATION_NODE" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeType" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeName" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "baseURI" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isConnected" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ownerDocument" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "getRootNode(GetRootNodeOptions)" with the proper type 
 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: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "parentNode" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "parentElement" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "hasChildNodes()" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "childNodes" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "firstChild" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lastChild" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "previousSibling" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nextSibling" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nodeValue" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "textContent" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "normalize()" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "cloneNode(boolean)" with the proper type 
 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: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isEqualNode(Node)" with the proper type 
 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: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isSameNode(Node)" with the proper type 
 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: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type 
+PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "compareDocumentPosition(Node)" with the proper type 
 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: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "contains(Node)" with the proper type 
 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: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lookupPrefix(DOMString)" with the proper type 
 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: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "lookupNamespaceURI(DOMString)" with the proper type 
 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: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isDefaultNamespace(DOMString)" with the proper type 
 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: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "insertBefore(Node, Node)" with the proper type 
+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(Node)" with the proper type 
 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: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceChild(Node, Node)" with the proper type 
+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(Node)" with the proper type 
 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: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+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(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+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(Event)" with the proper type 
 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 
@@ -1303,92 +1303,92 @@
 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: document.createComment("abc") must inherit property "data" with the proper type 
+PASS CharacterData interface: document.createComment("abc") must inherit property "length" with the proper type 
+PASS CharacterData interface: document.createComment("abc") must inherit property "substringData(unsigned long, unsigned long)" with the proper type 
+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(DOMString)" with the proper type 
 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: document.createComment("abc") must inherit property "insertData(unsigned long, DOMString)" with the proper type 
+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(unsigned long, unsigned long)" with the proper type 
+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(unsigned long, unsigned long, DOMString)" with the proper type 
+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 
+PASS CharacterData interface: document.createComment("abc") must inherit property "nextElementSibling" with the proper type 
+PASS CharacterData interface: document.createComment("abc") must inherit property "before([object Object],[object Object])" with the proper type 
 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: document.createComment("abc") must inherit property "after([object Object],[object Object])" with the proper type 
 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: document.createComment("abc") must inherit property "replaceWith([object Object],[object Object])" with the proper type 
 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 CharacterData interface: document.createComment("abc") must inherit property "remove()" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "ELEMENT_NODE" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "ATTRIBUTE_NODE" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "TEXT_NODE" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "CDATA_SECTION_NODE" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "ENTITY_REFERENCE_NODE" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "ENTITY_NODE" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "COMMENT_NODE" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_NODE" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_TYPE_NODE" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "NOTATION_NODE" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "nodeType" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "nodeName" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "baseURI" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "isConnected" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "ownerDocument" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "getRootNode(GetRootNodeOptions)" with the proper type 
 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: document.createComment("abc") must inherit property "parentNode" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "parentElement" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "hasChildNodes()" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "childNodes" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "firstChild" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "lastChild" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "previousSibling" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "nextSibling" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "nodeValue" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "textContent" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "normalize()" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "cloneNode(boolean)" with the proper type 
 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: document.createComment("abc") must inherit property "isEqualNode(Node)" with the proper type 
 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: document.createComment("abc") must inherit property "isSameNode(Node)" with the proper type 
 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: document.createComment("abc") must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type 
+PASS Node interface: document.createComment("abc") must inherit property "compareDocumentPosition(Node)" with the proper type 
 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: document.createComment("abc") must inherit property "contains(Node)" with the proper type 
 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: document.createComment("abc") must inherit property "lookupPrefix(DOMString)" with the proper type 
 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: document.createComment("abc") must inherit property "lookupNamespaceURI(DOMString)" with the proper type 
 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: document.createComment("abc") must inherit property "isDefaultNamespace(DOMString)" with the proper type 
 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: document.createComment("abc") must inherit property "insertBefore(Node, Node)" with the proper type 
+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(Node)" with the proper type 
 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: document.createComment("abc") must inherit property "replaceChild(Node, Node)" with the proper type 
+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(Node)" with the proper type 
 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: document.createComment("abc") must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+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(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+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(Event)" with the proper type 
 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 
@@ -1401,8 +1401,8 @@
 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 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) 
@@ -1418,7 +1418,7 @@
 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 compareBoundaryPoints(unsigned short, Range) 
 PASS Range interface: operation deleteContents() 
 PASS Range interface: operation extractContents() 
 PASS Range interface: operation cloneContents() 
@@ -1426,103 +1426,103 @@
 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 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: document.createRange() must inherit property "startContainer" with the proper type 
+PASS Range interface: document.createRange() must inherit property "startOffset" with the proper type 
+PASS Range interface: document.createRange() must inherit property "endContainer" with the proper type 
+PASS Range interface: document.createRange() must inherit property "endOffset" with the proper type 
+PASS Range interface: document.createRange() must inherit property "collapsed" with the proper type 
+PASS Range interface: document.createRange() must inherit property "commonAncestorContainer" with the proper type 
+PASS Range interface: document.createRange() must inherit property "setStart(Node, unsigned long)" with the proper type 
+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(Node, unsigned long)" with the proper type 
+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(Node)" with the proper type 
 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: document.createRange() must inherit property "setStartAfter(Node)" with the proper type 
 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: document.createRange() must inherit property "setEndBefore(Node)" with the proper type 
 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: document.createRange() must inherit property "setEndAfter(Node)" with the proper type 
 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: document.createRange() must inherit property "collapse(boolean)" with the proper type 
 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: document.createRange() must inherit property "selectNode(Node)" with the proper type 
 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: document.createRange() must inherit property "selectNodeContents(Node)" with the proper type 
 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: document.createRange() must inherit property "START_TO_START" with the proper type 
+PASS Range interface: document.createRange() must inherit property "START_TO_END" with the proper type 
+PASS Range interface: document.createRange() must inherit property "END_TO_END" with the proper type 
+PASS Range interface: document.createRange() must inherit property "END_TO_START" with the proper type 
+PASS Range interface: document.createRange() must inherit property "compareBoundaryPoints(unsigned short, Range)" with the proper type 
+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 
+PASS Range interface: document.createRange() must inherit property "extractContents()" with the proper type 
+PASS Range interface: document.createRange() must inherit property "cloneContents()" with the proper type 
+PASS Range interface: document.createRange() must inherit property "insertNode(Node)" with the proper type 
 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: document.createRange() must inherit property "surroundContents(Node)" with the proper type 
 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: document.createRange() must inherit property "cloneRange()" with the proper type 
+PASS Range interface: document.createRange() must inherit property "detach()" with the proper type 
+PASS Range interface: document.createRange() must inherit property "isPointInRange(Node, unsigned long)" with the proper type 
+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(Node, unsigned long)" with the proper type 
+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(Node)" with the proper type 
 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: detachedRange must inherit property "startContainer" with the proper type 
+PASS Range interface: detachedRange must inherit property "startOffset" with the proper type 
+PASS Range interface: detachedRange must inherit property "endContainer" with the proper type 
+PASS Range interface: detachedRange must inherit property "endOffset" with the proper type 
+PASS Range interface: detachedRange must inherit property "collapsed" with the proper type 
+PASS Range interface: detachedRange must inherit property "commonAncestorContainer" with the proper type 
+PASS Range interface: detachedRange must inherit property "setStart(Node, unsigned long)" with the proper type 
+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(Node, unsigned long)" with the proper type 
+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(Node)" with the proper type 
 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: detachedRange must inherit property "setStartAfter(Node)" with the proper type 
 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: detachedRange must inherit property "setEndBefore(Node)" with the proper type 
 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: detachedRange must inherit property "setEndAfter(Node)" with the proper type 
 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: detachedRange must inherit property "collapse(boolean)" with the proper type 
 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: detachedRange must inherit property "selectNode(Node)" with the proper type 
 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: detachedRange must inherit property "selectNodeContents(Node)" with the proper type 
 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: detachedRange must inherit property "START_TO_START" with the proper type 
+PASS Range interface: detachedRange must inherit property "START_TO_END" with the proper type 
+PASS Range interface: detachedRange must inherit property "END_TO_END" with the proper type 
+PASS Range interface: detachedRange must inherit property "END_TO_START" with the proper type 
+PASS Range interface: detachedRange must inherit property "compareBoundaryPoints(unsigned short, Range)" with the proper type 
+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 
+PASS Range interface: detachedRange must inherit property "extractContents()" with the proper type 
+PASS Range interface: detachedRange must inherit property "cloneContents()" with the proper type 
+PASS Range interface: detachedRange must inherit property "insertNode(Node)" with the proper type 
 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: detachedRange must inherit property "surroundContents(Node)" with the proper type 
 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: detachedRange must inherit property "cloneRange()" with the proper type 
+PASS Range interface: detachedRange must inherit property "detach()" with the proper type 
+PASS Range interface: detachedRange must inherit property "isPointInRange(Node, unsigned long)" with the proper type 
+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(Node, unsigned long)" with the proper type 
+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(Node)" with the proper type 
 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 
@@ -1539,14 +1539,14 @@
 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 NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "root" with the proper type 
+PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "referenceNode" with the proper type 
+PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "pointerBeforeReferenceNode" with the proper type 
+PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "whatToShow" with the proper type 
+PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "filter" with the proper type 
+PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextNode()" with the proper type 
+PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousNode()" with the proper type 
+PASS NodeIterator interface: document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "detach()" with the proper type 
 PASS TreeWalker interface: existence and properties of interface object 
 PASS TreeWalker interface object length 
 PASS TreeWalker interface object name 
@@ -1565,17 +1565,17 @@
 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 TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "root" with the proper type 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "whatToShow" with the proper type 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "filter" with the proper type 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "currentNode" with the proper type 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "parentNode()" with the proper type 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "firstChild()" with the proper type 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "lastChild()" with the proper type 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousSibling()" with the proper type 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextSibling()" with the proper type 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "previousNode()" with the proper type 
+PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property "nextNode()" with the proper type 
 PASS NodeFilter interface: existence and properties of interface object 
 PASS NodeFilter interface object name 
 PASS NodeFilter interface: existence and properties of interface prototype object 
@@ -1623,28 +1623,28 @@
 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) 
-PASS DOMTokenList interface: operation replace(DOMString,DOMString) 
+PASS DOMTokenList interface: operation toggle(DOMString, boolean) 
+PASS DOMTokenList interface: operation replace(DOMString, DOMString) 
 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: document.body.classList must inherit property "length" with the proper type 
+PASS DOMTokenList interface: document.body.classList must inherit property "item(unsigned long)" with the proper type 
 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: document.body.classList must inherit property "contains(DOMString)" with the proper type 
 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: document.body.classList must inherit property "add(DOMString)" with the proper type 
 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: document.body.classList must inherit property "remove(DOMString)" with the proper type 
 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 
-PASS DOMTokenList interface: document.body.classList must inherit property "replace" with the proper type (6) 
-PASS DOMTokenList interface: calling replace(DOMString,DOMString) on document.body.classList with too few arguments must throw TypeError 
-PASS DOMTokenList interface: document.body.classList must inherit property "supports" with the proper type (7) 
+PASS DOMTokenList interface: document.body.classList must inherit property "toggle(DOMString, boolean)" with the proper type 
+PASS DOMTokenList interface: calling toggle(DOMString, boolean) on document.body.classList with too few arguments must throw TypeError 
+PASS DOMTokenList interface: document.body.classList must inherit property "replace(DOMString, DOMString)" with the proper type 
+PASS DOMTokenList interface: calling replace(DOMString, DOMString) on document.body.classList with too few arguments must throw TypeError 
+PASS DOMTokenList interface: document.body.classList must inherit property "supports(DOMString)" with the proper type 
 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) 
+PASS DOMTokenList interface: document.body.classList must inherit property "value" with the proper type 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt
index 792f6117..b18b8d79 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt
@@ -1,33 +1,4 @@
 This is a testharness.js-based test.
-FAIL ServiceWorkerGlobalScope: Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Request objects have a signal property assert_true: Signal member is present & truthy expected true got false
-FAIL ServiceWorkerGlobalScope: Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Readable stream synchronously cancels with AbortError if aborted before reading AbortController is not defined
+FAIL General fetch abort tests in a service worker Failed to register a ServiceWorker: The script does not have a MIME type.
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-serviceworker.https.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-serviceworker.https.html
index c1334e03..74de2874 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-serviceworker.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-serviceworker.https.html
@@ -14,7 +14,7 @@
     let reg = await navigator.serviceWorker.getRegistration(scope);
     if (reg) await reg.unregister();
 
-    reg = await navigator.serviceWorker.register('general.js', {scope});
+    reg = await navigator.serviceWorker.register('general.any.worker.js', {scope});
 
     fetch_tests_from_worker(reg.installing);
   })();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-sharedworker-expected.txt
new file mode 100644
index 0000000..d9b7c58
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-sharedworker-expected.txt
@@ -0,0 +1,52 @@
+This is a testharness.js-based test.
+FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's window is not null 
+FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors 
+FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - Bad mode init parameter value 
+PASS TypeError from request constructor takes priority - Bad credentials init parameter value 
+PASS TypeError from request constructor takes priority - Bad cache init parameter value 
+PASS TypeError from request constructor takes priority - Bad redirect init parameter value 
+FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false
+FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal state is cloned AbortController is not defined
+FAIL Clone aborts with original controller AbortController is not defined
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-sharedworker.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-sharedworker.html
new file mode 100644
index 0000000..9378e166
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general-sharedworker.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>General fetch abort tests - shared worker</title>
+  <script src="/resources/testharness.js"></script>
+  <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<script>
+  fetch_tests_from_worker(new SharedWorker("general.any.worker.js"));
+</script>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.any-expected.txt
new file mode 100644
index 0000000..d9b7c58
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.any-expected.txt
@@ -0,0 +1,52 @@
+This is a testharness.js-based test.
+FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's window is not null 
+FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors 
+FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - Bad mode init parameter value 
+PASS TypeError from request constructor takes priority - Bad credentials init parameter value 
+PASS TypeError from request constructor takes priority - Bad cache init parameter value 
+PASS TypeError from request constructor takes priority - Bad redirect init parameter value 
+FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false
+FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal state is cloned AbortController is not defined
+FAIL Clone aborts with original controller AbortController is not defined
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.js b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.any.js
similarity index 76%
rename from third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.js
rename to third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.any.js
index 8416e3a..df77d56 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.any.js
@@ -1,12 +1,7 @@
-const BODY_METHODS = ['arrayBuffer', 'blob', 'formData', 'json', 'text'];
+// META: script=/common/utils.js
+// META: script=../request/request-error.js
 
-if (self.importScripts) {
-  // Load scripts if being run from a worker
-  importScripts(
-    '/resources/testharness.js',
-    '/common/utils.js'
-  );
-}
+const BODY_METHODS = ['arrayBuffer', 'blob', 'formData', 'json', 'text'];
 
 // This is used to close connections that weren't correctly closed during the tests,
 // otherwise you can end up running out of HTTP connections.
@@ -20,11 +15,6 @@
   );
 }
 
-// Add the global name to the test name
-function contextualTestName(name) {
-  return `${self.constructor.name}: ${name}`;
-}
-
 promise_test(async t => {
   const controller = new AbortController();
   const signal = controller.signal;
@@ -33,7 +23,7 @@
   const fetchPromise = fetch('../resources/data.json', { signal });
 
   await promise_rejects(t, "AbortError", fetchPromise);
-}, contextualTestName("Aborting rejects with AbortError"));
+}, "Aborting rejects with AbortError");
 
 promise_test(async t => {
   const controller = new AbortController();
@@ -49,13 +39,34 @@
   });
 
   await promise_rejects(t, "AbortError", fetchPromise);
-}, contextualTestName("Aborting rejects with AbortError - no-cors"));
+}, "Aborting rejects with AbortError - no-cors");
+
+// Test that errors thrown from the request constructor take priority over abort errors.
+// badRequestArgTests is from response-error.js
+for (const { args, testName } of badRequestArgTests) {
+  promise_test(async t => {
+    try {
+      // If this doesn't throw, we'll effectively skip the test.
+      // It'll fail properly in ../request/request-error.html
+      new Request(...args);
+    }
+    catch (err) {
+      const controller = new AbortController();
+      controller.abort();
+
+      // Add signal to 2nd arg
+      args[1] = args[1] || {};
+      args[1].signal = controller.signal;
+      await promise_rejects(t, err, fetch(...args));
+    }
+  }, `TypeError from request constructor takes priority - ${testName}`);
+}
 
 test(() => {
   const request = new Request('');
   assert_true(Boolean(request.signal), "Signal member is present & truthy");
   assert_equals(request.signal.constructor, AbortSignal);
-}, contextualTestName("Request objects have a signal property"));
+}, "Request objects have a signal property");
 
 promise_test(async t => {
   const controller = new AbortController();
@@ -71,7 +82,7 @@
   const fetchPromise = fetch(request);
 
   await promise_rejects(t, "AbortError", fetchPromise);
-}, contextualTestName("Signal on request object"));
+}, "Signal on request object");
 
 promise_test(async t => {
   const controller = new AbortController();
@@ -84,7 +95,7 @@
   const fetchPromise = fetch(requestFromRequest);
 
   await promise_rejects(t, "AbortError", fetchPromise);
-}, contextualTestName("Signal on request object created from request object"));
+}, "Signal on request object created from request object");
 
 promise_test(async t => {
   const controller = new AbortController();
@@ -97,7 +108,7 @@
   const fetchPromise = fetch(requestFromRequest);
 
   await promise_rejects(t, "AbortError", fetchPromise);
-}, contextualTestName("Signal on request object created from request object, with signal on second request"));
+}, "Signal on request object created from request object, with signal on second request");
 
 promise_test(async t => {
   const controller = new AbortController();
@@ -110,7 +121,7 @@
   const fetchPromise = fetch(requestFromRequest);
 
   await promise_rejects(t, "AbortError", fetchPromise);
-}, contextualTestName("Signal on request object created from request object, with signal on second request overriding another"));
+}, "Signal on request object created from request object, with signal on second request overriding another");
 
 promise_test(async t => {
   const controller = new AbortController();
@@ -122,7 +133,7 @@
   const fetchPromise = fetch(request, {method: 'POST'});
 
   await promise_rejects(t, "AbortError", fetchPromise);
-}, contextualTestName("Signal retained after unrelated properties are overridden by fetch"));
+}, "Signal retained after unrelated properties are overridden by fetch");
 
 promise_test(async t => {
   const controller = new AbortController();
@@ -133,7 +144,7 @@
 
   const data = await fetch(request, { signal: null }).then(r => r.json());
   assert_equals(data.key, 'value', 'Fetch fully completes');
-}, contextualTestName("Signal removed by setting to null"));
+}, "Signal removed by setting to null");
 
 promise_test(async t => {
   const controller = new AbortController();
@@ -151,7 +162,7 @@
   ]);
 
   assert_array_equals(log, ['fetch-reject', 'next-microtask']);
-}, contextualTestName("Already aborted signal rejects immediately"));
+}, "Already aborted signal rejects immediately");
 
 promise_test(async t => {
   const controller = new AbortController();
@@ -168,7 +179,7 @@
   await fetch(request).catch(() => {});
 
   assert_true(request.bodyUsed, "Body has been used");
-}, contextualTestName("Request is still 'used' if signal is aborted before fetching"));
+}, "Request is still 'used' if signal is aborted before fetching");
 
 for (const bodyMethod of BODY_METHODS) {
   promise_test(async t => {
@@ -190,7 +201,7 @@
     await promise_rejects(t, "AbortError", bodyPromise);
 
     assert_array_equals(log, [`${bodyMethod}-reject`, 'next-microtask']);
-  }, contextualTestName(`response.${bodyMethod}() rejects if already aborted`));
+  }, `response.${bodyMethod}() rejects if already aborted`);
 }
 
 promise_test(async t => {
@@ -213,7 +224,7 @@
   const data = await response.json();
 
   assert_equals(data, null, "Request hasn't been made to the server");
-}, contextualTestName("Already aborted signal does not make request"));
+}, "Already aborted signal does not make request");
 
 promise_test(async t => {
   await abortRequests();
@@ -236,7 +247,7 @@
   for (const fetchPromise of fetches) {
     await promise_rejects(t, "AbortError", fetchPromise);
   }
-}, contextualTestName("Already aborted signal can be used for many fetches"));
+}, "Already aborted signal can be used for many fetches");
 
 promise_test(async t => {
   await abortRequests();
@@ -262,7 +273,7 @@
   for (const fetchPromise of fetches) {
     await promise_rejects(t, "AbortError", fetchPromise);
   }
-}, contextualTestName("Signal can be used to abort other fetches, even if another fetch succeeded before aborting"));
+}, "Signal can be used to abort other fetches, even if another fetch succeeded before aborting");
 
 promise_test(async t => {
   await abortRequests();
@@ -290,7 +301,7 @@
     const afterAbortResult = await fetch(`../resources/stash-take.py?key=${stateKey}`).then(r => r.json());
     if (afterAbortResult == 'closed') break;
   }
-}, contextualTestName("Underlying connection is closed when aborting after receiving response"));
+}, "Underlying connection is closed when aborting after receiving response");
 
 promise_test(async t => {
   await abortRequests();
@@ -327,7 +338,7 @@
     const afterAbortResult = await fetch(stashTakeURL).then(r => r.json());
     if (afterAbortResult == 'closed') break;
   }
-}, contextualTestName("Underlying connection is closed when aborting after receiving response - no-cors"));
+}, "Underlying connection is closed when aborting after receiving response - no-cors");
 
 for (const bodyMethod of BODY_METHODS) {
   promise_test(async t => {
@@ -359,7 +370,7 @@
       const afterAbortResult = await fetch(`../resources/stash-take.py?key=${stateKey}`).then(r => r.json());
       if (afterAbortResult == 'closed') break;
     }
-  }, contextualTestName(`Fetch aborted & connection closed when aborted after calling response.${bodyMethod}()`));
+  }, `Fetch aborted & connection closed when aborted after calling response.${bodyMethod}()`);
 }
 
 promise_test(async t => {
@@ -389,7 +400,7 @@
     const afterAbortResult = await fetch(`../resources/stash-take.py?key=${stateKey}`).then(r => r.json());
     if (afterAbortResult == 'closed') break;
   }
-}, contextualTestName("Stream errors once aborted. Underlying connection closed."));
+}, "Stream errors once aborted. Underlying connection closed.");
 
 promise_test(async t => {
   await abortRequests();
@@ -420,7 +431,7 @@
     const afterAbortResult = await fetch(`../resources/stash-take.py?key=${stateKey}`).then(r => r.json());
     if (afterAbortResult == 'closed') break;
   }
-}, contextualTestName("Stream errors once aborted, after reading. Underlying connection closed."));
+}, "Stream errors once aborted, after reading. Underlying connection closed.");
 
 promise_test(async t => {
   await abortRequests();
@@ -436,10 +447,9 @@
   const item = await reader.read();
 
   assert_true(item.done, "Stream is done");
-}, contextualTestName("Stream will not error if body is empty. It's closed with an empty queue before it errors."));
+}, "Stream will not error if body is empty. It's closed with an empty queue before it errors.");
 
-
-test(t => {
+promise_test(async t => {
   const controller = new AbortController();
   const signal = controller.signal;
   controller.abort();
@@ -455,7 +465,7 @@
     }
   });
 
-  fetch('../resources/empty.txt', {
+  const fetchPromise = fetch('../resources/empty.txt', {
     body, signal,
     method: 'POST',
     headers: {
@@ -466,4 +476,45 @@
   assert_true(!!cancelReason, 'Cancel called sync');
   assert_equals(cancelReason.constructor, DOMException);
   assert_equals(cancelReason.name, 'AbortError');
-}, contextualTestName("Readable stream synchronously cancels with AbortError if aborted before reading"));
+
+  await promise_rejects(t, "AbortError", fetchPromise);
+
+  const fetchErr = await fetchPromise.catch(e => e);
+
+  assert_equals(cancelReason, fetchErr, "Fetch rejects with same error instance");
+}, "Readable stream synchronously cancels with AbortError if aborted before reading");
+
+test(() => {
+  const controller = new AbortController();
+  const signal = controller.signal;
+  controller.abort();
+
+  const request = new Request('.', { signal });
+  const requestSignal = request.signal;
+
+  const clonedRequest = request.clone();
+
+  assert_equals(requestSignal, request.signal, "Original request signal the same after cloning");
+  assert_true(request.signal.aborted, "Original request signal aborted");
+  assert_not_equals(clonedRequest.signal, request.signal, "Cloned request has different signal");
+  assert_true(clonedRequest.signal.aborted, "Cloned request signal aborted");
+}, "Signal state is cloned");
+
+test(() => {
+  const controller = new AbortController();
+  const signal = controller.signal;
+
+  const request = new Request('.', { signal });
+  const clonedRequest = request.clone();
+
+  const log = [];
+
+  request.signal.addEventListener('abort', () => log.push('original-aborted'));
+  clonedRequest.signal.addEventListener('abort', () => log.push('clone-aborted'));
+
+  controller.abort();
+
+  assert_array_equals(log, ['clone-aborted', 'original-aborted'], "Abort events fired in correct order");
+  assert_true(request.signal.aborted, 'Signal aborted');
+  assert_true(clonedRequest.signal.aborted, 'Signal aborted');
+}, "Clone aborts with original controller");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.any.worker-expected.txt
new file mode 100644
index 0000000..d9b7c58
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.any.worker-expected.txt
@@ -0,0 +1,52 @@
+This is a testharness.js-based test.
+FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's window is not null 
+FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors 
+FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - Bad mode init parameter value 
+PASS TypeError from request constructor takes priority - Bad credentials init parameter value 
+PASS TypeError from request constructor takes priority - Bad cache init parameter value 
+PASS TypeError from request constructor takes priority - Bad redirect init parameter value 
+FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false
+FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal state is cloned AbortController is not defined
+FAIL Clone aborts with original controller AbortController is not defined
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.html
deleted file mode 100644
index 0d5baf2..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/abort/general.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <meta charset="utf-8">
-  <title>General fetch abort tests</title>
-  <script src="/resources/testharness.js"></script>
-  <script src="/resources/testharnessreport.js"></script>
-  <script src="/common/utils.js"></script>
-  <script src="general.js"></script>
-</head>
-<body>
-<script>
-  fetch_tests_from_worker(new Worker("general.js"));
-  if (window.SharedWorker) {
-    fetch_tests_from_worker(new SharedWorker("general.js"));
-  }
-</script>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error-expected.txt
index 9c18579..697b78fd0 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-FAIL RequestInit's window is not null assert_throws: Expect TypeError exception function "function () { new Request("", {"window" : "http://test.url"}); }" did not throw
+FAIL RequestInit's window is not null assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
 PASS Input URL is not valid 
 PASS Input URL has credentials 
 PASS RequestInit's mode is navigate 
@@ -8,18 +8,18 @@
 PASS RequestInit's method is forbidden 
 PASS RequestInit's mode is no-cors and method is not simple 
 PASS RequestInit's mode is no-cors and integrity is not empty 
-FAIL RequestInit's cache mode is only-if-cached and mode is not same-origin assert_throws: Expect TypeError exception function "function () { new Request("", {"mode" : "cors", "cache" : "only-if-cached"}); }" did not throw
+FAIL RequestInit's cache mode is only-if-cached and mode is not same-origin assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Request with cache mode: only-if-cached and fetch mode cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Request with cache mode: only-if-cached and fetch mode no-cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+PASS Bad referrerPolicy init parameter value 
+FAIL Bad mode init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Bad credentials init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Bad cache init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Bad redirect init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
 PASS Request should get its content-type from the init request 
 PASS Request should not get its content-type from the init request if init headers are provided 
 PASS Request should get its content-type from the body if none is provided 
 PASS Request should get its content-type from init headers if one is provided 
-PASS Bad referrerPolicy init parameter value 
-FAIL Bad mode init parameter value assert_throws: function "function () { new Request("", options); }" did not throw
-FAIL Bad credentials init parameter value assert_throws: function "function () { new Request("", options); }" did not throw
-FAIL Bad cache init parameter value assert_throws: function "function () { new Request("", options); }" did not throw
-FAIL Bad redirect init parameter value assert_throws: function "function () { new Request("", options); }" did not throw
 PASS Request with cache mode: only-if-cached and fetch mode: same-origin 
-FAIL Request with cache mode: only-if-cached and fetch mode: cors assert_throws: function "function () { new Request("test", options); }" did not throw
-FAIL Request with cache mode: only-if-cached and fetch mode: no-cors assert_throws: function "function () { new Request("test", options); }" did not throw
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error.html
index a04bfde..70be9fb 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error.html
@@ -8,60 +8,20 @@
     <meta name="author" title="Canon Research France" href="https://www.crf.canon.fr">
     <script src="/resources/testharness.js"></script>
     <script src="/resources/testharnessreport.js"></script>
+    <script src="request-error.js"></script>
   </head>
   <body>
     <script>
-      test(function() {
-        assert_throws(new TypeError() , function() { new Request("", {"window" : "http://test.url"}); },
-          "Expect TypeError exception");
-      },"RequestInit's window is not null");
-
-      test(function() {
-        assert_throws(new TypeError() , function() { new Request("http://:not a valid URL"); },
-          "Expect TypeError exception");
-      },"Input URL is not valid")
-
-      test(function() {
-        assert_throws(new TypeError() , function() { new Request("http://user:pass@test.url"); },
-          "Expect TypeError exception");
-      },"Input URL has credentials");
-
-      test(function() {
-        assert_throws(new TypeError() , function() { new Request("", {"mode" : "navigate"}); },
-          "Expect TypeError exception");
-      },"RequestInit's mode is navigate");
-
-      test(function() {
-        assert_throws(new TypeError() , function() { new Request("", {"referrer" : "http://:not a valid URL"}); },
-          "Expect TypeError exception");
-      },"RequestInit's referrer is invalid");
-
-      test(function() {
-        assert_throws(new TypeError() , function() { new Request("", {"method" : "IN VALID"}); },
-          "Expect TypeError exception");
-      }, "RequestInit's method is invalid");
-
-      test(function() {
-        assert_throws(new TypeError() , function() { new Request("", {"method" : "TRACE"}); },
-          "Expect TypeError exception");
-      }, "RequestInit's method is forbidden");
-
-      test(function() {
-        assert_throws(new TypeError() , function() { new Request("", {"mode" : "no-cors", "method" : "PUT"}); },
-          "Expect TypeError exception");
-      },"RequestInit's mode is no-cors and method is not simple");
-
-      test(function() {
-        assert_throws(new TypeError() ,
-                      function() { new Request("", {"mode" : "no-cors", "integrity" : "not  an empty string"}); },
-                      "Expect TypeError exception");
-      },"RequestInit's mode is no-cors and integrity is not empty");
-
-      test(function() {
-        assert_throws(new TypeError() ,
-                      function() { new Request("", {"mode" : "cors", "cache" : "only-if-cached"}); },
-                      "Expect TypeError exception");
-      },"RequestInit's cache mode is only-if-cached and mode is not same-origin");
+      // badRequestArgTests is from response-error.js
+      for (const { args, testName } of badRequestArgTests) {
+        test(() => {
+          assert_throws(
+            new TypeError(),
+            () => new Request(...args),
+            "Expect TypeError exception"
+          );
+        }, testName);
+      }
 
       test(function() {
         var initialHeaders = new Headers([["Content-Type", "potato"]]);
@@ -92,28 +52,10 @@
         assert_equals(request.headers.get("Content-Type"), "potato");
       }, "Request should get its content-type from init headers if one is provided");
 
-      var parameters = ["referrerPolicy", "mode", "credentials", "cache", "redirect"];
-      parameters.forEach(function(parameter) {
-        test(function() {
-          var options = { };
-          options[parameter] = "BAD";
-          assert_throws(new TypeError(), function() { new Request("", options); });
-        },"Bad " + parameter +" init parameter value");
-      });
-
-      function testOnlyIfCachedMode(fetchMode, ok) {
-        test(function() {
-          var options = {"cache": "only-if-cached", "mode": fetchMode};
-          if (ok)
-            new Request("test", options);
-          else
-            assert_throws(new TypeError(), function() { new Request("test", options); });
-        }, "Request with cache mode: only-if-cached and fetch mode: " + fetchMode);
-      }
-      testOnlyIfCachedMode("same-origin", true);
-      testOnlyIfCachedMode("cors", false);
-      testOnlyIfCachedMode("no-cors", false);
-
+      test(function() {
+        var options = {"cache": "only-if-cached", "mode": "same-origin"};
+        new Request("test", options);
+      }, "Request with cache mode: only-if-cached and fetch mode: same-origin");
     </script>
   </body>
 </html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error.js b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error.js
new file mode 100644
index 0000000..d2ffec6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-error.js
@@ -0,0 +1,61 @@
+const badRequestArgTests = [
+  {
+    args: ["", { "window": "http://test.url" }],
+    testName: "RequestInit's window is not null"
+  },
+  {
+    args: ["http://:not a valid URL"],
+    testName: "Input URL is not valid"
+  },
+  {
+    args: ["http://user:pass@test.url"],
+    testName: "Input URL has credentials"
+  },
+  {
+    args: ["", { "mode": "navigate" }],
+    testName: "RequestInit's mode is navigate"
+  },
+  {
+    args: ["", { "referrer": "http://:not a valid URL" }],
+    testName: "RequestInit's referrer is invalid"
+  },
+  {
+    args: ["", { "method": "IN VALID" }],
+    testName: "RequestInit's method is invalid"
+  },
+  {
+    args: ["", { "method": "TRACE" }],
+    testName: "RequestInit's method is forbidden"
+  },
+  {
+    args: ["", { "mode": "no-cors", "method": "PUT" }],
+    testName: "RequestInit's mode is no-cors and method is not simple"
+  },
+  {
+    args: ["", { "mode": "no-cors", "integrity": "not  an empty string" }],
+    testName: "RequestInit's mode is no-cors and integrity is not empty"
+  },
+  {
+    args: ["", { "mode": "cors", "cache": "only-if-cached" }],
+    testName: "RequestInit's cache mode is only-if-cached and mode is not same-origin"
+  },
+  {
+    args: ["test", { "cache": "only-if-cached", "mode": "cors" }],
+    testName: "Request with cache mode: only-if-cached and fetch mode cors"
+  },
+  {
+    args: ["test", { "cache": "only-if-cached", "mode": "no-cors" }],
+    testName: "Request with cache mode: only-if-cached and fetch mode no-cors"
+  }
+];
+
+badRequestArgTests.push(
+  ...["referrerPolicy", "mode", "credentials", "cache", "redirect"].map(optionProp => {
+    const options = {};
+    options[optionProp] = "BAD";
+    return {
+      args: ["", options],
+      testName: `Bad ${optionProp} init parameter value`
+    };
+  })
+);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-idl-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-idl-expected.txt
index 93b1e2a..6835e7d 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-idl-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/request/request-idl-expected.txt
@@ -26,25 +26,25 @@
 PASS Request interface: operation text() 
 PASS Request must be primary interface of new Request("") 
 PASS Stringification of new Request("") 
-PASS Request interface: new Request("") must inherit property "method" with the proper type (0) 
-PASS Request interface: new Request("") must inherit property "url" with the proper type (1) 
-PASS Request interface: new Request("") must inherit property "headers" with the proper type (2) 
-FAIL Request interface: new Request("") must inherit property "type" with the proper type (3) assert_inherits: property "type" not found in prototype chain
-FAIL Request interface: new Request("") must inherit property "destination" with the proper type (4) assert_inherits: property "destination" not found in prototype chain
-PASS Request interface: new Request("") must inherit property "referrer" with the proper type (5) 
-PASS Request interface: new Request("") must inherit property "referrerPolicy" with the proper type (6) 
-PASS Request interface: new Request("") must inherit property "mode" with the proper type (7) 
-PASS Request interface: new Request("") must inherit property "credentials" with the proper type (8) 
-PASS Request interface: new Request("") must inherit property "cache" with the proper type (9) 
-PASS Request interface: new Request("") must inherit property "redirect" with the proper type (10) 
-PASS Request interface: new Request("") must inherit property "integrity" with the proper type (11) 
-PASS Request interface: new Request("") must inherit property "clone" with the proper type (12) 
-FAIL Request interface: new Request("") must inherit property "body" with the proper type (13) assert_inherits: property "body" not found in prototype chain
-PASS Request interface: new Request("") must inherit property "bodyUsed" with the proper type (14) 
-PASS Request interface: new Request("") must inherit property "arrayBuffer" with the proper type (15) 
-PASS Request interface: new Request("") must inherit property "blob" with the proper type (16) 
-PASS Request interface: new Request("") must inherit property "formData" with the proper type (17) 
-PASS Request interface: new Request("") must inherit property "json" with the proper type (18) 
-PASS Request interface: new Request("") must inherit property "text" with the proper type (19) 
+PASS Request interface: new Request("") must inherit property "method" with the proper type 
+PASS Request interface: new Request("") must inherit property "url" with the proper type 
+PASS Request interface: new Request("") must inherit property "headers" with the proper type 
+FAIL Request interface: new Request("") must inherit property "type" with the proper type assert_inherits: property "type" not found in prototype chain
+FAIL Request interface: new Request("") must inherit property "destination" with the proper type assert_inherits: property "destination" not found in prototype chain
+PASS Request interface: new Request("") must inherit property "referrer" with the proper type 
+PASS Request interface: new Request("") must inherit property "referrerPolicy" with the proper type 
+PASS Request interface: new Request("") must inherit property "mode" with the proper type 
+PASS Request interface: new Request("") must inherit property "credentials" with the proper type 
+PASS Request interface: new Request("") must inherit property "cache" with the proper type 
+PASS Request interface: new Request("") must inherit property "redirect" with the proper type 
+PASS Request interface: new Request("") must inherit property "integrity" with the proper type 
+PASS Request interface: new Request("") must inherit property "clone()" with the proper type 
+FAIL Request interface: new Request("") must inherit property "body" with the proper type assert_inherits: property "body" not found in prototype chain
+PASS Request interface: new Request("") must inherit property "bodyUsed" with the proper type 
+PASS Request interface: new Request("") must inherit property "arrayBuffer()" with the proper type 
+PASS Request interface: new Request("") must inherit property "blob()" with the proper type 
+PASS Request interface: new Request("") must inherit property "formData()" with the proper type 
+PASS Request interface: new Request("") must inherit property "json()" with the proper type 
+PASS Request interface: new Request("") must inherit property "text()" with the proper type 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-idl-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-idl-expected.txt
index 00afc4f..db7454c6 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-idl-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-idl-expected.txt
@@ -5,7 +5,7 @@
 PASS Response interface: existence and properties of interface prototype object 
 PASS Response interface: existence and properties of interface prototype object's "constructor" property 
 PASS Response interface: operation error() 
-PASS Response interface: operation redirect(USVString,unsigned short) 
+PASS Response interface: operation redirect(USVString, unsigned short) 
 PASS Response interface: attribute type 
 PASS Response interface: attribute url 
 PASS Response interface: attribute status 
@@ -23,23 +23,23 @@
 PASS Response interface: operation text() 
 PASS Response must be primary interface of new Response() 
 PASS Stringification of new Response() 
-PASS Response interface: new Response() must inherit property "error" with the proper type (0) 
-PASS Response interface: new Response() must inherit property "redirect" with the proper type (1) 
-PASS Response interface: calling redirect(USVString,unsigned short) on new Response() with too few arguments must throw TypeError 
-PASS Response interface: new Response() must inherit property "type" with the proper type (2) 
-PASS Response interface: new Response() must inherit property "url" with the proper type (3) 
-PASS Response interface: new Response() must inherit property "status" with the proper type (4) 
-PASS Response interface: new Response() must inherit property "ok" with the proper type (5) 
-PASS Response interface: new Response() must inherit property "statusText" with the proper type (6) 
-PASS Response interface: new Response() must inherit property "headers" with the proper type (7) 
-FAIL Response interface: new Response() must inherit property "trailer" with the proper type (8) assert_inherits: property "trailer" not found in prototype chain
-PASS Response interface: new Response() must inherit property "clone" with the proper type (9) 
-PASS Response interface: new Response() must inherit property "body" with the proper type (10) 
-PASS Response interface: new Response() must inherit property "bodyUsed" with the proper type (11) 
-PASS Response interface: new Response() must inherit property "arrayBuffer" with the proper type (12) 
-PASS Response interface: new Response() must inherit property "blob" with the proper type (13) 
-PASS Response interface: new Response() must inherit property "formData" with the proper type (14) 
-PASS Response interface: new Response() must inherit property "json" with the proper type (15) 
-PASS Response interface: new Response() must inherit property "text" with the proper type (16) 
+PASS Response interface: new Response() must inherit property "error()" with the proper type 
+PASS Response interface: new Response() must inherit property "redirect(USVString, unsigned short)" with the proper type 
+PASS Response interface: calling redirect(USVString, unsigned short) on new Response() with too few arguments must throw TypeError 
+PASS Response interface: new Response() must inherit property "type" with the proper type 
+PASS Response interface: new Response() must inherit property "url" with the proper type 
+PASS Response interface: new Response() must inherit property "status" with the proper type 
+PASS Response interface: new Response() must inherit property "ok" with the proper type 
+PASS Response interface: new Response() must inherit property "statusText" with the proper type 
+PASS Response interface: new Response() must inherit property "headers" with the proper type 
+FAIL Response interface: new Response() must inherit property "trailer" with the proper type assert_inherits: property "trailer" not found in prototype chain
+PASS Response interface: new Response() must inherit property "clone()" with the proper type 
+PASS Response interface: new Response() must inherit property "body" with the proper type 
+PASS Response interface: new Response() must inherit property "bodyUsed" with the proper type 
+PASS Response interface: new Response() must inherit property "arrayBuffer()" with the proper type 
+PASS Response interface: new Response() must inherit property "blob()" with the proper type 
+PASS Response interface: new Response() must inherit property "formData()" with the proper type 
+PASS Response interface: new Response() must inherit property "json()" with the proper type 
+PASS Response interface: new Response() must inherit property "text()" with the proper type 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fullscreen/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fullscreen/interfaces-expected.txt
index 7336b1d7..9d5e1e7 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/fullscreen/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/fullscreen/interfaces-expected.txt
@@ -6,18 +6,18 @@
 PASS Document interface: attribute onfullscreenchange 
 PASS Document interface: attribute onfullscreenerror 
 FAIL Document interface: attribute fullscreenElement assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined"
-PASS Document interface: new Document must inherit property "fullscreenEnabled" with the proper type (29) 
-FAIL Document interface: new Document must inherit property "fullscreen" with the proper type (30) assert_inherits: property "fullscreen" not found in prototype chain
-PASS Document interface: new Document must inherit property "exitFullscreen" with the proper type (31) 
-PASS Document interface: new Document must inherit property "onfullscreenchange" with the proper type (32) 
-PASS Document interface: new Document must inherit property "onfullscreenerror" with the proper type (33) 
-PASS Document interface: new Document must inherit property "fullscreenElement" with the proper type (35) 
+PASS Document interface: new Document must inherit property "fullscreenEnabled" with the proper type 
+FAIL Document interface: new Document must inherit property "fullscreen" with the proper type assert_inherits: property "fullscreen" not found in prototype chain
+PASS Document interface: new Document must inherit property "exitFullscreen()" with the proper type 
+PASS Document interface: new Document must inherit property "onfullscreenchange" with the proper type 
+PASS Document interface: new Document must inherit property "onfullscreenerror" with the proper type 
+PASS Document interface: new Document must inherit property "fullscreenElement" with the proper type 
 FAIL ShadowRoot interface: attribute fullscreenElement assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined"
 FAIL Element interface: operation requestFullscreen() assert_unreached: Throws "TypeError: Illegal invocation" instead of rejecting promise Reached unreachable code
 PASS Element interface: attribute onfullscreenchange 
 PASS Element interface: attribute onfullscreenerror 
-PASS Element interface: document.createElementNS(null, "test") must inherit property "requestFullscreen" with the proper type (34) 
-PASS Element interface: document.createElementNS(null, "test") must inherit property "onfullscreenchange" with the proper type (35) 
-PASS Element interface: document.createElementNS(null, "test") must inherit property "onfullscreenerror" with the proper type (36) 
+PASS Element interface: document.createElementNS(null, "test") must inherit property "requestFullscreen()" with the proper type 
+PASS Element interface: document.createElementNS(null, "test") must inherit property "onfullscreenchange" with the proper type 
+PASS Element interface: document.createElementNS(null, "test") must inherit property "onfullscreenerror" with the proper type 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness-expected.txt
index cbdd61f6..f1e40d5 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness-expected.txt
@@ -11,7 +11,7 @@
 FAIL Test default toJSON operation of Performance Illegal invocation
 PASS Performance must be primary interface of window.performance 
 PASS Stringification of window.performance 
-PASS Performance interface: window.performance must inherit property "now" with the proper type (0) 
-PASS Performance interface: window.performance must inherit property "toJSON" with the proper type (1) 
+PASS Performance interface: window.performance must inherit property "now()" with the proper type 
+PASS Performance interface: window.performance must inherit property "toJSON()" with the proper type 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html-media-capture/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html-media-capture/idlharness-expected.txt
index 6aa54fd..9239268 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html-media-capture/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/html-media-capture/idlharness-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
 FAIL HTMLInputElement interface: attribute capture assert_true: The prototype object must have a property "capture" expected true got false
-FAIL HTMLInputElement interface: [object HTMLInputElement] must inherit property "capture" with the proper type (0) assert_inherits: property "capture" not found in prototype chain
+FAIL HTMLInputElement interface: [object HTMLInputElement] must inherit property "capture" with the proper type assert_inherits: property "capture" not found in prototype chain
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/browsers/browsing-the-web/history-traversal/PopStateEvent.html b/third_party/WebKit/LayoutTests/external/wpt/html/browsers/browsing-the-web/history-traversal/PopStateEvent.html
index ace09e5..85205c1 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/browsers/browsing-the-web/history-traversal/PopStateEvent.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/browsers/browsing-the-web/history-traversal/PopStateEvent.html
@@ -6,12 +6,6 @@
 <div id="log"></div>
 <script>
 test(function () {
-  var e = document.createEvent('PopStateEvent');
-  var eProto = Object.getPrototypeOf(e);
-  assert_equals(eProto, PopStateEvent.prototype);
-}, 'document.createEvent');
-
-test(function () {
   assert_false('initPopStateEvent' in PopStateEvent.prototype,
                'There should be no PopStateEvent#initPopStateEvent');
 }, 'initPopStateEvent');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces-expected.txt
index 25a4c2c..cdf2e4df 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces-expected.txt
@@ -18,8 +18,8 @@
 PASS Document interface: attribute scripts 
 PASS Document interface: operation getElementsByName(DOMString) 
 PASS Document interface: attribute currentScript 
-PASS Document interface: operation open(DOMString,DOMString) 
-PASS Document interface: operation open(USVString,DOMString,DOMString) 
+PASS Document interface: operation open(DOMString, DOMString) 
+PASS Document interface: operation open(USVString, DOMString, DOMString) 
 PASS Document interface: operation close() 
 PASS Document interface: operation write(DOMString) 
 PASS Document interface: operation writeln(DOMString) 
@@ -27,7 +27,7 @@
 PASS Document interface: attribute activeElement 
 PASS Document interface: operation hasFocus() 
 PASS Document interface: attribute designMode 
-PASS Document interface: operation execCommand(DOMString,boolean,DOMString) 
+PASS Document interface: operation execCommand(DOMString, boolean, DOMString) 
 PASS Document interface: operation queryCommandEnabled(DOMString) 
 PASS Document interface: operation queryCommandIndeterm(DOMString) 
 PASS Document interface: operation queryCommandState(DOMString) 
@@ -110,365 +110,365 @@
 PASS Document interface: attribute oncut 
 PASS Document interface: attribute onpaste 
 PASS Document interface: iframe.contentDocument must have own property "location" 
-PASS Document interface: iframe.contentDocument must inherit property "domain" with the proper type (31) 
-PASS Document interface: iframe.contentDocument must inherit property "referrer" with the proper type (32) 
-PASS Document interface: iframe.contentDocument must inherit property "cookie" with the proper type (33) 
-PASS Document interface: iframe.contentDocument must inherit property "lastModified" with the proper type (34) 
-PASS Document interface: iframe.contentDocument must inherit property "readyState" with the proper type (35) 
-PASS Document interface: iframe.contentDocument must inherit property "title" with the proper type (37) 
-PASS Document interface: iframe.contentDocument must inherit property "dir" with the proper type (38) 
-PASS Document interface: iframe.contentDocument must inherit property "body" with the proper type (39) 
-PASS Document interface: iframe.contentDocument must inherit property "head" with the proper type (40) 
-PASS Document interface: iframe.contentDocument must inherit property "images" with the proper type (41) 
-PASS Document interface: iframe.contentDocument must inherit property "embeds" with the proper type (42) 
-PASS Document interface: iframe.contentDocument must inherit property "plugins" with the proper type (43) 
-PASS Document interface: iframe.contentDocument must inherit property "links" with the proper type (44) 
-PASS Document interface: iframe.contentDocument must inherit property "forms" with the proper type (45) 
-PASS Document interface: iframe.contentDocument must inherit property "scripts" with the proper type (46) 
-PASS Document interface: iframe.contentDocument must inherit property "getElementsByName" with the proper type (47) 
+PASS Document interface: iframe.contentDocument must inherit property "domain" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "referrer" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "cookie" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "lastModified" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "readyState" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "title" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "dir" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "body" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "head" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "images" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "embeds" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "plugins" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "links" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "forms" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "scripts" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "getElementsByName(DOMString)" with the proper type 
 PASS Document interface: calling getElementsByName(DOMString) on iframe.contentDocument with too few arguments must throw TypeError 
-PASS Document interface: iframe.contentDocument must inherit property "currentScript" with the proper type (48) 
-PASS Document interface: iframe.contentDocument must inherit property "open" with the proper type (49) 
-PASS Document interface: calling open(DOMString,DOMString) on iframe.contentDocument with too few arguments must throw TypeError 
-PASS Document interface: iframe.contentDocument must inherit property "open" with the proper type (50) 
-PASS Document interface: calling open(USVString,DOMString,DOMString) on iframe.contentDocument with too few arguments must throw TypeError 
-PASS Document interface: iframe.contentDocument must inherit property "close" with the proper type (51) 
-PASS Document interface: iframe.contentDocument must inherit property "write" with the proper type (52) 
+PASS Document interface: iframe.contentDocument must inherit property "currentScript" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "open(DOMString, DOMString)" with the proper type 
+PASS Document interface: calling open(DOMString, DOMString) on iframe.contentDocument with too few arguments must throw TypeError 
+PASS Document interface: iframe.contentDocument must inherit property "open(USVString, DOMString, DOMString)" with the proper type 
+PASS Document interface: calling open(USVString, DOMString, DOMString) on iframe.contentDocument with too few arguments must throw TypeError 
+PASS Document interface: iframe.contentDocument must inherit property "close()" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "write(DOMString)" with the proper type 
 PASS Document interface: calling write(DOMString) on iframe.contentDocument with too few arguments must throw TypeError 
-PASS Document interface: iframe.contentDocument must inherit property "writeln" with the proper type (53) 
+PASS Document interface: iframe.contentDocument must inherit property "writeln(DOMString)" with the proper type 
 PASS Document interface: calling writeln(DOMString) on iframe.contentDocument with too few arguments must throw TypeError 
-PASS Document interface: iframe.contentDocument must inherit property "defaultView" with the proper type (54) 
-PASS Document interface: iframe.contentDocument must inherit property "activeElement" with the proper type (55) 
-PASS Document interface: iframe.contentDocument must inherit property "hasFocus" with the proper type (56) 
-PASS Document interface: iframe.contentDocument must inherit property "designMode" with the proper type (57) 
-PASS Document interface: iframe.contentDocument must inherit property "execCommand" with the proper type (58) 
-PASS Document interface: calling execCommand(DOMString,boolean,DOMString) on iframe.contentDocument with too few arguments must throw TypeError 
-PASS Document interface: iframe.contentDocument must inherit property "queryCommandEnabled" with the proper type (59) 
+PASS Document interface: iframe.contentDocument must inherit property "defaultView" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "activeElement" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "hasFocus()" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "designMode" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "execCommand(DOMString, boolean, DOMString)" with the proper type 
+PASS Document interface: calling execCommand(DOMString, boolean, DOMString) on iframe.contentDocument with too few arguments must throw TypeError 
+PASS Document interface: iframe.contentDocument must inherit property "queryCommandEnabled(DOMString)" with the proper type 
 PASS Document interface: calling queryCommandEnabled(DOMString) on iframe.contentDocument with too few arguments must throw TypeError 
-PASS Document interface: iframe.contentDocument must inherit property "queryCommandIndeterm" with the proper type (60) 
+PASS Document interface: iframe.contentDocument must inherit property "queryCommandIndeterm(DOMString)" with the proper type 
 PASS Document interface: calling queryCommandIndeterm(DOMString) on iframe.contentDocument with too few arguments must throw TypeError 
-PASS Document interface: iframe.contentDocument must inherit property "queryCommandState" with the proper type (61) 
+PASS Document interface: iframe.contentDocument must inherit property "queryCommandState(DOMString)" with the proper type 
 PASS Document interface: calling queryCommandState(DOMString) on iframe.contentDocument with too few arguments must throw TypeError 
-PASS Document interface: iframe.contentDocument must inherit property "queryCommandSupported" with the proper type (62) 
+PASS Document interface: iframe.contentDocument must inherit property "queryCommandSupported(DOMString)" with the proper type 
 PASS Document interface: calling queryCommandSupported(DOMString) on iframe.contentDocument with too few arguments must throw TypeError 
-PASS Document interface: iframe.contentDocument must inherit property "queryCommandValue" with the proper type (63) 
+PASS Document interface: iframe.contentDocument must inherit property "queryCommandValue(DOMString)" with the proper type 
 PASS Document interface: calling queryCommandValue(DOMString) on iframe.contentDocument with too few arguments must throw TypeError 
-PASS Document interface: iframe.contentDocument must inherit property "onreadystatechange" with the proper type (64) 
-PASS Document interface: iframe.contentDocument must inherit property "fgColor" with the proper type (65) 
-PASS Document interface: iframe.contentDocument must inherit property "linkColor" with the proper type (66) 
-PASS Document interface: iframe.contentDocument must inherit property "vlinkColor" with the proper type (67) 
-PASS Document interface: iframe.contentDocument must inherit property "alinkColor" with the proper type (68) 
-PASS Document interface: iframe.contentDocument must inherit property "bgColor" with the proper type (69) 
-PASS Document interface: iframe.contentDocument must inherit property "anchors" with the proper type (70) 
-PASS Document interface: iframe.contentDocument must inherit property "applets" with the proper type (71) 
-PASS Document interface: iframe.contentDocument must inherit property "clear" with the proper type (72) 
-PASS Document interface: iframe.contentDocument must inherit property "captureEvents" with the proper type (73) 
-PASS Document interface: iframe.contentDocument must inherit property "releaseEvents" with the proper type (74) 
-FAIL Document interface: iframe.contentDocument must inherit property "all" with the proper type (75) assert_in_array: wrong type: not object or function value "undefined" not in array ["object", "function"]
-PASS Document interface: iframe.contentDocument must inherit property "onabort" with the proper type (85) 
-PASS Document interface: iframe.contentDocument must inherit property "onauxclick" with the proper type (86) 
-PASS Document interface: iframe.contentDocument must inherit property "onblur" with the proper type (87) 
-PASS Document interface: iframe.contentDocument must inherit property "oncancel" with the proper type (88) 
-PASS Document interface: iframe.contentDocument must inherit property "oncanplay" with the proper type (89) 
-PASS Document interface: iframe.contentDocument must inherit property "oncanplaythrough" with the proper type (90) 
-PASS Document interface: iframe.contentDocument must inherit property "onchange" with the proper type (91) 
-PASS Document interface: iframe.contentDocument must inherit property "onclick" with the proper type (92) 
-PASS Document interface: iframe.contentDocument must inherit property "onclose" with the proper type (93) 
-PASS Document interface: iframe.contentDocument must inherit property "oncontextmenu" with the proper type (94) 
-PASS Document interface: iframe.contentDocument must inherit property "oncuechange" with the proper type (95) 
-PASS Document interface: iframe.contentDocument must inherit property "ondblclick" with the proper type (96) 
-PASS Document interface: iframe.contentDocument must inherit property "ondrag" with the proper type (97) 
-PASS Document interface: iframe.contentDocument must inherit property "ondragend" with the proper type (98) 
-PASS Document interface: iframe.contentDocument must inherit property "ondragenter" with the proper type (99) 
-FAIL Document interface: iframe.contentDocument must inherit property "ondragexit" with the proper type (100) assert_inherits: property "ondragexit" not found in prototype chain
-PASS Document interface: iframe.contentDocument must inherit property "ondragleave" with the proper type (101) 
-PASS Document interface: iframe.contentDocument must inherit property "ondragover" with the proper type (102) 
-PASS Document interface: iframe.contentDocument must inherit property "ondragstart" with the proper type (103) 
-PASS Document interface: iframe.contentDocument must inherit property "ondrop" with the proper type (104) 
-PASS Document interface: iframe.contentDocument must inherit property "ondurationchange" with the proper type (105) 
-PASS Document interface: iframe.contentDocument must inherit property "onemptied" with the proper type (106) 
-PASS Document interface: iframe.contentDocument must inherit property "onended" with the proper type (107) 
-PASS Document interface: iframe.contentDocument must inherit property "onerror" with the proper type (108) 
-PASS Document interface: iframe.contentDocument must inherit property "onfocus" with the proper type (109) 
-PASS Document interface: iframe.contentDocument must inherit property "oninput" with the proper type (110) 
-PASS Document interface: iframe.contentDocument must inherit property "oninvalid" with the proper type (111) 
-PASS Document interface: iframe.contentDocument must inherit property "onkeydown" with the proper type (112) 
-PASS Document interface: iframe.contentDocument must inherit property "onkeypress" with the proper type (113) 
-PASS Document interface: iframe.contentDocument must inherit property "onkeyup" with the proper type (114) 
-PASS Document interface: iframe.contentDocument must inherit property "onload" with the proper type (115) 
-PASS Document interface: iframe.contentDocument must inherit property "onloadeddata" with the proper type (116) 
-PASS Document interface: iframe.contentDocument must inherit property "onloadedmetadata" with the proper type (117) 
-FAIL Document interface: iframe.contentDocument must inherit property "onloadend" with the proper type (118) assert_inherits: property "onloadend" not found in prototype chain
-PASS Document interface: iframe.contentDocument must inherit property "onloadstart" with the proper type (119) 
-PASS Document interface: iframe.contentDocument must inherit property "onmousedown" with the proper type (120) 
-PASS Document interface: iframe.contentDocument must inherit property "onmouseenter" with the proper type (121) 
-PASS Document interface: iframe.contentDocument must inherit property "onmouseleave" with the proper type (122) 
-PASS Document interface: iframe.contentDocument must inherit property "onmousemove" with the proper type (123) 
-PASS Document interface: iframe.contentDocument must inherit property "onmouseout" with the proper type (124) 
-PASS Document interface: iframe.contentDocument must inherit property "onmouseover" with the proper type (125) 
-PASS Document interface: iframe.contentDocument must inherit property "onmouseup" with the proper type (126) 
-PASS Document interface: iframe.contentDocument must inherit property "onwheel" with the proper type (127) 
-PASS Document interface: iframe.contentDocument must inherit property "onpause" with the proper type (128) 
-PASS Document interface: iframe.contentDocument must inherit property "onplay" with the proper type (129) 
-PASS Document interface: iframe.contentDocument must inherit property "onplaying" with the proper type (130) 
-PASS Document interface: iframe.contentDocument must inherit property "onprogress" with the proper type (131) 
-PASS Document interface: iframe.contentDocument must inherit property "onratechange" with the proper type (132) 
-PASS Document interface: iframe.contentDocument must inherit property "onreset" with the proper type (133) 
-PASS Document interface: iframe.contentDocument must inherit property "onresize" with the proper type (134) 
-PASS Document interface: iframe.contentDocument must inherit property "onscroll" with the proper type (135) 
-PASS Document interface: iframe.contentDocument must inherit property "onseeked" with the proper type (136) 
-PASS Document interface: iframe.contentDocument must inherit property "onseeking" with the proper type (137) 
-PASS Document interface: iframe.contentDocument must inherit property "onselect" with the proper type (138) 
-PASS Document interface: iframe.contentDocument must inherit property "onstalled" with the proper type (139) 
-PASS Document interface: iframe.contentDocument must inherit property "onsubmit" with the proper type (140) 
-PASS Document interface: iframe.contentDocument must inherit property "onsuspend" with the proper type (141) 
-PASS Document interface: iframe.contentDocument must inherit property "ontimeupdate" with the proper type (142) 
-PASS Document interface: iframe.contentDocument must inherit property "ontoggle" with the proper type (143) 
-PASS Document interface: iframe.contentDocument must inherit property "onvolumechange" with the proper type (144) 
-PASS Document interface: iframe.contentDocument must inherit property "onwaiting" with the proper type (145) 
-PASS Document interface: iframe.contentDocument must inherit property "oncopy" with the proper type (146) 
-PASS Document interface: iframe.contentDocument must inherit property "oncut" with the proper type (147) 
-PASS Document interface: iframe.contentDocument must inherit property "onpaste" with the proper type (148) 
+PASS Document interface: iframe.contentDocument must inherit property "onreadystatechange" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "fgColor" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "linkColor" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "vlinkColor" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "alinkColor" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "bgColor" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "anchors" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "applets" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "clear()" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "captureEvents()" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "releaseEvents()" with the proper type 
+FAIL Document interface: iframe.contentDocument must inherit property "all" with the proper type assert_in_array: wrong type: not object or function value "undefined" not in array ["object", "function"]
+PASS Document interface: iframe.contentDocument must inherit property "onabort" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onauxclick" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onblur" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "oncancel" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "oncanplay" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "oncanplaythrough" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onchange" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onclick" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onclose" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "oncontextmenu" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "oncuechange" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "ondblclick" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "ondrag" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "ondragend" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "ondragenter" with the proper type 
+FAIL Document interface: iframe.contentDocument must inherit property "ondragexit" with the proper type assert_inherits: property "ondragexit" not found in prototype chain
+PASS Document interface: iframe.contentDocument must inherit property "ondragleave" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "ondragover" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "ondragstart" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "ondrop" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "ondurationchange" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onemptied" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onended" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onerror" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onfocus" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "oninput" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "oninvalid" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onkeydown" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onkeypress" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onkeyup" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onload" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onloadeddata" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onloadedmetadata" with the proper type 
+FAIL Document interface: iframe.contentDocument must inherit property "onloadend" with the proper type assert_inherits: property "onloadend" not found in prototype chain
+PASS Document interface: iframe.contentDocument must inherit property "onloadstart" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onmousedown" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onmouseenter" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onmouseleave" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onmousemove" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onmouseout" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onmouseover" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onmouseup" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onwheel" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onpause" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onplay" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onplaying" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onprogress" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onratechange" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onreset" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onresize" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onscroll" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onseeked" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onseeking" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onselect" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onstalled" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onsubmit" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onsuspend" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "ontimeupdate" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "ontoggle" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onvolumechange" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onwaiting" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "oncopy" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "oncut" with the proper type 
+PASS Document interface: iframe.contentDocument must inherit property "onpaste" with the proper type 
 PASS Document interface: new Document() must have own property "location" 
-PASS Document interface: new Document() must inherit property "domain" with the proper type (31) 
-PASS Document interface: new Document() must inherit property "referrer" with the proper type (32) 
-PASS Document interface: new Document() must inherit property "cookie" with the proper type (33) 
-PASS Document interface: new Document() must inherit property "lastModified" with the proper type (34) 
-PASS Document interface: new Document() must inherit property "readyState" with the proper type (35) 
-PASS Document interface: new Document() must inherit property "title" with the proper type (37) 
-PASS Document interface: new Document() must inherit property "dir" with the proper type (38) 
-PASS Document interface: new Document() must inherit property "body" with the proper type (39) 
-PASS Document interface: new Document() must inherit property "head" with the proper type (40) 
-PASS Document interface: new Document() must inherit property "images" with the proper type (41) 
-PASS Document interface: new Document() must inherit property "embeds" with the proper type (42) 
-PASS Document interface: new Document() must inherit property "plugins" with the proper type (43) 
-PASS Document interface: new Document() must inherit property "links" with the proper type (44) 
-PASS Document interface: new Document() must inherit property "forms" with the proper type (45) 
-PASS Document interface: new Document() must inherit property "scripts" with the proper type (46) 
-PASS Document interface: new Document() must inherit property "getElementsByName" with the proper type (47) 
+PASS Document interface: new Document() must inherit property "domain" with the proper type 
+PASS Document interface: new Document() must inherit property "referrer" with the proper type 
+PASS Document interface: new Document() must inherit property "cookie" with the proper type 
+PASS Document interface: new Document() must inherit property "lastModified" with the proper type 
+PASS Document interface: new Document() must inherit property "readyState" with the proper type 
+PASS Document interface: new Document() must inherit property "title" with the proper type 
+PASS Document interface: new Document() must inherit property "dir" with the proper type 
+PASS Document interface: new Document() must inherit property "body" with the proper type 
+PASS Document interface: new Document() must inherit property "head" with the proper type 
+PASS Document interface: new Document() must inherit property "images" with the proper type 
+PASS Document interface: new Document() must inherit property "embeds" with the proper type 
+PASS Document interface: new Document() must inherit property "plugins" with the proper type 
+PASS Document interface: new Document() must inherit property "links" with the proper type 
+PASS Document interface: new Document() must inherit property "forms" with the proper type 
+PASS Document interface: new Document() must inherit property "scripts" with the proper type 
+PASS Document interface: new Document() must inherit property "getElementsByName(DOMString)" with the proper type 
 PASS Document interface: calling getElementsByName(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "currentScript" with the proper type (48) 
-PASS Document interface: new Document() must inherit property "open" with the proper type (49) 
-PASS Document interface: calling open(DOMString,DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "open" with the proper type (50) 
-PASS Document interface: calling open(USVString,DOMString,DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "close" with the proper type (51) 
-PASS Document interface: new Document() must inherit property "write" with the proper type (52) 
+PASS Document interface: new Document() must inherit property "currentScript" with the proper type 
+PASS Document interface: new Document() must inherit property "open(DOMString, DOMString)" with the proper type 
+PASS Document interface: calling open(DOMString, DOMString) on new Document() with too few arguments must throw TypeError 
+PASS Document interface: new Document() must inherit property "open(USVString, DOMString, DOMString)" with the proper type 
+PASS Document interface: calling open(USVString, DOMString, DOMString) on new Document() with too few arguments must throw TypeError 
+PASS Document interface: new Document() must inherit property "close()" with the proper type 
+PASS Document interface: new Document() must inherit property "write(DOMString)" with the proper type 
 PASS Document interface: calling write(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "writeln" with the proper type (53) 
+PASS Document interface: new Document() must inherit property "writeln(DOMString)" with the proper type 
 PASS Document interface: calling writeln(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "defaultView" with the proper type (54) 
-PASS Document interface: new Document() must inherit property "activeElement" with the proper type (55) 
-PASS Document interface: new Document() must inherit property "hasFocus" with the proper type (56) 
-PASS Document interface: new Document() must inherit property "designMode" with the proper type (57) 
-PASS Document interface: new Document() must inherit property "execCommand" with the proper type (58) 
-PASS Document interface: calling execCommand(DOMString,boolean,DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "queryCommandEnabled" with the proper type (59) 
+PASS Document interface: new Document() must inherit property "defaultView" with the proper type 
+PASS Document interface: new Document() must inherit property "activeElement" with the proper type 
+PASS Document interface: new Document() must inherit property "hasFocus()" with the proper type 
+PASS Document interface: new Document() must inherit property "designMode" with the proper type 
+PASS Document interface: new Document() must inherit property "execCommand(DOMString, boolean, DOMString)" with the proper type 
+PASS Document interface: calling execCommand(DOMString, boolean, DOMString) on new Document() with too few arguments must throw TypeError 
+PASS Document interface: new Document() must inherit property "queryCommandEnabled(DOMString)" with the proper type 
 PASS Document interface: calling queryCommandEnabled(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "queryCommandIndeterm" with the proper type (60) 
+PASS Document interface: new Document() must inherit property "queryCommandIndeterm(DOMString)" with the proper type 
 PASS Document interface: calling queryCommandIndeterm(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "queryCommandState" with the proper type (61) 
+PASS Document interface: new Document() must inherit property "queryCommandState(DOMString)" with the proper type 
 PASS Document interface: calling queryCommandState(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "queryCommandSupported" with the proper type (62) 
+PASS Document interface: new Document() must inherit property "queryCommandSupported(DOMString)" with the proper type 
 PASS Document interface: calling queryCommandSupported(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "queryCommandValue" with the proper type (63) 
+PASS Document interface: new Document() must inherit property "queryCommandValue(DOMString)" with the proper type 
 PASS Document interface: calling queryCommandValue(DOMString) on new Document() with too few arguments must throw TypeError 
-PASS Document interface: new Document() must inherit property "onreadystatechange" with the proper type (64) 
-FAIL Document interface: new Document() must inherit property "fgColor" with the proper type (65) assert_inherits: property "fgColor" not found in prototype chain
-FAIL Document interface: new Document() must inherit property "linkColor" with the proper type (66) assert_inherits: property "linkColor" not found in prototype chain
-FAIL Document interface: new Document() must inherit property "vlinkColor" with the proper type (67) assert_inherits: property "vlinkColor" not found in prototype chain
-FAIL Document interface: new Document() must inherit property "alinkColor" with the proper type (68) assert_inherits: property "alinkColor" not found in prototype chain
-FAIL Document interface: new Document() must inherit property "bgColor" with the proper type (69) assert_inherits: property "bgColor" not found in prototype chain
-PASS Document interface: new Document() must inherit property "anchors" with the proper type (70) 
-PASS Document interface: new Document() must inherit property "applets" with the proper type (71) 
-FAIL Document interface: new Document() must inherit property "clear" with the proper type (72) assert_inherits: property "clear" not found in prototype chain
-FAIL Document interface: new Document() must inherit property "captureEvents" with the proper type (73) assert_inherits: property "captureEvents" not found in prototype chain
-FAIL Document interface: new Document() must inherit property "releaseEvents" with the proper type (74) assert_inherits: property "releaseEvents" not found in prototype chain
-FAIL Document interface: new Document() must inherit property "all" with the proper type (75) assert_inherits: property "all" not found in prototype chain
-PASS Document interface: new Document() must inherit property "onabort" with the proper type (85) 
-PASS Document interface: new Document() must inherit property "onauxclick" with the proper type (86) 
-PASS Document interface: new Document() must inherit property "onblur" with the proper type (87) 
-PASS Document interface: new Document() must inherit property "oncancel" with the proper type (88) 
-PASS Document interface: new Document() must inherit property "oncanplay" with the proper type (89) 
-PASS Document interface: new Document() must inherit property "oncanplaythrough" with the proper type (90) 
-PASS Document interface: new Document() must inherit property "onchange" with the proper type (91) 
-PASS Document interface: new Document() must inherit property "onclick" with the proper type (92) 
-PASS Document interface: new Document() must inherit property "onclose" with the proper type (93) 
-PASS Document interface: new Document() must inherit property "oncontextmenu" with the proper type (94) 
-PASS Document interface: new Document() must inherit property "oncuechange" with the proper type (95) 
-PASS Document interface: new Document() must inherit property "ondblclick" with the proper type (96) 
-PASS Document interface: new Document() must inherit property "ondrag" with the proper type (97) 
-PASS Document interface: new Document() must inherit property "ondragend" with the proper type (98) 
-PASS Document interface: new Document() must inherit property "ondragenter" with the proper type (99) 
-FAIL Document interface: new Document() must inherit property "ondragexit" with the proper type (100) assert_inherits: property "ondragexit" not found in prototype chain
-PASS Document interface: new Document() must inherit property "ondragleave" with the proper type (101) 
-PASS Document interface: new Document() must inherit property "ondragover" with the proper type (102) 
-PASS Document interface: new Document() must inherit property "ondragstart" with the proper type (103) 
-PASS Document interface: new Document() must inherit property "ondrop" with the proper type (104) 
-PASS Document interface: new Document() must inherit property "ondurationchange" with the proper type (105) 
-PASS Document interface: new Document() must inherit property "onemptied" with the proper type (106) 
-PASS Document interface: new Document() must inherit property "onended" with the proper type (107) 
-PASS Document interface: new Document() must inherit property "onerror" with the proper type (108) 
-PASS Document interface: new Document() must inherit property "onfocus" with the proper type (109) 
-PASS Document interface: new Document() must inherit property "oninput" with the proper type (110) 
-PASS Document interface: new Document() must inherit property "oninvalid" with the proper type (111) 
-PASS Document interface: new Document() must inherit property "onkeydown" with the proper type (112) 
-PASS Document interface: new Document() must inherit property "onkeypress" with the proper type (113) 
-PASS Document interface: new Document() must inherit property "onkeyup" with the proper type (114) 
-PASS Document interface: new Document() must inherit property "onload" with the proper type (115) 
-PASS Document interface: new Document() must inherit property "onloadeddata" with the proper type (116) 
-PASS Document interface: new Document() must inherit property "onloadedmetadata" with the proper type (117) 
-FAIL Document interface: new Document() must inherit property "onloadend" with the proper type (118) assert_inherits: property "onloadend" not found in prototype chain
-PASS Document interface: new Document() must inherit property "onloadstart" with the proper type (119) 
-PASS Document interface: new Document() must inherit property "onmousedown" with the proper type (120) 
-PASS Document interface: new Document() must inherit property "onmouseenter" with the proper type (121) 
-PASS Document interface: new Document() must inherit property "onmouseleave" with the proper type (122) 
-PASS Document interface: new Document() must inherit property "onmousemove" with the proper type (123) 
-PASS Document interface: new Document() must inherit property "onmouseout" with the proper type (124) 
-PASS Document interface: new Document() must inherit property "onmouseover" with the proper type (125) 
-PASS Document interface: new Document() must inherit property "onmouseup" with the proper type (126) 
-PASS Document interface: new Document() must inherit property "onwheel" with the proper type (127) 
-PASS Document interface: new Document() must inherit property "onpause" with the proper type (128) 
-PASS Document interface: new Document() must inherit property "onplay" with the proper type (129) 
-PASS Document interface: new Document() must inherit property "onplaying" with the proper type (130) 
-PASS Document interface: new Document() must inherit property "onprogress" with the proper type (131) 
-PASS Document interface: new Document() must inherit property "onratechange" with the proper type (132) 
-PASS Document interface: new Document() must inherit property "onreset" with the proper type (133) 
-PASS Document interface: new Document() must inherit property "onresize" with the proper type (134) 
-PASS Document interface: new Document() must inherit property "onscroll" with the proper type (135) 
-PASS Document interface: new Document() must inherit property "onseeked" with the proper type (136) 
-PASS Document interface: new Document() must inherit property "onseeking" with the proper type (137) 
-PASS Document interface: new Document() must inherit property "onselect" with the proper type (138) 
-PASS Document interface: new Document() must inherit property "onstalled" with the proper type (139) 
-PASS Document interface: new Document() must inherit property "onsubmit" with the proper type (140) 
-PASS Document interface: new Document() must inherit property "onsuspend" with the proper type (141) 
-PASS Document interface: new Document() must inherit property "ontimeupdate" with the proper type (142) 
-PASS Document interface: new Document() must inherit property "ontoggle" with the proper type (143) 
-PASS Document interface: new Document() must inherit property "onvolumechange" with the proper type (144) 
-PASS Document interface: new Document() must inherit property "onwaiting" with the proper type (145) 
-PASS Document interface: new Document() must inherit property "oncopy" with the proper type (146) 
-PASS Document interface: new Document() must inherit property "oncut" with the proper type (147) 
-PASS Document interface: new Document() must inherit property "onpaste" with the proper type (148) 
+PASS Document interface: new Document() must inherit property "onreadystatechange" with the proper type 
+FAIL Document interface: new Document() must inherit property "fgColor" with the proper type assert_inherits: property "fgColor" not found in prototype chain
+FAIL Document interface: new Document() must inherit property "linkColor" with the proper type assert_inherits: property "linkColor" not found in prototype chain
+FAIL Document interface: new Document() must inherit property "vlinkColor" with the proper type assert_inherits: property "vlinkColor" not found in prototype chain
+FAIL Document interface: new Document() must inherit property "alinkColor" with the proper type assert_inherits: property "alinkColor" not found in prototype chain
+FAIL Document interface: new Document() must inherit property "bgColor" with the proper type assert_inherits: property "bgColor" not found in prototype chain
+PASS Document interface: new Document() must inherit property "anchors" with the proper type 
+PASS Document interface: new Document() must inherit property "applets" with the proper type 
+FAIL Document interface: new Document() must inherit property "clear()" with the proper type assert_inherits: property "clear" not found in prototype chain
+FAIL Document interface: new Document() must inherit property "captureEvents()" with the proper type assert_inherits: property "captureEvents" not found in prototype chain
+FAIL Document interface: new Document() must inherit property "releaseEvents()" with the proper type assert_inherits: property "releaseEvents" not found in prototype chain
+FAIL Document interface: new Document() must inherit property "all" with the proper type assert_inherits: property "all" not found in prototype chain
+PASS Document interface: new Document() must inherit property "onabort" with the proper type 
+PASS Document interface: new Document() must inherit property "onauxclick" with the proper type 
+PASS Document interface: new Document() must inherit property "onblur" with the proper type 
+PASS Document interface: new Document() must inherit property "oncancel" with the proper type 
+PASS Document interface: new Document() must inherit property "oncanplay" with the proper type 
+PASS Document interface: new Document() must inherit property "oncanplaythrough" with the proper type 
+PASS Document interface: new Document() must inherit property "onchange" with the proper type 
+PASS Document interface: new Document() must inherit property "onclick" with the proper type 
+PASS Document interface: new Document() must inherit property "onclose" with the proper type 
+PASS Document interface: new Document() must inherit property "oncontextmenu" with the proper type 
+PASS Document interface: new Document() must inherit property "oncuechange" with the proper type 
+PASS Document interface: new Document() must inherit property "ondblclick" with the proper type 
+PASS Document interface: new Document() must inherit property "ondrag" with the proper type 
+PASS Document interface: new Document() must inherit property "ondragend" with the proper type 
+PASS Document interface: new Document() must inherit property "ondragenter" with the proper type 
+FAIL Document interface: new Document() must inherit property "ondragexit" with the proper type assert_inherits: property "ondragexit" not found in prototype chain
+PASS Document interface: new Document() must inherit property "ondragleave" with the proper type 
+PASS Document interface: new Document() must inherit property "ondragover" with the proper type 
+PASS Document interface: new Document() must inherit property "ondragstart" with the proper type 
+PASS Document interface: new Document() must inherit property "ondrop" with the proper type 
+PASS Document interface: new Document() must inherit property "ondurationchange" with the proper type 
+PASS Document interface: new Document() must inherit property "onemptied" with the proper type 
+PASS Document interface: new Document() must inherit property "onended" with the proper type 
+PASS Document interface: new Document() must inherit property "onerror" with the proper type 
+PASS Document interface: new Document() must inherit property "onfocus" with the proper type 
+PASS Document interface: new Document() must inherit property "oninput" with the proper type 
+PASS Document interface: new Document() must inherit property "oninvalid" with the proper type 
+PASS Document interface: new Document() must inherit property "onkeydown" with the proper type 
+PASS Document interface: new Document() must inherit property "onkeypress" with the proper type 
+PASS Document interface: new Document() must inherit property "onkeyup" with the proper type 
+PASS Document interface: new Document() must inherit property "onload" with the proper type 
+PASS Document interface: new Document() must inherit property "onloadeddata" with the proper type 
+PASS Document interface: new Document() must inherit property "onloadedmetadata" with the proper type 
+FAIL Document interface: new Document() must inherit property "onloadend" with the proper type assert_inherits: property "onloadend" not found in prototype chain
+PASS Document interface: new Document() must inherit property "onloadstart" with the proper type 
+PASS Document interface: new Document() must inherit property "onmousedown" with the proper type 
+PASS Document interface: new Document() must inherit property "onmouseenter" with the proper type 
+PASS Document interface: new Document() must inherit property "onmouseleave" with the proper type 
+PASS Document interface: new Document() must inherit property "onmousemove" with the proper type 
+PASS Document interface: new Document() must inherit property "onmouseout" with the proper type 
+PASS Document interface: new Document() must inherit property "onmouseover" with the proper type 
+PASS Document interface: new Document() must inherit property "onmouseup" with the proper type 
+PASS Document interface: new Document() must inherit property "onwheel" with the proper type 
+PASS Document interface: new Document() must inherit property "onpause" with the proper type 
+PASS Document interface: new Document() must inherit property "onplay" with the proper type 
+PASS Document interface: new Document() must inherit property "onplaying" with the proper type 
+PASS Document interface: new Document() must inherit property "onprogress" with the proper type 
+PASS Document interface: new Document() must inherit property "onratechange" with the proper type 
+PASS Document interface: new Document() must inherit property "onreset" with the proper type 
+PASS Document interface: new Document() must inherit property "onresize" with the proper type 
+PASS Document interface: new Document() must inherit property "onscroll" with the proper type 
+PASS Document interface: new Document() must inherit property "onseeked" with the proper type 
+PASS Document interface: new Document() must inherit property "onseeking" with the proper type 
+PASS Document interface: new Document() must inherit property "onselect" with the proper type 
+PASS Document interface: new Document() must inherit property "onstalled" with the proper type 
+PASS Document interface: new Document() must inherit property "onsubmit" with the proper type 
+PASS Document interface: new Document() must inherit property "onsuspend" with the proper type 
+PASS Document interface: new Document() must inherit property "ontimeupdate" with the proper type 
+PASS Document interface: new Document() must inherit property "ontoggle" with the proper type 
+PASS Document interface: new Document() must inherit property "onvolumechange" with the proper type 
+PASS Document interface: new Document() must inherit property "onwaiting" with the proper type 
+PASS Document interface: new Document() must inherit property "oncopy" with the proper type 
+PASS Document interface: new Document() must inherit property "oncut" with the proper type 
+PASS Document interface: new Document() must inherit property "onpaste" with the proper type 
 PASS Document interface: document.implementation.createDocument(null, "", null) must have own property "location" 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "domain" with the proper type (31) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "referrer" with the proper type (32) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "cookie" with the proper type (33) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "lastModified" with the proper type (34) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "readyState" with the proper type (35) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "title" with the proper type (37) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "dir" with the proper type (38) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "body" with the proper type (39) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "head" with the proper type (40) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "images" with the proper type (41) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "embeds" with the proper type (42) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "plugins" with the proper type (43) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "links" with the proper type (44) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "forms" with the proper type (45) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "scripts" with the proper type (46) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "getElementsByName" with the proper type (47) 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "domain" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "referrer" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "cookie" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "lastModified" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "readyState" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "title" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "dir" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "body" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "head" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "images" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "embeds" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "plugins" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "links" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "forms" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "scripts" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "getElementsByName(DOMString)" with the proper type 
 PASS Document interface: calling getElementsByName(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "currentScript" with the proper type (48) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "open" with the proper type (49) 
-PASS Document interface: calling open(DOMString,DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "open" with the proper type (50) 
-PASS Document interface: calling open(USVString,DOMString,DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "close" with the proper type (51) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "write" with the proper type (52) 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "currentScript" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "open(DOMString, DOMString)" with the proper type 
+PASS Document interface: calling open(DOMString, DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "open(USVString, DOMString, DOMString)" with the proper type 
+PASS Document interface: calling open(USVString, DOMString, DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "close()" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "write(DOMString)" with the proper type 
 PASS Document interface: calling write(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "writeln" with the proper type (53) 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "writeln(DOMString)" with the proper type 
 PASS Document interface: calling writeln(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "defaultView" with the proper type (54) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "activeElement" with the proper type (55) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "hasFocus" with the proper type (56) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "designMode" with the proper type (57) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "execCommand" with the proper type (58) 
-PASS Document interface: calling execCommand(DOMString,boolean,DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandEnabled" with the proper type (59) 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "defaultView" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "activeElement" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "hasFocus()" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "designMode" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "execCommand(DOMString, boolean, DOMString)" with the proper type 
+PASS Document interface: calling execCommand(DOMString, boolean, DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandEnabled(DOMString)" with the proper type 
 PASS Document interface: calling queryCommandEnabled(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandIndeterm" with the proper type (60) 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandIndeterm(DOMString)" with the proper type 
 PASS Document interface: calling queryCommandIndeterm(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandState" with the proper type (61) 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandState(DOMString)" with the proper type 
 PASS Document interface: calling queryCommandState(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandSupported" with the proper type (62) 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandSupported(DOMString)" with the proper type 
 PASS Document interface: calling queryCommandSupported(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandValue" with the proper type (63) 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandValue(DOMString)" with the proper type 
 PASS Document interface: calling queryCommandValue(DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onreadystatechange" with the proper type (64) 
-FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "fgColor" with the proper type (65) assert_inherits: property "fgColor" not found in prototype chain
-FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "linkColor" with the proper type (66) assert_inherits: property "linkColor" not found in prototype chain
-FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "vlinkColor" with the proper type (67) assert_inherits: property "vlinkColor" not found in prototype chain
-FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "alinkColor" with the proper type (68) assert_inherits: property "alinkColor" not found in prototype chain
-FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "bgColor" with the proper type (69) assert_inherits: property "bgColor" not found in prototype chain
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "anchors" with the proper type (70) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "applets" with the proper type (71) 
-FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "clear" with the proper type (72) assert_inherits: property "clear" not found in prototype chain
-FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "captureEvents" with the proper type (73) assert_inherits: property "captureEvents" not found in prototype chain
-FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "releaseEvents" with the proper type (74) assert_inherits: property "releaseEvents" not found in prototype chain
-FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "all" with the proper type (75) assert_inherits: property "all" not found in prototype chain
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onabort" with the proper type (85) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onauxclick" with the proper type (86) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onblur" with the proper type (87) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncancel" with the proper type (88) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncanplay" with the proper type (89) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncanplaythrough" with the proper type (90) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onchange" with the proper type (91) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onclick" with the proper type (92) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onclose" with the proper type (93) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncontextmenu" with the proper type (94) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncuechange" with the proper type (95) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondblclick" with the proper type (96) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondrag" with the proper type (97) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragend" with the proper type (98) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragenter" with the proper type (99) 
-FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragexit" with the proper type (100) assert_inherits: property "ondragexit" not found in prototype chain
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragleave" with the proper type (101) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragover" with the proper type (102) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragstart" with the proper type (103) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondrop" with the proper type (104) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondurationchange" with the proper type (105) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onemptied" with the proper type (106) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onended" with the proper type (107) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onerror" with the proper type (108) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onfocus" with the proper type (109) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oninput" with the proper type (110) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oninvalid" with the proper type (111) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onkeydown" with the proper type (112) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onkeypress" with the proper type (113) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onkeyup" with the proper type (114) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onload" with the proper type (115) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadeddata" with the proper type (116) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadedmetadata" with the proper type (117) 
-FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadend" with the proper type (118) assert_inherits: property "onloadend" not found in prototype chain
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadstart" with the proper type (119) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmousedown" with the proper type (120) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseenter" with the proper type (121) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseleave" with the proper type (122) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmousemove" with the proper type (123) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseout" with the proper type (124) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseover" with the proper type (125) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseup" with the proper type (126) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onwheel" with the proper type (127) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onpause" with the proper type (128) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onplay" with the proper type (129) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onplaying" with the proper type (130) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onprogress" with the proper type (131) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onratechange" with the proper type (132) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onreset" with the proper type (133) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onresize" with the proper type (134) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onscroll" with the proper type (135) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onseeked" with the proper type (136) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onseeking" with the proper type (137) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onselect" with the proper type (138) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onstalled" with the proper type (139) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onsubmit" with the proper type (140) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onsuspend" with the proper type (141) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ontimeupdate" with the proper type (142) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ontoggle" with the proper type (143) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onvolumechange" with the proper type (144) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onwaiting" with the proper type (145) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncopy" with the proper type (146) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncut" with the proper type (147) 
-PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onpaste" with the proper type (148) 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onreadystatechange" with the proper type 
+FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "fgColor" with the proper type assert_inherits: property "fgColor" not found in prototype chain
+FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "linkColor" with the proper type assert_inherits: property "linkColor" not found in prototype chain
+FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "vlinkColor" with the proper type assert_inherits: property "vlinkColor" not found in prototype chain
+FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "alinkColor" with the proper type assert_inherits: property "alinkColor" not found in prototype chain
+FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "bgColor" with the proper type assert_inherits: property "bgColor" not found in prototype chain
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "anchors" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "applets" with the proper type 
+FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "clear()" with the proper type assert_inherits: property "clear" not found in prototype chain
+FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "captureEvents()" with the proper type assert_inherits: property "captureEvents" not found in prototype chain
+FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "releaseEvents()" with the proper type assert_inherits: property "releaseEvents" not found in prototype chain
+FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "all" with the proper type assert_inherits: property "all" not found in prototype chain
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onabort" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onauxclick" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onblur" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncancel" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncanplay" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncanplaythrough" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onchange" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onclick" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onclose" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncontextmenu" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncuechange" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondblclick" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondrag" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragend" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragenter" with the proper type 
+FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragexit" with the proper type assert_inherits: property "ondragexit" not found in prototype chain
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragleave" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragover" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondragstart" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondrop" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ondurationchange" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onemptied" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onended" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onerror" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onfocus" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oninput" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oninvalid" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onkeydown" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onkeypress" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onkeyup" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onload" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadeddata" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadedmetadata" with the proper type 
+FAIL Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadend" with the proper type assert_inherits: property "onloadend" not found in prototype chain
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadstart" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmousedown" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseenter" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseleave" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmousemove" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseout" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseover" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmouseup" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onwheel" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onpause" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onplay" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onplaying" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onprogress" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onratechange" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onreset" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onresize" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onscroll" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onseeked" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onseeking" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onselect" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onstalled" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onsubmit" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onsuspend" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ontimeupdate" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "ontoggle" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onvolumechange" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onwaiting" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncopy" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncut" with the proper type 
+PASS Document interface: document.implementation.createDocument(null, "", null) must inherit property "onpaste" with the proper type 
 PASS Touch interface: attribute region 
 PASS MouseEvent interface: attribute region 
 PASS HTMLAllCollection interface: existence and properties of interface object 
@@ -482,12 +482,12 @@
 PASS HTMLAllCollection interface: operation namedItem(DOMString) 
 FAIL HTMLAllCollection must be primary interface of document.all assert_equals: wrong typeof object expected "function" but got "undefined"
 FAIL Stringification of document.all assert_equals: wrong typeof object expected "function" but got "undefined"
-FAIL HTMLAllCollection interface: document.all must inherit property "length" with the proper type (0) assert_equals: wrong typeof object expected "function" but got "undefined"
-FAIL HTMLAllCollection interface: document.all must inherit property "item" with the proper type (1) assert_equals: wrong typeof object expected "function" but got "undefined"
+FAIL HTMLAllCollection interface: document.all must inherit property "length" with the proper type assert_equals: wrong typeof object expected "function" but got "undefined"
+FAIL HTMLAllCollection interface: document.all must inherit property "item(unsigned long)" with the proper type assert_equals: wrong typeof object expected "function" but got "undefined"
 FAIL HTMLAllCollection interface: calling item(unsigned long) on document.all with too few arguments must throw TypeError assert_equals: wrong typeof object expected "function" but got "undefined"
-FAIL HTMLAllCollection interface: document.all must inherit property "item" with the proper type (2) assert_equals: wrong typeof object expected "function" but got "undefined"
+FAIL HTMLAllCollection interface: document.all must inherit property "item(DOMString)" with the proper type assert_equals: wrong typeof object expected "function" but got "undefined"
 FAIL HTMLAllCollection interface: calling item(DOMString) on document.all with too few arguments must throw TypeError assert_equals: wrong typeof object expected "function" but got "undefined"
-FAIL HTMLAllCollection interface: document.all must inherit property "namedItem" with the proper type (3) assert_equals: wrong typeof object expected "function" but got "undefined"
+FAIL HTMLAllCollection interface: document.all must inherit property "namedItem(DOMString)" with the proper type assert_equals: wrong typeof object expected "function" but got "undefined"
 FAIL HTMLAllCollection interface: calling namedItem(DOMString) on document.all with too few arguments must throw TypeError assert_equals: wrong typeof object expected "function" but got "undefined"
 PASS HTMLFormControlsCollection interface: existence and properties of interface object 
 PASS HTMLFormControlsCollection interface object length 
@@ -497,7 +497,7 @@
 PASS HTMLFormControlsCollection interface: operation namedItem(DOMString) 
 PASS HTMLFormControlsCollection must be primary interface of document.createElement("form").elements 
 PASS Stringification of document.createElement("form").elements 
-PASS HTMLFormControlsCollection interface: document.createElement("form").elements must inherit property "namedItem" with the proper type (0) 
+PASS HTMLFormControlsCollection interface: document.createElement("form").elements must inherit property "namedItem(DOMString)" with the proper type 
 PASS HTMLFormControlsCollection interface: calling namedItem(DOMString) on document.createElement("form").elements with too few arguments must throw TypeError 
 PASS RadioNodeList interface: existence and properties of interface object 
 PASS RadioNodeList interface object length 
@@ -511,17 +511,17 @@
 PASS HTMLOptionsCollection interface: existence and properties of interface prototype object 
 PASS HTMLOptionsCollection interface: existence and properties of interface prototype object's "constructor" property 
 PASS HTMLOptionsCollection interface: attribute length 
-PASS HTMLOptionsCollection interface: operation add([object Object],[object Object],[object Object],[object Object]) 
+PASS HTMLOptionsCollection interface: operation add([object Object],[object Object], [object Object],[object Object]) 
 PASS HTMLOptionsCollection interface: operation remove(long) 
 PASS HTMLOptionsCollection interface: attribute selectedIndex 
 PASS HTMLOptionsCollection must be primary interface of document.createElement("select").options 
 PASS Stringification of document.createElement("select").options 
-PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "length" with the proper type (0) 
-PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "add" with the proper type (2) 
-PASS HTMLOptionsCollection interface: calling add([object Object],[object Object],[object Object],[object Object]) on document.createElement("select").options with too few arguments must throw TypeError 
-PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "remove" with the proper type (3) 
+PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "length" with the proper type 
+PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "add([object Object],[object Object], [object Object],[object Object])" with the proper type 
+PASS HTMLOptionsCollection interface: calling add([object Object],[object Object], [object Object],[object Object]) on document.createElement("select").options with too few arguments must throw TypeError 
+PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "remove(long)" with the proper type 
 PASS HTMLOptionsCollection interface: calling remove(long) on document.createElement("select").options with too few arguments must throw TypeError 
-PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "selectedIndex" with the proper type (4) 
+PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "selectedIndex" with the proper type 
 PASS DOMStringMap interface: existence and properties of interface object 
 PASS DOMStringMap interface object length 
 PASS DOMStringMap interface object name 
@@ -618,88 +618,88 @@
 PASS HTMLElement interface: attribute isContentEditable 
 PASS HTMLElement must be primary interface of document.createElement("noscript") 
 PASS Stringification of document.createElement("noscript") 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "title" with the proper type (0) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "lang" with the proper type (1) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "translate" with the proper type (2) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "dir" with the proper type (3) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "dataset" with the proper type (4) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "hidden" with the proper type (5) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "click" with the proper type (6) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "tabIndex" with the proper type (7) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "focus" with the proper type (8) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "blur" with the proper type (9) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "accessKey" with the proper type (10) 
-FAIL HTMLElement interface: document.createElement("noscript") must inherit property "accessKeyLabel" with the proper type (11) assert_inherits: property "accessKeyLabel" not found in prototype chain
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "draggable" with the proper type (12) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "spellcheck" with the proper type (13) 
-FAIL HTMLElement interface: document.createElement("noscript") must inherit property "forceSpellCheck" with the proper type (14) assert_inherits: property "forceSpellCheck" not found in prototype chain
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "innerText" with the proper type (15) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onabort" with the proper type (16) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onauxclick" with the proper type (17) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onblur" with the proper type (18) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncancel" with the proper type (19) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncanplay" with the proper type (20) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncanplaythrough" with the proper type (21) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onchange" with the proper type (22) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onclick" with the proper type (23) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onclose" with the proper type (24) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncontextmenu" with the proper type (25) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncuechange" with the proper type (26) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondblclick" with the proper type (27) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondrag" with the proper type (28) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragend" with the proper type (29) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragenter" with the proper type (30) 
-FAIL HTMLElement interface: document.createElement("noscript") must inherit property "ondragexit" with the proper type (31) assert_inherits: property "ondragexit" not found in prototype chain
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragleave" with the proper type (32) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragover" with the proper type (33) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragstart" with the proper type (34) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondrop" with the proper type (35) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondurationchange" with the proper type (36) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onemptied" with the proper type (37) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onended" with the proper type (38) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onerror" with the proper type (39) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onfocus" with the proper type (40) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oninput" with the proper type (41) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oninvalid" with the proper type (42) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onkeydown" with the proper type (43) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onkeypress" with the proper type (44) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onkeyup" with the proper type (45) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onload" with the proper type (46) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onloadeddata" with the proper type (47) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onloadedmetadata" with the proper type (48) 
-FAIL HTMLElement interface: document.createElement("noscript") must inherit property "onloadend" with the proper type (49) assert_inherits: property "onloadend" not found in prototype chain
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onloadstart" with the proper type (50) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmousedown" with the proper type (51) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseenter" with the proper type (52) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseleave" with the proper type (53) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmousemove" with the proper type (54) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseout" with the proper type (55) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseover" with the proper type (56) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseup" with the proper type (57) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwheel" with the proper type (58) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onpause" with the proper type (59) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onplay" with the proper type (60) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onplaying" with the proper type (61) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onprogress" with the proper type (62) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onratechange" with the proper type (63) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onreset" with the proper type (64) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onresize" with the proper type (65) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onscroll" with the proper type (66) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onseeked" with the proper type (67) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onseeking" with the proper type (68) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onselect" with the proper type (69) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onstalled" with the proper type (70) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onsubmit" with the proper type (71) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onsuspend" with the proper type (72) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ontimeupdate" with the proper type (73) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ontoggle" with the proper type (74) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onvolumechange" with the proper type (75) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwaiting" with the proper type (76) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncopy" with the proper type (77) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncut" with the proper type (78) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onpaste" with the proper type (79) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "contentEditable" with the proper type (80) 
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "isContentEditable" with the proper type (81) 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "title" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "lang" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "translate" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "dir" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "dataset" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "hidden" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "click()" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "tabIndex" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "focus()" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "blur()" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "accessKey" with the proper type 
+FAIL HTMLElement interface: document.createElement("noscript") must inherit property "accessKeyLabel" with the proper type assert_inherits: property "accessKeyLabel" not found in prototype chain
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "draggable" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "spellcheck" with the proper type 
+FAIL HTMLElement interface: document.createElement("noscript") must inherit property "forceSpellCheck()" with the proper type assert_inherits: property "forceSpellCheck" not found in prototype chain
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "innerText" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onabort" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onauxclick" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onblur" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncancel" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncanplay" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncanplaythrough" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onchange" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onclick" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onclose" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncontextmenu" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncuechange" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondblclick" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondrag" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragend" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragenter" with the proper type 
+FAIL HTMLElement interface: document.createElement("noscript") must inherit property "ondragexit" with the proper type assert_inherits: property "ondragexit" not found in prototype chain
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragleave" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragover" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragstart" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondrop" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondurationchange" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onemptied" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onended" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onerror" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onfocus" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "oninput" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "oninvalid" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onkeydown" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onkeypress" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onkeyup" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onload" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onloadeddata" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onloadedmetadata" with the proper type 
+FAIL HTMLElement interface: document.createElement("noscript") must inherit property "onloadend" with the proper type assert_inherits: property "onloadend" not found in prototype chain
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onloadstart" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmousedown" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseenter" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseleave" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmousemove" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseout" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseover" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseup" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwheel" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onpause" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onplay" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onplaying" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onprogress" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onratechange" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onreset" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onresize" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onscroll" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onseeked" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onseeking" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onselect" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onstalled" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onsubmit" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onsuspend" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "ontimeupdate" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "ontoggle" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onvolumechange" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwaiting" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncopy" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncut" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "onpaste" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "contentEditable" with the proper type 
+PASS HTMLElement interface: document.createElement("noscript") must inherit property "isContentEditable" with the proper type 
 PASS HTMLUnknownElement interface: existence and properties of interface object 
 PASS HTMLUnknownElement interface object length 
 PASS HTMLUnknownElement interface object name 
@@ -715,7 +715,7 @@
 PASS HTMLHtmlElement interface: attribute version 
 PASS HTMLHtmlElement must be primary interface of document.createElement("html") 
 PASS Stringification of document.createElement("html") 
-PASS HTMLHtmlElement interface: document.createElement("html") must inherit property "version" with the proper type (0) 
+PASS HTMLHtmlElement interface: document.createElement("html") must inherit property "version" with the proper type 
 PASS HTMLHeadElement interface: existence and properties of interface object 
 PASS HTMLHeadElement interface object length 
 PASS HTMLHeadElement interface object name 
@@ -731,7 +731,7 @@
 PASS HTMLTitleElement interface: attribute text 
 PASS HTMLTitleElement must be primary interface of document.createElement("title") 
 PASS Stringification of document.createElement("title") 
-PASS HTMLTitleElement interface: document.createElement("title") must inherit property "text" with the proper type (0) 
+PASS HTMLTitleElement interface: document.createElement("title") must inherit property "text" with the proper type 
 PASS HTMLBaseElement interface: existence and properties of interface object 
 PASS HTMLBaseElement interface object length 
 PASS HTMLBaseElement interface object name 
@@ -741,8 +741,8 @@
 PASS HTMLBaseElement interface: attribute target 
 PASS HTMLBaseElement must be primary interface of document.createElement("base") 
 PASS Stringification of document.createElement("base") 
-PASS HTMLBaseElement interface: document.createElement("base") must inherit property "href" with the proper type (0) 
-PASS HTMLBaseElement interface: document.createElement("base") must inherit property "target" with the proper type (1) 
+PASS HTMLBaseElement interface: document.createElement("base") must inherit property "href" with the proper type 
+PASS HTMLBaseElement interface: document.createElement("base") must inherit property "target" with the proper type 
 PASS HTMLLinkElement interface: existence and properties of interface object 
 PASS HTMLLinkElement interface object length 
 PASS HTMLLinkElement interface object name 
@@ -765,21 +765,21 @@
 PASS HTMLLinkElement interface: attribute target 
 PASS HTMLLinkElement must be primary interface of document.createElement("link") 
 PASS Stringification of document.createElement("link") 
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "href" with the proper type (0) 
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "crossOrigin" with the proper type (1) 
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "rel" with the proper type (2) 
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "as" with the proper type (3) 
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "relList" with the proper type (4) 
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "media" with the proper type (5) 
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "nonce" with the proper type (6) 
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "integrity" with the proper type (7) 
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "hreflang" with the proper type (8) 
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "type" with the proper type (9) 
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "sizes" with the proper type (10) 
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "referrerPolicy" with the proper type (11) 
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "charset" with the proper type (12) 
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "rev" with the proper type (13) 
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "target" with the proper type (14) 
+PASS HTMLLinkElement interface: document.createElement("link") must inherit property "href" with the proper type 
+PASS HTMLLinkElement interface: document.createElement("link") must inherit property "crossOrigin" with the proper type 
+PASS HTMLLinkElement interface: document.createElement("link") must inherit property "rel" with the proper type 
+PASS HTMLLinkElement interface: document.createElement("link") must inherit property "as" with the proper type 
+PASS HTMLLinkElement interface: document.createElement("link") must inherit property "relList" with the proper type 
+PASS HTMLLinkElement interface: document.createElement("link") must inherit property "media" with the proper type 
+PASS HTMLLinkElement interface: document.createElement("link") must inherit property "nonce" with the proper type 
+PASS HTMLLinkElement interface: document.createElement("link") must inherit property "integrity" with the proper type 
+PASS HTMLLinkElement interface: document.createElement("link") must inherit property "hreflang" with the proper type 
+PASS HTMLLinkElement interface: document.createElement("link") must inherit property "type" with the proper type 
+PASS HTMLLinkElement interface: document.createElement("link") must inherit property "sizes" with the proper type 
+PASS HTMLLinkElement interface: document.createElement("link") must inherit property "referrerPolicy" with the proper type 
+PASS HTMLLinkElement interface: document.createElement("link") must inherit property "charset" with the proper type 
+PASS HTMLLinkElement interface: document.createElement("link") must inherit property "rev" with the proper type 
+PASS HTMLLinkElement interface: document.createElement("link") must inherit property "target" with the proper type 
 PASS HTMLMetaElement interface: existence and properties of interface object 
 PASS HTMLMetaElement interface object length 
 PASS HTMLMetaElement interface object name 
@@ -791,10 +791,10 @@
 PASS HTMLMetaElement interface: attribute scheme 
 PASS HTMLMetaElement must be primary interface of document.createElement("meta") 
 PASS Stringification of document.createElement("meta") 
-PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "name" with the proper type (0) 
-PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "httpEquiv" with the proper type (1) 
-PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "content" with the proper type (2) 
-PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "scheme" with the proper type (3) 
+PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "name" with the proper type 
+PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "httpEquiv" with the proper type 
+PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "content" with the proper type 
+PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "scheme" with the proper type 
 PASS HTMLStyleElement interface: existence and properties of interface object 
 PASS HTMLStyleElement interface object length 
 PASS HTMLStyleElement interface object name 
@@ -805,9 +805,9 @@
 PASS HTMLStyleElement interface: attribute type 
 PASS HTMLStyleElement must be primary interface of document.createElement("style") 
 PASS Stringification of document.createElement("style") 
-PASS HTMLStyleElement interface: document.createElement("style") must inherit property "media" with the proper type (0) 
-PASS HTMLStyleElement interface: document.createElement("style") must inherit property "nonce" with the proper type (1) 
-PASS HTMLStyleElement interface: document.createElement("style") must inherit property "type" with the proper type (2) 
+PASS HTMLStyleElement interface: document.createElement("style") must inherit property "media" with the proper type 
+PASS HTMLStyleElement interface: document.createElement("style") must inherit property "nonce" with the proper type 
+PASS HTMLStyleElement interface: document.createElement("style") must inherit property "type" with the proper type 
 PASS HTMLBodyElement interface: existence and properties of interface object 
 PASS HTMLBodyElement interface object length 
 PASS HTMLBodyElement interface object name 
@@ -837,28 +837,28 @@
 PASS HTMLBodyElement interface: attribute onunload 
 PASS HTMLBodyElement must be primary interface of document.createElement("body") 
 PASS Stringification of document.createElement("body") 
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "text" with the proper type (0) 
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "link" with the proper type (1) 
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "vLink" with the proper type (2) 
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "aLink" with the proper type (3) 
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "bgColor" with the proper type (4) 
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "background" with the proper type (5) 
-FAIL HTMLBodyElement interface: document.createElement("body") must inherit property "onafterprint" with the proper type (6) assert_inherits: property "onafterprint" not found in prototype chain
-FAIL HTMLBodyElement interface: document.createElement("body") must inherit property "onbeforeprint" with the proper type (7) assert_inherits: property "onbeforeprint" not found in prototype chain
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onbeforeunload" with the proper type (8) 
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onhashchange" with the proper type (9) 
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onlanguagechange" with the proper type (10) 
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onmessage" with the proper type (11) 
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onmessageerror" with the proper type (12) 
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onoffline" with the proper type (13) 
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "ononline" with the proper type (14) 
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onpagehide" with the proper type (15) 
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onpageshow" with the proper type (16) 
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onpopstate" with the proper type (17) 
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onrejectionhandled" with the proper type (18) 
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onstorage" with the proper type (19) 
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onunhandledrejection" with the proper type (20) 
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onunload" with the proper type (21) 
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "text" with the proper type 
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "link" with the proper type 
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "vLink" with the proper type 
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "aLink" with the proper type 
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "bgColor" with the proper type 
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "background" with the proper type 
+FAIL HTMLBodyElement interface: document.createElement("body") must inherit property "onafterprint" with the proper type assert_inherits: property "onafterprint" not found in prototype chain
+FAIL HTMLBodyElement interface: document.createElement("body") must inherit property "onbeforeprint" with the proper type assert_inherits: property "onbeforeprint" not found in prototype chain
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onbeforeunload" with the proper type 
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onhashchange" with the proper type 
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onlanguagechange" with the proper type 
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onmessage" with the proper type 
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onmessageerror" with the proper type 
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onoffline" with the proper type 
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "ononline" with the proper type 
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onpagehide" with the proper type 
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onpageshow" with the proper type 
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onpopstate" with the proper type 
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onrejectionhandled" with the proper type 
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onstorage" with the proper type 
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onunhandledrejection" with the proper type 
+PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onunload" with the proper type 
 PASS HTMLHeadingElement interface: existence and properties of interface object 
 PASS HTMLHeadingElement interface object length 
 PASS HTMLHeadingElement interface object name 
@@ -867,7 +867,7 @@
 PASS HTMLHeadingElement interface: attribute align 
 PASS HTMLHeadingElement must be primary interface of document.createElement("h1") 
 PASS Stringification of document.createElement("h1") 
-PASS HTMLHeadingElement interface: document.createElement("h1") must inherit property "align" with the proper type (0) 
+PASS HTMLHeadingElement interface: document.createElement("h1") must inherit property "align" with the proper type 
 PASS HTMLParagraphElement interface: existence and properties of interface object 
 PASS HTMLParagraphElement interface object length 
 PASS HTMLParagraphElement interface object name 
@@ -876,7 +876,7 @@
 PASS HTMLParagraphElement interface: attribute align 
 PASS HTMLParagraphElement must be primary interface of document.createElement("p") 
 PASS Stringification of document.createElement("p") 
-PASS HTMLParagraphElement interface: document.createElement("p") must inherit property "align" with the proper type (0) 
+PASS HTMLParagraphElement interface: document.createElement("p") must inherit property "align" with the proper type 
 PASS HTMLHRElement interface: existence and properties of interface object 
 PASS HTMLHRElement interface object length 
 PASS HTMLHRElement interface object name 
@@ -889,11 +889,11 @@
 PASS HTMLHRElement interface: attribute width 
 PASS HTMLHRElement must be primary interface of document.createElement("hr") 
 PASS Stringification of document.createElement("hr") 
-PASS HTMLHRElement interface: document.createElement("hr") must inherit property "align" with the proper type (0) 
-PASS HTMLHRElement interface: document.createElement("hr") must inherit property "color" with the proper type (1) 
-PASS HTMLHRElement interface: document.createElement("hr") must inherit property "noShade" with the proper type (2) 
-PASS HTMLHRElement interface: document.createElement("hr") must inherit property "size" with the proper type (3) 
-PASS HTMLHRElement interface: document.createElement("hr") must inherit property "width" with the proper type (4) 
+PASS HTMLHRElement interface: document.createElement("hr") must inherit property "align" with the proper type 
+PASS HTMLHRElement interface: document.createElement("hr") must inherit property "color" with the proper type 
+PASS HTMLHRElement interface: document.createElement("hr") must inherit property "noShade" with the proper type 
+PASS HTMLHRElement interface: document.createElement("hr") must inherit property "size" with the proper type 
+PASS HTMLHRElement interface: document.createElement("hr") must inherit property "width" with the proper type 
 PASS HTMLPreElement interface: existence and properties of interface object 
 PASS HTMLPreElement interface object length 
 PASS HTMLPreElement interface object name 
@@ -902,13 +902,13 @@
 PASS HTMLPreElement interface: attribute width 
 PASS HTMLPreElement must be primary interface of document.createElement("pre") 
 PASS Stringification of document.createElement("pre") 
-PASS HTMLPreElement interface: document.createElement("pre") must inherit property "width" with the proper type (0) 
+PASS HTMLPreElement interface: document.createElement("pre") must inherit property "width" with the proper type 
 PASS HTMLPreElement must be primary interface of document.createElement("listing") 
 PASS Stringification of document.createElement("listing") 
-PASS HTMLPreElement interface: document.createElement("listing") must inherit property "width" with the proper type (0) 
+PASS HTMLPreElement interface: document.createElement("listing") must inherit property "width" with the proper type 
 PASS HTMLPreElement must be primary interface of document.createElement("xmp") 
 PASS Stringification of document.createElement("xmp") 
-PASS HTMLPreElement interface: document.createElement("xmp") must inherit property "width" with the proper type (0) 
+PASS HTMLPreElement interface: document.createElement("xmp") must inherit property "width" with the proper type 
 PASS HTMLQuoteElement interface: existence and properties of interface object 
 PASS HTMLQuoteElement interface object length 
 PASS HTMLQuoteElement interface object name 
@@ -917,10 +917,10 @@
 PASS HTMLQuoteElement interface: attribute cite 
 PASS HTMLQuoteElement must be primary interface of document.createElement("blockquote") 
 PASS Stringification of document.createElement("blockquote") 
-PASS HTMLQuoteElement interface: document.createElement("blockquote") must inherit property "cite" with the proper type (0) 
+PASS HTMLQuoteElement interface: document.createElement("blockquote") must inherit property "cite" with the proper type 
 PASS HTMLQuoteElement must be primary interface of document.createElement("q") 
 PASS Stringification of document.createElement("q") 
-PASS HTMLQuoteElement interface: document.createElement("q") must inherit property "cite" with the proper type (0) 
+PASS HTMLQuoteElement interface: document.createElement("q") must inherit property "cite" with the proper type 
 PASS HTMLOListElement interface: existence and properties of interface object 
 PASS HTMLOListElement interface object length 
 PASS HTMLOListElement interface object name 
@@ -946,8 +946,8 @@
 PASS HTMLLIElement interface: attribute type 
 PASS HTMLLIElement must be primary interface of document.createElement("li") 
 PASS Stringification of document.createElement("li") 
-PASS HTMLLIElement interface: document.createElement("li") must inherit property "value" with the proper type (0) 
-PASS HTMLLIElement interface: document.createElement("li") must inherit property "type" with the proper type (1) 
+PASS HTMLLIElement interface: document.createElement("li") must inherit property "value" with the proper type 
+PASS HTMLLIElement interface: document.createElement("li") must inherit property "type" with the proper type 
 PASS HTMLDListElement interface: existence and properties of interface object 
 PASS HTMLDListElement interface object length 
 PASS HTMLDListElement interface object name 
@@ -962,7 +962,7 @@
 PASS HTMLDivElement interface: attribute align 
 PASS HTMLDivElement must be primary interface of document.createElement("div") 
 PASS Stringification of document.createElement("div") 
-PASS HTMLDivElement interface: document.createElement("div") must inherit property "align" with the proper type (0) 
+PASS HTMLDivElement interface: document.createElement("div") must inherit property "align" with the proper type 
 PASS HTMLAnchorElement interface: existence and properties of interface object 
 PASS HTMLAnchorElement interface object length 
 PASS HTMLAnchorElement interface object name 
@@ -996,31 +996,31 @@
 PASS HTMLAnchorElement interface: attribute hash 
 PASS HTMLAnchorElement must be primary interface of document.createElement("a") 
 PASS Stringification of document.createElement("a") 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "target" with the proper type (0) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "download" with the proper type (1) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "ping" with the proper type (2) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "rel" with the proper type (3) 
-FAIL HTMLAnchorElement interface: document.createElement("a") must inherit property "relList" with the proper type (4) assert_inherits: property "relList" not found in prototype chain
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "hreflang" with the proper type (5) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "type" with the proper type (6) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "text" with the proper type (7) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "referrerPolicy" with the proper type (8) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "coords" with the proper type (9) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "charset" with the proper type (10) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "name" with the proper type (11) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "rev" with the proper type (12) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "shape" with the proper type (13) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "href" with the proper type (14) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "origin" with the proper type (15) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "protocol" with the proper type (16) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "username" with the proper type (17) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "password" with the proper type (18) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "host" with the proper type (19) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "hostname" with the proper type (20) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "port" with the proper type (21) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "pathname" with the proper type (22) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "search" with the proper type (23) 
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "hash" with the proper type (24) 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "target" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "download" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "ping" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "rel" with the proper type 
+FAIL HTMLAnchorElement interface: document.createElement("a") must inherit property "relList" with the proper type assert_inherits: property "relList" not found in prototype chain
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "hreflang" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "type" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "text" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "referrerPolicy" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "coords" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "charset" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "name" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "rev" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "shape" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "href" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "origin" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "protocol" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "username" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "password" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "host" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "hostname" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "port" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "pathname" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "search" with the proper type 
+PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "hash" with the proper type 
 PASS HTMLDataElement interface: existence and properties of interface object 
 PASS HTMLDataElement interface object length 
 PASS HTMLDataElement interface object name 
@@ -1029,7 +1029,7 @@
 PASS HTMLDataElement interface: attribute value 
 PASS HTMLDataElement must be primary interface of document.createElement("data") 
 PASS Stringification of document.createElement("data") 
-PASS HTMLDataElement interface: document.createElement("data") must inherit property "value" with the proper type (0) 
+PASS HTMLDataElement interface: document.createElement("data") must inherit property "value" with the proper type 
 PASS HTMLTimeElement interface: existence and properties of interface object 
 PASS HTMLTimeElement interface object length 
 PASS HTMLTimeElement interface object name 
@@ -1038,7 +1038,7 @@
 PASS HTMLTimeElement interface: attribute dateTime 
 PASS HTMLTimeElement must be primary interface of document.createElement("time") 
 PASS Stringification of document.createElement("time") 
-PASS HTMLTimeElement interface: document.createElement("time") must inherit property "dateTime" with the proper type (0) 
+PASS HTMLTimeElement interface: document.createElement("time") must inherit property "dateTime" with the proper type 
 PASS HTMLSpanElement interface: existence and properties of interface object 
 PASS HTMLSpanElement interface object length 
 PASS HTMLSpanElement interface object name 
@@ -1054,7 +1054,7 @@
 PASS HTMLBRElement interface: attribute clear 
 PASS HTMLBRElement must be primary interface of document.createElement("br") 
 PASS Stringification of document.createElement("br") 
-PASS HTMLBRElement interface: document.createElement("br") must inherit property "clear" with the proper type (0) 
+PASS HTMLBRElement interface: document.createElement("br") must inherit property "clear" with the proper type 
 PASS HTMLModElement interface: existence and properties of interface object 
 PASS HTMLModElement interface object length 
 PASS HTMLModElement interface object name 
@@ -1064,12 +1064,12 @@
 PASS HTMLModElement interface: attribute dateTime 
 PASS HTMLModElement must be primary interface of document.createElement("ins") 
 PASS Stringification of document.createElement("ins") 
-PASS HTMLModElement interface: document.createElement("ins") must inherit property "cite" with the proper type (0) 
-PASS HTMLModElement interface: document.createElement("ins") must inherit property "dateTime" with the proper type (1) 
+PASS HTMLModElement interface: document.createElement("ins") must inherit property "cite" with the proper type 
+PASS HTMLModElement interface: document.createElement("ins") must inherit property "dateTime" with the proper type 
 PASS HTMLModElement must be primary interface of document.createElement("del") 
 PASS Stringification of document.createElement("del") 
-PASS HTMLModElement interface: document.createElement("del") must inherit property "cite" with the proper type (0) 
-PASS HTMLModElement interface: document.createElement("del") must inherit property "dateTime" with the proper type (1) 
+PASS HTMLModElement interface: document.createElement("del") must inherit property "cite" with the proper type 
+PASS HTMLModElement interface: document.createElement("del") must inherit property "dateTime" with the proper type 
 PASS HTMLPictureElement interface: existence and properties of interface object 
 PASS HTMLPictureElement interface object length 
 PASS HTMLPictureElement interface object name 
@@ -1105,50 +1105,50 @@
 PASS HTMLImageElement interface: attribute border 
 PASS HTMLImageElement must be primary interface of document.createElement("img") 
 PASS Stringification of document.createElement("img") 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "alt" with the proper type (0) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "src" with the proper type (1) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "srcset" with the proper type (2) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "sizes" with the proper type (3) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "crossOrigin" with the proper type (4) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "useMap" with the proper type (5) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "isMap" with the proper type (6) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "width" with the proper type (7) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "height" with the proper type (8) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "naturalWidth" with the proper type (9) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "naturalHeight" with the proper type (10) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "complete" with the proper type (11) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "currentSrc" with the proper type (12) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "referrerPolicy" with the proper type (13) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "name" with the proper type (14) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "lowsrc" with the proper type (15) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "align" with the proper type (16) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "hspace" with the proper type (17) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "vspace" with the proper type (18) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "longDesc" with the proper type (19) 
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "border" with the proper type (20) 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "alt" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "src" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "srcset" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "sizes" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "crossOrigin" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "useMap" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "isMap" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "width" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "height" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "naturalWidth" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "naturalHeight" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "complete" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "currentSrc" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "referrerPolicy" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "name" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "lowsrc" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "align" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "hspace" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "vspace" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "longDesc" with the proper type 
+PASS HTMLImageElement interface: document.createElement("img") must inherit property "border" with the proper type 
 PASS HTMLImageElement must be primary interface of new Image() 
 PASS Stringification of new Image() 
-PASS HTMLImageElement interface: new Image() must inherit property "alt" with the proper type (0) 
-PASS HTMLImageElement interface: new Image() must inherit property "src" with the proper type (1) 
-PASS HTMLImageElement interface: new Image() must inherit property "srcset" with the proper type (2) 
-PASS HTMLImageElement interface: new Image() must inherit property "sizes" with the proper type (3) 
-PASS HTMLImageElement interface: new Image() must inherit property "crossOrigin" with the proper type (4) 
-PASS HTMLImageElement interface: new Image() must inherit property "useMap" with the proper type (5) 
-PASS HTMLImageElement interface: new Image() must inherit property "isMap" with the proper type (6) 
-PASS HTMLImageElement interface: new Image() must inherit property "width" with the proper type (7) 
-PASS HTMLImageElement interface: new Image() must inherit property "height" with the proper type (8) 
-PASS HTMLImageElement interface: new Image() must inherit property "naturalWidth" with the proper type (9) 
-PASS HTMLImageElement interface: new Image() must inherit property "naturalHeight" with the proper type (10) 
-PASS HTMLImageElement interface: new Image() must inherit property "complete" with the proper type (11) 
-PASS HTMLImageElement interface: new Image() must inherit property "currentSrc" with the proper type (12) 
-PASS HTMLImageElement interface: new Image() must inherit property "referrerPolicy" with the proper type (13) 
-PASS HTMLImageElement interface: new Image() must inherit property "name" with the proper type (14) 
-PASS HTMLImageElement interface: new Image() must inherit property "lowsrc" with the proper type (15) 
-PASS HTMLImageElement interface: new Image() must inherit property "align" with the proper type (16) 
-PASS HTMLImageElement interface: new Image() must inherit property "hspace" with the proper type (17) 
-PASS HTMLImageElement interface: new Image() must inherit property "vspace" with the proper type (18) 
-PASS HTMLImageElement interface: new Image() must inherit property "longDesc" with the proper type (19) 
-PASS HTMLImageElement interface: new Image() must inherit property "border" with the proper type (20) 
+PASS HTMLImageElement interface: new Image() must inherit property "alt" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "src" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "srcset" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "sizes" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "crossOrigin" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "useMap" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "isMap" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "width" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "height" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "naturalWidth" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "naturalHeight" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "complete" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "currentSrc" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "referrerPolicy" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "name" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "lowsrc" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "align" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "hspace" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "vspace" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "longDesc" with the proper type 
+PASS HTMLImageElement interface: new Image() must inherit property "border" with the proper type 
 PASS HTMLIFrameElement interface: existence and properties of interface object 
 PASS HTMLIFrameElement interface object length 
 PASS HTMLIFrameElement interface object name 
@@ -1187,13 +1187,13 @@
 PASS HTMLEmbedElement interface: attribute name 
 PASS HTMLEmbedElement must be primary interface of document.createElement("embed") 
 PASS Stringification of document.createElement("embed") 
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "src" with the proper type (0) 
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "type" with the proper type (1) 
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "width" with the proper type (2) 
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "height" with the proper type (3) 
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "getSVGDocument" with the proper type (4) 
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "align" with the proper type (5) 
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "name" with the proper type (6) 
+PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "src" with the proper type 
+PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "type" with the proper type 
+PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "width" with the proper type 
+PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "height" with the proper type 
+PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "getSVGDocument()" with the proper type 
+PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "align" with the proper type 
+PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "name" with the proper type 
 PASS HTMLObjectElement interface: existence and properties of interface object 
 PASS HTMLObjectElement interface object length 
 PASS HTMLObjectElement interface object name 
@@ -1227,33 +1227,33 @@
 PASS HTMLObjectElement interface: attribute border 
 PASS HTMLObjectElement must be primary interface of document.createElement("object") 
 PASS Stringification of document.createElement("object") 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "data" with the proper type (0) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "type" with the proper type (1) 
-FAIL HTMLObjectElement interface: document.createElement("object") must inherit property "typeMustMatch" with the proper type (2) assert_inherits: property "typeMustMatch" not found in prototype chain
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "name" with the proper type (3) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "useMap" with the proper type (4) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "form" with the proper type (5) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "width" with the proper type (6) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "height" with the proper type (7) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "contentDocument" with the proper type (8) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "contentWindow" with the proper type (9) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "willValidate" with the proper type (10) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "validity" with the proper type (11) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "validationMessage" with the proper type (12) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "checkValidity" with the proper type (13) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "reportValidity" with the proper type (14) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "setCustomValidity" with the proper type (15) 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "data" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "type" with the proper type 
+FAIL HTMLObjectElement interface: document.createElement("object") must inherit property "typeMustMatch" with the proper type assert_inherits: property "typeMustMatch" not found in prototype chain
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "name" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "useMap" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "form" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "width" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "height" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "contentDocument" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "contentWindow" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "willValidate" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "validity" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "validationMessage" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "checkValidity()" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "reportValidity()" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLObjectElement interface: calling setCustomValidity(DOMString) on document.createElement("object") with too few arguments must throw TypeError 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "align" with the proper type (16) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "archive" with the proper type (17) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "code" with the proper type (18) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "declare" with the proper type (19) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "hspace" with the proper type (20) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "standby" with the proper type (21) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "vspace" with the proper type (22) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "codeBase" with the proper type (23) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "codeType" with the proper type (24) 
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "border" with the proper type (25) 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "align" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "archive" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "code" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "declare" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "hspace" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "standby" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "vspace" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "codeBase" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "codeType" with the proper type 
+PASS HTMLObjectElement interface: document.createElement("object") must inherit property "border" with the proper type 
 PASS HTMLParamElement interface: existence and properties of interface object 
 PASS HTMLParamElement interface object length 
 PASS HTMLParamElement interface object name 
@@ -1265,10 +1265,10 @@
 PASS HTMLParamElement interface: attribute valueType 
 PASS HTMLParamElement must be primary interface of document.createElement("param") 
 PASS Stringification of document.createElement("param") 
-PASS HTMLParamElement interface: document.createElement("param") must inherit property "name" with the proper type (0) 
-PASS HTMLParamElement interface: document.createElement("param") must inherit property "value" with the proper type (1) 
-PASS HTMLParamElement interface: document.createElement("param") must inherit property "type" with the proper type (2) 
-PASS HTMLParamElement interface: document.createElement("param") must inherit property "valueType" with the proper type (3) 
+PASS HTMLParamElement interface: document.createElement("param") must inherit property "name" with the proper type 
+PASS HTMLParamElement interface: document.createElement("param") must inherit property "value" with the proper type 
+PASS HTMLParamElement interface: document.createElement("param") must inherit property "type" with the proper type 
+PASS HTMLParamElement interface: document.createElement("param") must inherit property "valueType" with the proper type 
 PASS HTMLVideoElement interface: existence and properties of interface object 
 PASS HTMLVideoElement interface object length 
 PASS HTMLVideoElement interface object name 
@@ -1281,56 +1281,56 @@
 PASS HTMLVideoElement interface: attribute poster 
 PASS HTMLVideoElement must be primary interface of document.createElement("video") 
 PASS Stringification of document.createElement("video") 
-PASS HTMLVideoElement interface: document.createElement("video") must inherit property "width" with the proper type (0) 
-PASS HTMLVideoElement interface: document.createElement("video") must inherit property "height" with the proper type (1) 
-PASS HTMLVideoElement interface: document.createElement("video") must inherit property "videoWidth" with the proper type (2) 
-PASS HTMLVideoElement interface: document.createElement("video") must inherit property "videoHeight" with the proper type (3) 
-PASS HTMLVideoElement interface: document.createElement("video") must inherit property "poster" with the proper type (4) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "error" with the proper type (0) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "src" with the proper type (1) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "currentSrc" with the proper type (2) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "crossOrigin" with the proper type (3) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_EMPTY" with the proper type (4) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_IDLE" with the proper type (5) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_LOADING" with the proper type (6) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_NO_SOURCE" with the proper type (7) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "networkState" with the proper type (8) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "preload" with the proper type (9) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "buffered" with the proper type (10) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "load" with the proper type (11) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "canPlayType" with the proper type (12) 
+PASS HTMLVideoElement interface: document.createElement("video") must inherit property "width" with the proper type 
+PASS HTMLVideoElement interface: document.createElement("video") must inherit property "height" with the proper type 
+PASS HTMLVideoElement interface: document.createElement("video") must inherit property "videoWidth" with the proper type 
+PASS HTMLVideoElement interface: document.createElement("video") must inherit property "videoHeight" with the proper type 
+PASS HTMLVideoElement interface: document.createElement("video") must inherit property "poster" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "error" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "src" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "currentSrc" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "crossOrigin" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_EMPTY" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_IDLE" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_LOADING" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_NO_SOURCE" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "networkState" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "preload" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "buffered" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "load()" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "canPlayType(DOMString)" with the proper type 
 PASS HTMLMediaElement interface: calling canPlayType(DOMString) on document.createElement("video") with too few arguments must throw TypeError 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_NOTHING" with the proper type (13) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_METADATA" with the proper type (14) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_CURRENT_DATA" with the proper type (15) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_FUTURE_DATA" with the proper type (16) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_ENOUGH_DATA" with the proper type (17) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "readyState" with the proper type (18) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "seeking" with the proper type (19) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "currentTime" with the proper type (20) 
-FAIL HTMLMediaElement interface: document.createElement("video") must inherit property "fastSeek" with the proper type (21) assert_inherits: property "fastSeek" not found in prototype chain
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_NOTHING" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_METADATA" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_CURRENT_DATA" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_FUTURE_DATA" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_ENOUGH_DATA" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "readyState" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "seeking" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "currentTime" with the proper type 
+FAIL HTMLMediaElement interface: document.createElement("video") must inherit property "fastSeek(double)" with the proper type assert_inherits: property "fastSeek" not found in prototype chain
 FAIL HTMLMediaElement interface: calling fastSeek(double) on document.createElement("video") with too few arguments must throw TypeError assert_inherits: property "fastSeek" not found in prototype chain
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "duration" with the proper type (22) 
-FAIL HTMLMediaElement interface: document.createElement("video") must inherit property "getStartDate" with the proper type (23) assert_inherits: property "getStartDate" not found in prototype chain
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "paused" with the proper type (24) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "defaultPlaybackRate" with the proper type (25) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "playbackRate" with the proper type (26) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "played" with the proper type (27) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "seekable" with the proper type (28) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "ended" with the proper type (29) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "autoplay" with the proper type (30) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "loop" with the proper type (31) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "play" with the proper type (32) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "pause" with the proper type (33) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "controls" with the proper type (34) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "volume" with the proper type (35) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "muted" with the proper type (36) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "defaultMuted" with the proper type (37) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "audioTracks" with the proper type (38) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "videoTracks" with the proper type (39) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "textTracks" with the proper type (40) 
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "addTextTrack" with the proper type (41) 
-PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind,DOMString,DOMString) on document.createElement("video") with too few arguments must throw TypeError 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "duration" with the proper type 
+FAIL HTMLMediaElement interface: document.createElement("video") must inherit property "getStartDate()" with the proper type assert_inherits: property "getStartDate" not found in prototype chain
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "paused" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "defaultPlaybackRate" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "playbackRate" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "played" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "seekable" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "ended" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "autoplay" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "loop" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "play()" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "pause()" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "controls" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "volume" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "muted" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "defaultMuted" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "audioTracks" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "videoTracks" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "textTracks" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("video") must inherit property "addTextTrack(TextTrackKind, DOMString, DOMString)" with the proper type 
+PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, DOMString, DOMString) on document.createElement("video") with too few arguments must throw TypeError 
 PASS HTMLAudioElement interface: existence and properties of interface object 
 PASS HTMLAudioElement interface object length 
 PASS HTMLAudioElement interface object name 
@@ -1338,98 +1338,98 @@
 PASS HTMLAudioElement interface: existence and properties of interface prototype object's "constructor" property 
 PASS HTMLAudioElement must be primary interface of document.createElement("audio") 
 PASS Stringification of document.createElement("audio") 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "error" with the proper type (0) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "src" with the proper type (1) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "currentSrc" with the proper type (2) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "crossOrigin" with the proper type (3) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_EMPTY" with the proper type (4) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_IDLE" with the proper type (5) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_LOADING" with the proper type (6) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_NO_SOURCE" with the proper type (7) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "networkState" with the proper type (8) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "preload" with the proper type (9) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "buffered" with the proper type (10) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "load" with the proper type (11) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "canPlayType" with the proper type (12) 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "error" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "src" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "currentSrc" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "crossOrigin" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_EMPTY" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_IDLE" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_LOADING" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_NO_SOURCE" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "networkState" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "preload" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "buffered" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "load()" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "canPlayType(DOMString)" with the proper type 
 PASS HTMLMediaElement interface: calling canPlayType(DOMString) on document.createElement("audio") with too few arguments must throw TypeError 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_NOTHING" with the proper type (13) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_METADATA" with the proper type (14) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_CURRENT_DATA" with the proper type (15) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_FUTURE_DATA" with the proper type (16) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_ENOUGH_DATA" with the proper type (17) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "readyState" with the proper type (18) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "seeking" with the proper type (19) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "currentTime" with the proper type (20) 
-FAIL HTMLMediaElement interface: document.createElement("audio") must inherit property "fastSeek" with the proper type (21) assert_inherits: property "fastSeek" not found in prototype chain
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_NOTHING" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_METADATA" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_CURRENT_DATA" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_FUTURE_DATA" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_ENOUGH_DATA" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "readyState" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "seeking" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "currentTime" with the proper type 
+FAIL HTMLMediaElement interface: document.createElement("audio") must inherit property "fastSeek(double)" with the proper type assert_inherits: property "fastSeek" not found in prototype chain
 FAIL HTMLMediaElement interface: calling fastSeek(double) on document.createElement("audio") with too few arguments must throw TypeError assert_inherits: property "fastSeek" not found in prototype chain
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "duration" with the proper type (22) 
-FAIL HTMLMediaElement interface: document.createElement("audio") must inherit property "getStartDate" with the proper type (23) assert_inherits: property "getStartDate" not found in prototype chain
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "paused" with the proper type (24) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "defaultPlaybackRate" with the proper type (25) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "playbackRate" with the proper type (26) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "played" with the proper type (27) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "seekable" with the proper type (28) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "ended" with the proper type (29) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "autoplay" with the proper type (30) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "loop" with the proper type (31) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "play" with the proper type (32) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "pause" with the proper type (33) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "controls" with the proper type (34) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "volume" with the proper type (35) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "muted" with the proper type (36) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "defaultMuted" with the proper type (37) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "audioTracks" with the proper type (38) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "videoTracks" with the proper type (39) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "textTracks" with the proper type (40) 
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "addTextTrack" with the proper type (41) 
-PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind,DOMString,DOMString) on document.createElement("audio") with too few arguments must throw TypeError 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "duration" with the proper type 
+FAIL HTMLMediaElement interface: document.createElement("audio") must inherit property "getStartDate()" with the proper type assert_inherits: property "getStartDate" not found in prototype chain
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "paused" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "defaultPlaybackRate" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "playbackRate" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "played" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "seekable" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "ended" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "autoplay" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "loop" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "play()" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "pause()" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "controls" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "volume" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "muted" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "defaultMuted" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "audioTracks" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "videoTracks" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "textTracks" with the proper type 
+PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "addTextTrack(TextTrackKind, DOMString, DOMString)" with the proper type 
+PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, DOMString, DOMString) on document.createElement("audio") with too few arguments must throw TypeError 
 PASS HTMLAudioElement must be primary interface of new Audio() 
 PASS Stringification of new Audio() 
-PASS HTMLMediaElement interface: new Audio() must inherit property "error" with the proper type (0) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "src" with the proper type (1) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "currentSrc" with the proper type (2) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "crossOrigin" with the proper type (3) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_EMPTY" with the proper type (4) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_IDLE" with the proper type (5) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_LOADING" with the proper type (6) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_NO_SOURCE" with the proper type (7) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "networkState" with the proper type (8) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "preload" with the proper type (9) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "buffered" with the proper type (10) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "load" with the proper type (11) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "canPlayType" with the proper type (12) 
+PASS HTMLMediaElement interface: new Audio() must inherit property "error" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "src" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "currentSrc" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "crossOrigin" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_EMPTY" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_IDLE" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_LOADING" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_NO_SOURCE" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "networkState" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "preload" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "buffered" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "load()" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "canPlayType(DOMString)" with the proper type 
 PASS HTMLMediaElement interface: calling canPlayType(DOMString) on new Audio() with too few arguments must throw TypeError 
-PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_NOTHING" with the proper type (13) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_METADATA" with the proper type (14) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_CURRENT_DATA" with the proper type (15) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_FUTURE_DATA" with the proper type (16) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_ENOUGH_DATA" with the proper type (17) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "readyState" with the proper type (18) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "seeking" with the proper type (19) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "currentTime" with the proper type (20) 
-FAIL HTMLMediaElement interface: new Audio() must inherit property "fastSeek" with the proper type (21) assert_inherits: property "fastSeek" not found in prototype chain
+PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_NOTHING" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_METADATA" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_CURRENT_DATA" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_FUTURE_DATA" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_ENOUGH_DATA" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "readyState" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "seeking" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "currentTime" with the proper type 
+FAIL HTMLMediaElement interface: new Audio() must inherit property "fastSeek(double)" with the proper type assert_inherits: property "fastSeek" not found in prototype chain
 FAIL HTMLMediaElement interface: calling fastSeek(double) on new Audio() with too few arguments must throw TypeError assert_inherits: property "fastSeek" not found in prototype chain
-PASS HTMLMediaElement interface: new Audio() must inherit property "duration" with the proper type (22) 
-FAIL HTMLMediaElement interface: new Audio() must inherit property "getStartDate" with the proper type (23) assert_inherits: property "getStartDate" not found in prototype chain
-PASS HTMLMediaElement interface: new Audio() must inherit property "paused" with the proper type (24) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "defaultPlaybackRate" with the proper type (25) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "playbackRate" with the proper type (26) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "played" with the proper type (27) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "seekable" with the proper type (28) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "ended" with the proper type (29) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "autoplay" with the proper type (30) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "loop" with the proper type (31) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "play" with the proper type (32) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "pause" with the proper type (33) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "controls" with the proper type (34) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "volume" with the proper type (35) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "muted" with the proper type (36) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "defaultMuted" with the proper type (37) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "audioTracks" with the proper type (38) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "videoTracks" with the proper type (39) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "textTracks" with the proper type (40) 
-PASS HTMLMediaElement interface: new Audio() must inherit property "addTextTrack" with the proper type (41) 
-PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind,DOMString,DOMString) on new Audio() with too few arguments must throw TypeError 
+PASS HTMLMediaElement interface: new Audio() must inherit property "duration" with the proper type 
+FAIL HTMLMediaElement interface: new Audio() must inherit property "getStartDate()" with the proper type assert_inherits: property "getStartDate" not found in prototype chain
+PASS HTMLMediaElement interface: new Audio() must inherit property "paused" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "defaultPlaybackRate" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "playbackRate" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "played" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "seekable" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "ended" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "autoplay" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "loop" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "play()" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "pause()" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "controls" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "volume" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "muted" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "defaultMuted" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "audioTracks" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "videoTracks" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "textTracks" with the proper type 
+PASS HTMLMediaElement interface: new Audio() must inherit property "addTextTrack(TextTrackKind, DOMString, DOMString)" with the proper type 
+PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, DOMString, DOMString) on new Audio() with too few arguments must throw TypeError 
 PASS HTMLSourceElement interface: existence and properties of interface object 
 PASS HTMLSourceElement interface object length 
 PASS HTMLSourceElement interface object name 
@@ -1442,11 +1442,11 @@
 PASS HTMLSourceElement interface: attribute media 
 PASS HTMLSourceElement must be primary interface of document.createElement("source") 
 PASS Stringification of document.createElement("source") 
-PASS HTMLSourceElement interface: document.createElement("source") must inherit property "src" with the proper type (0) 
-PASS HTMLSourceElement interface: document.createElement("source") must inherit property "type" with the proper type (1) 
-PASS HTMLSourceElement interface: document.createElement("source") must inherit property "srcset" with the proper type (2) 
-PASS HTMLSourceElement interface: document.createElement("source") must inherit property "sizes" with the proper type (3) 
-PASS HTMLSourceElement interface: document.createElement("source") must inherit property "media" with the proper type (4) 
+PASS HTMLSourceElement interface: document.createElement("source") must inherit property "src" with the proper type 
+PASS HTMLSourceElement interface: document.createElement("source") must inherit property "type" with the proper type 
+PASS HTMLSourceElement interface: document.createElement("source") must inherit property "srcset" with the proper type 
+PASS HTMLSourceElement interface: document.createElement("source") must inherit property "sizes" with the proper type 
+PASS HTMLSourceElement interface: document.createElement("source") must inherit property "media" with the proper type 
 PASS HTMLTrackElement interface: existence and properties of interface object 
 PASS HTMLTrackElement interface object length 
 PASS HTMLTrackElement interface object name 
@@ -1469,17 +1469,17 @@
 PASS HTMLTrackElement interface: attribute track 
 PASS HTMLTrackElement must be primary interface of document.createElement("track") 
 PASS Stringification of document.createElement("track") 
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "kind" with the proper type (0) 
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "src" with the proper type (1) 
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "srclang" with the proper type (2) 
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "label" with the proper type (3) 
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "default" with the proper type (4) 
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "NONE" with the proper type (5) 
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "LOADING" with the proper type (6) 
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "LOADED" with the proper type (7) 
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "ERROR" with the proper type (8) 
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "readyState" with the proper type (9) 
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "track" with the proper type (10) 
+PASS HTMLTrackElement interface: document.createElement("track") must inherit property "kind" with the proper type 
+PASS HTMLTrackElement interface: document.createElement("track") must inherit property "src" with the proper type 
+PASS HTMLTrackElement interface: document.createElement("track") must inherit property "srclang" with the proper type 
+PASS HTMLTrackElement interface: document.createElement("track") must inherit property "label" with the proper type 
+PASS HTMLTrackElement interface: document.createElement("track") must inherit property "default" with the proper type 
+PASS HTMLTrackElement interface: document.createElement("track") must inherit property "NONE" with the proper type 
+PASS HTMLTrackElement interface: document.createElement("track") must inherit property "LOADING" with the proper type 
+PASS HTMLTrackElement interface: document.createElement("track") must inherit property "LOADED" with the proper type 
+PASS HTMLTrackElement interface: document.createElement("track") must inherit property "ERROR" with the proper type 
+PASS HTMLTrackElement interface: document.createElement("track") must inherit property "readyState" with the proper type 
+PASS HTMLTrackElement interface: document.createElement("track") must inherit property "track" with the proper type 
 PASS HTMLMediaElement interface: existence and properties of interface object 
 PASS HTMLMediaElement interface object length 
 PASS HTMLMediaElement interface object name 
@@ -1535,7 +1535,7 @@
 PASS HTMLMediaElement interface: attribute audioTracks 
 PASS HTMLMediaElement interface: attribute videoTracks 
 PASS HTMLMediaElement interface: attribute textTracks 
-PASS HTMLMediaElement interface: operation addTextTrack(TextTrackKind,DOMString,DOMString) 
+PASS HTMLMediaElement interface: operation addTextTrack(TextTrackKind, DOMString, DOMString) 
 PASS MediaError interface: existence and properties of interface object 
 PASS MediaError interface object length 
 PASS MediaError interface object name 
@@ -1553,12 +1553,12 @@
 PASS MediaError interface: attribute message 
 PASS MediaError must be primary interface of errorVideo.error 
 PASS Stringification of errorVideo.error 
-PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_ABORTED" with the proper type (0) 
-PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_NETWORK" with the proper type (1) 
-PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_DECODE" with the proper type (2) 
-PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_SRC_NOT_SUPPORTED" with the proper type (3) 
-PASS MediaError interface: errorVideo.error must inherit property "code" with the proper type (4) 
-PASS MediaError interface: errorVideo.error must inherit property "message" with the proper type (5) 
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_ABORTED" with the proper type 
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_NETWORK" with the proper type 
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_DECODE" with the proper type 
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_SRC_NOT_SUPPORTED" with the proper type 
+PASS MediaError interface: errorVideo.error must inherit property "code" with the proper type 
+PASS MediaError interface: errorVideo.error must inherit property "message" with the proper type 
 PASS AudioTrackList interface: existence and properties of interface object 
 PASS AudioTrackList interface object length 
 PASS AudioTrackList interface object name 
@@ -1612,12 +1612,12 @@
 PASS TextTrackList interface: attribute onremovetrack 
 PASS TextTrackList must be primary interface of document.createElement("video").textTracks 
 PASS Stringification of document.createElement("video").textTracks 
-PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "length" with the proper type (0) 
-PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "getTrackById" with the proper type (2) 
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "length" with the proper type 
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "getTrackById(DOMString)" with the proper type 
 PASS TextTrackList interface: calling getTrackById(DOMString) on document.createElement("video").textTracks with too few arguments must throw TypeError 
-PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onchange" with the proper type (3) 
-PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onaddtrack" with the proper type (4) 
-PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onremovetrack" with the proper type (5) 
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onchange" with the proper type 
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onaddtrack" with the proper type 
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onremovetrack" with the proper type 
 PASS TextTrack interface: existence and properties of interface object 
 PASS TextTrack interface object length 
 PASS TextTrack interface object name 
@@ -1636,19 +1636,19 @@
 PASS TextTrack interface: attribute oncuechange 
 PASS TextTrack must be primary interface of document.createElement("track").track 
 PASS Stringification of document.createElement("track").track 
-PASS TextTrack interface: document.createElement("track").track must inherit property "kind" with the proper type (0) 
-PASS TextTrack interface: document.createElement("track").track must inherit property "label" with the proper type (1) 
-PASS TextTrack interface: document.createElement("track").track must inherit property "language" with the proper type (2) 
-PASS TextTrack interface: document.createElement("track").track must inherit property "id" with the proper type (3) 
-FAIL TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type (4) assert_inherits: property "inBandMetadataTrackDispatchType" not found in prototype chain
-PASS TextTrack interface: document.createElement("track").track must inherit property "mode" with the proper type (5) 
-PASS TextTrack interface: document.createElement("track").track must inherit property "cues" with the proper type (6) 
-PASS TextTrack interface: document.createElement("track").track must inherit property "activeCues" with the proper type (7) 
-PASS TextTrack interface: document.createElement("track").track must inherit property "addCue" with the proper type (8) 
+PASS TextTrack interface: document.createElement("track").track must inherit property "kind" with the proper type 
+PASS TextTrack interface: document.createElement("track").track must inherit property "label" with the proper type 
+PASS TextTrack interface: document.createElement("track").track must inherit property "language" with the proper type 
+PASS TextTrack interface: document.createElement("track").track must inherit property "id" with the proper type 
+FAIL TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type assert_inherits: property "inBandMetadataTrackDispatchType" not found in prototype chain
+PASS TextTrack interface: document.createElement("track").track must inherit property "mode" with the proper type 
+PASS TextTrack interface: document.createElement("track").track must inherit property "cues" with the proper type 
+PASS TextTrack interface: document.createElement("track").track must inherit property "activeCues" with the proper type 
+PASS TextTrack interface: document.createElement("track").track must inherit property "addCue(TextTrackCue)" with the proper type 
 PASS TextTrack interface: calling addCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError 
-PASS TextTrack interface: document.createElement("track").track must inherit property "removeCue" with the proper type (9) 
+PASS TextTrack interface: document.createElement("track").track must inherit property "removeCue(TextTrackCue)" with the proper type 
 PASS TextTrack interface: calling removeCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError 
-PASS TextTrack interface: document.createElement("track").track must inherit property "oncuechange" with the proper type (10) 
+PASS TextTrack interface: document.createElement("track").track must inherit property "oncuechange" with the proper type 
 PASS TextTrackCueList interface: existence and properties of interface object 
 PASS TextTrackCueList interface object length 
 PASS TextTrackCueList interface object name 
@@ -1658,8 +1658,8 @@
 PASS TextTrackCueList interface: operation getCueById(DOMString) 
 PASS TextTrackCueList must be primary interface of document.createElement("video").addTextTrack("subtitles").cues 
 PASS Stringification of document.createElement("video").addTextTrack("subtitles").cues 
-PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "length" with the proper type (0) 
-PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "getCueById" with the proper type (2) 
+PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "length" with the proper type 
+PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "getCueById(DOMString)" with the proper type 
 PASS TextTrackCueList interface: calling getCueById(DOMString) on document.createElement("video").addTextTrack("subtitles").cues with too few arguments must throw TypeError 
 PASS TextTrackCue interface: existence and properties of interface object 
 PASS TextTrackCue interface object length 
@@ -1683,10 +1683,10 @@
 PASS TimeRanges interface: operation end(unsigned long) 
 PASS TimeRanges must be primary interface of document.createElement("video").buffered 
 PASS Stringification of document.createElement("video").buffered 
-PASS TimeRanges interface: document.createElement("video").buffered must inherit property "length" with the proper type (0) 
-PASS TimeRanges interface: document.createElement("video").buffered must inherit property "start" with the proper type (1) 
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "length" with the proper type 
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "start(unsigned long)" with the proper type 
 PASS TimeRanges interface: calling start(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError 
-PASS TimeRanges interface: document.createElement("video").buffered must inherit property "end" with the proper type (2) 
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "end(unsigned long)" with the proper type 
 PASS TimeRanges interface: calling end(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError 
 PASS TrackEvent interface: existence and properties of interface object 
 PASS TrackEvent interface object length 
@@ -1696,7 +1696,7 @@
 PASS TrackEvent interface: attribute track 
 PASS TrackEvent must be primary interface of new TrackEvent("addtrack", {track:document.createElement("track").track}) 
 PASS Stringification of new TrackEvent("addtrack", {track:document.createElement("track").track}) 
-PASS TrackEvent interface: new TrackEvent("addtrack", {track:document.createElement("track").track}) must inherit property "track" with the proper type (0) 
+PASS TrackEvent interface: new TrackEvent("addtrack", {track:document.createElement("track").track}) must inherit property "track" with the proper type 
 PASS HTMLMapElement interface: existence and properties of interface object 
 PASS HTMLMapElement interface object length 
 PASS HTMLMapElement interface object name 
@@ -1706,8 +1706,8 @@
 PASS HTMLMapElement interface: attribute areas 
 PASS HTMLMapElement must be primary interface of document.createElement("map") 
 PASS Stringification of document.createElement("map") 
-PASS HTMLMapElement interface: document.createElement("map") must inherit property "name" with the proper type (0) 
-PASS HTMLMapElement interface: document.createElement("map") must inherit property "areas" with the proper type (1) 
+PASS HTMLMapElement interface: document.createElement("map") must inherit property "name" with the proper type 
+PASS HTMLMapElement interface: document.createElement("map") must inherit property "areas" with the proper type 
 PASS HTMLAreaElement interface: existence and properties of interface object 
 PASS HTMLAreaElement interface object length 
 PASS HTMLAreaElement interface object name 
@@ -1737,27 +1737,27 @@
 PASS HTMLAreaElement interface: attribute hash 
 PASS HTMLAreaElement must be primary interface of document.createElement("area") 
 PASS Stringification of document.createElement("area") 
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "alt" with the proper type (0) 
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "coords" with the proper type (1) 
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "shape" with the proper type (2) 
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "target" with the proper type (3) 
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "download" with the proper type (4) 
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "ping" with the proper type (5) 
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "rel" with the proper type (6) 
-FAIL HTMLAreaElement interface: document.createElement("area") must inherit property "relList" with the proper type (7) assert_inherits: property "relList" not found in prototype chain
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "referrerPolicy" with the proper type (8) 
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "noHref" with the proper type (9) 
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "href" with the proper type (10) 
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "origin" with the proper type (11) 
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "protocol" with the proper type (12) 
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "username" with the proper type (13) 
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "password" with the proper type (14) 
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "host" with the proper type (15) 
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "hostname" with the proper type (16) 
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "port" with the proper type (17) 
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "pathname" with the proper type (18) 
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "search" with the proper type (19) 
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "hash" with the proper type (20) 
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "alt" with the proper type 
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "coords" with the proper type 
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "shape" with the proper type 
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "target" with the proper type 
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "download" with the proper type 
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "ping" with the proper type 
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "rel" with the proper type 
+FAIL HTMLAreaElement interface: document.createElement("area") must inherit property "relList" with the proper type assert_inherits: property "relList" not found in prototype chain
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "referrerPolicy" with the proper type 
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "noHref" with the proper type 
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "href" with the proper type 
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "origin" with the proper type 
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "protocol" with the proper type 
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "username" with the proper type 
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "password" with the proper type 
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "host" with the proper type 
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "hostname" with the proper type 
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "port" with the proper type 
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "pathname" with the proper type 
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "search" with the proper type 
+PASS HTMLAreaElement interface: document.createElement("area") must inherit property "hash" with the proper type 
 PASS HTMLTableElement interface: existence and properties of interface object 
 PASS HTMLTableElement interface object length 
 PASS HTMLTableElement interface object name 
@@ -1788,31 +1788,31 @@
 PASS HTMLTableElement interface: attribute cellSpacing 
 PASS HTMLTableElement must be primary interface of document.createElement("table") 
 PASS Stringification of document.createElement("table") 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "caption" with the proper type (0) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "createCaption" with the proper type (1) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteCaption" with the proper type (2) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "tHead" with the proper type (3) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "createTHead" with the proper type (4) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteTHead" with the proper type (5) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "tFoot" with the proper type (6) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "createTFoot" with the proper type (7) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteTFoot" with the proper type (8) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "tBodies" with the proper type (9) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "createTBody" with the proper type (10) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "rows" with the proper type (11) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "insertRow" with the proper type (12) 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "caption" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "createCaption()" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteCaption()" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "tHead" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "createTHead()" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteTHead()" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "tFoot" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "createTFoot()" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteTFoot()" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "tBodies" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "createTBody()" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "rows" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "insertRow(long)" with the proper type 
 PASS HTMLTableElement interface: calling insertRow(long) on document.createElement("table") with too few arguments must throw TypeError 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteRow" with the proper type (13) 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteRow(long)" with the proper type 
 PASS HTMLTableElement interface: calling deleteRow(long) on document.createElement("table") with too few arguments must throw TypeError 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "align" with the proper type (14) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "border" with the proper type (15) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "frame" with the proper type (16) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "rules" with the proper type (17) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "summary" with the proper type (18) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "width" with the proper type (19) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "bgColor" with the proper type (20) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "cellPadding" with the proper type (21) 
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "cellSpacing" with the proper type (22) 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "align" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "border" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "frame" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "rules" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "summary" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "width" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "bgColor" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "cellPadding" with the proper type 
+PASS HTMLTableElement interface: document.createElement("table") must inherit property "cellSpacing" with the proper type 
 PASS HTMLTableCaptionElement interface: existence and properties of interface object 
 PASS HTMLTableCaptionElement interface object length 
 PASS HTMLTableCaptionElement interface object name 
@@ -1821,7 +1821,7 @@
 PASS HTMLTableCaptionElement interface: attribute align 
 PASS HTMLTableCaptionElement must be primary interface of document.createElement("caption") 
 PASS Stringification of document.createElement("caption") 
-PASS HTMLTableCaptionElement interface: document.createElement("caption") must inherit property "align" with the proper type (0) 
+PASS HTMLTableCaptionElement interface: document.createElement("caption") must inherit property "align" with the proper type 
 PASS HTMLTableColElement interface: existence and properties of interface object 
 PASS HTMLTableColElement interface object length 
 PASS HTMLTableColElement interface object name 
@@ -1835,20 +1835,20 @@
 PASS HTMLTableColElement interface: attribute width 
 PASS HTMLTableColElement must be primary interface of document.createElement("colgroup") 
 PASS Stringification of document.createElement("colgroup") 
-PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "span" with the proper type (0) 
-PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "align" with the proper type (1) 
-PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "ch" with the proper type (2) 
-PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "chOff" with the proper type (3) 
-PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "vAlign" with the proper type (4) 
-PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "width" with the proper type (5) 
+PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "span" with the proper type 
+PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "align" with the proper type 
+PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "ch" with the proper type 
+PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "chOff" with the proper type 
+PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "vAlign" with the proper type 
+PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "width" with the proper type 
 PASS HTMLTableColElement must be primary interface of document.createElement("col") 
 PASS Stringification of document.createElement("col") 
-PASS HTMLTableColElement interface: document.createElement("col") must inherit property "span" with the proper type (0) 
-PASS HTMLTableColElement interface: document.createElement("col") must inherit property "align" with the proper type (1) 
-PASS HTMLTableColElement interface: document.createElement("col") must inherit property "ch" with the proper type (2) 
-PASS HTMLTableColElement interface: document.createElement("col") must inherit property "chOff" with the proper type (3) 
-PASS HTMLTableColElement interface: document.createElement("col") must inherit property "vAlign" with the proper type (4) 
-PASS HTMLTableColElement interface: document.createElement("col") must inherit property "width" with the proper type (5) 
+PASS HTMLTableColElement interface: document.createElement("col") must inherit property "span" with the proper type 
+PASS HTMLTableColElement interface: document.createElement("col") must inherit property "align" with the proper type 
+PASS HTMLTableColElement interface: document.createElement("col") must inherit property "ch" with the proper type 
+PASS HTMLTableColElement interface: document.createElement("col") must inherit property "chOff" with the proper type 
+PASS HTMLTableColElement interface: document.createElement("col") must inherit property "vAlign" with the proper type 
+PASS HTMLTableColElement interface: document.createElement("col") must inherit property "width" with the proper type 
 PASS HTMLTableSectionElement interface: existence and properties of interface object 
 PASS HTMLTableSectionElement interface object length 
 PASS HTMLTableSectionElement interface object name 
@@ -1863,37 +1863,37 @@
 PASS HTMLTableSectionElement interface: attribute vAlign 
 PASS HTMLTableSectionElement must be primary interface of document.createElement("tbody") 
 PASS Stringification of document.createElement("tbody") 
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "rows" with the proper type (0) 
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "insertRow" with the proper type (1) 
+PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "rows" with the proper type 
+PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "insertRow(long)" with the proper type 
 PASS HTMLTableSectionElement interface: calling insertRow(long) on document.createElement("tbody") with too few arguments must throw TypeError 
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "deleteRow" with the proper type (2) 
+PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "deleteRow(long)" with the proper type 
 PASS HTMLTableSectionElement interface: calling deleteRow(long) on document.createElement("tbody") with too few arguments must throw TypeError 
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "align" with the proper type (3) 
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "ch" with the proper type (4) 
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "chOff" with the proper type (5) 
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "vAlign" with the proper type (6) 
+PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "align" with the proper type 
+PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "ch" with the proper type 
+PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "chOff" with the proper type 
+PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "vAlign" with the proper type 
 PASS HTMLTableSectionElement must be primary interface of document.createElement("thead") 
 PASS Stringification of document.createElement("thead") 
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "rows" with the proper type (0) 
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "insertRow" with the proper type (1) 
+PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "rows" with the proper type 
+PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "insertRow(long)" with the proper type 
 PASS HTMLTableSectionElement interface: calling insertRow(long) on document.createElement("thead") with too few arguments must throw TypeError 
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "deleteRow" with the proper type (2) 
+PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "deleteRow(long)" with the proper type 
 PASS HTMLTableSectionElement interface: calling deleteRow(long) on document.createElement("thead") with too few arguments must throw TypeError 
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "align" with the proper type (3) 
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "ch" with the proper type (4) 
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "chOff" with the proper type (5) 
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "vAlign" with the proper type (6) 
+PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "align" with the proper type 
+PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "ch" with the proper type 
+PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "chOff" with the proper type 
+PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "vAlign" with the proper type 
 PASS HTMLTableSectionElement must be primary interface of document.createElement("tfoot") 
 PASS Stringification of document.createElement("tfoot") 
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "rows" with the proper type (0) 
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "insertRow" with the proper type (1) 
+PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "rows" with the proper type 
+PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "insertRow(long)" with the proper type 
 PASS HTMLTableSectionElement interface: calling insertRow(long) on document.createElement("tfoot") with too few arguments must throw TypeError 
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "deleteRow" with the proper type (2) 
+PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "deleteRow(long)" with the proper type 
 PASS HTMLTableSectionElement interface: calling deleteRow(long) on document.createElement("tfoot") with too few arguments must throw TypeError 
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "align" with the proper type (3) 
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "ch" with the proper type (4) 
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "chOff" with the proper type (5) 
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "vAlign" with the proper type (6) 
+PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "align" with the proper type 
+PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "ch" with the proper type 
+PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "chOff" with the proper type 
+PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "vAlign" with the proper type 
 PASS HTMLTableRowElement interface: existence and properties of interface object 
 PASS HTMLTableRowElement interface object length 
 PASS HTMLTableRowElement interface object name 
@@ -1911,18 +1911,18 @@
 PASS HTMLTableRowElement interface: attribute bgColor 
 PASS HTMLTableRowElement must be primary interface of document.createElement("tr") 
 PASS Stringification of document.createElement("tr") 
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "rowIndex" with the proper type (0) 
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "sectionRowIndex" with the proper type (1) 
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "cells" with the proper type (2) 
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "insertCell" with the proper type (3) 
+PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "rowIndex" with the proper type 
+PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "sectionRowIndex" with the proper type 
+PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "cells" with the proper type 
+PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "insertCell(long)" with the proper type 
 PASS HTMLTableRowElement interface: calling insertCell(long) on document.createElement("tr") with too few arguments must throw TypeError 
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "deleteCell" with the proper type (4) 
+PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "deleteCell(long)" with the proper type 
 PASS HTMLTableRowElement interface: calling deleteCell(long) on document.createElement("tr") with too few arguments must throw TypeError 
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "align" with the proper type (5) 
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "ch" with the proper type (6) 
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "chOff" with the proper type (7) 
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "vAlign" with the proper type (8) 
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "bgColor" with the proper type (9) 
+PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "align" with the proper type 
+PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "ch" with the proper type 
+PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "chOff" with the proper type 
+PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "vAlign" with the proper type 
+PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "bgColor" with the proper type 
 PASS HTMLTableCellElement interface: existence and properties of interface object 
 PASS HTMLTableCellElement interface object length 
 PASS HTMLTableCellElement interface object name 
@@ -1945,38 +1945,38 @@
 PASS HTMLTableCellElement interface: attribute bgColor 
 PASS HTMLTableCellElement must be primary interface of document.createElement("td") 
 PASS Stringification of document.createElement("td") 
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "colSpan" with the proper type (0) 
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "rowSpan" with the proper type (1) 
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "headers" with the proper type (2) 
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "cellIndex" with the proper type (3) 
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "scope" with the proper type (4) 
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "abbr" with the proper type (5) 
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "align" with the proper type (6) 
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "axis" with the proper type (7) 
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "height" with the proper type (8) 
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "width" with the proper type (9) 
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "ch" with the proper type (10) 
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "chOff" with the proper type (11) 
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "noWrap" with the proper type (12) 
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "vAlign" with the proper type (13) 
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "bgColor" with the proper type (14) 
+PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "colSpan" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "rowSpan" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "headers" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "cellIndex" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "scope" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "abbr" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "align" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "axis" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "height" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "width" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "ch" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "chOff" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "noWrap" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "vAlign" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "bgColor" with the proper type 
 PASS HTMLTableCellElement must be primary interface of document.createElement("th") 
 PASS Stringification of document.createElement("th") 
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "colSpan" with the proper type (0) 
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "rowSpan" with the proper type (1) 
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "headers" with the proper type (2) 
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "cellIndex" with the proper type (3) 
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "scope" with the proper type (4) 
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "abbr" with the proper type (5) 
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "align" with the proper type (6) 
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "axis" with the proper type (7) 
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "height" with the proper type (8) 
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "width" with the proper type (9) 
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "ch" with the proper type (10) 
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "chOff" with the proper type (11) 
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "noWrap" with the proper type (12) 
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "vAlign" with the proper type (13) 
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "bgColor" with the proper type (14) 
+PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "colSpan" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "rowSpan" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "headers" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "cellIndex" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "scope" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "abbr" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "align" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "axis" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "height" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "width" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "ch" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "chOff" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "noWrap" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "vAlign" with the proper type 
+PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "bgColor" with the proper type 
 PASS HTMLFormElement interface: existence and properties of interface object 
 PASS HTMLFormElement interface object length 
 PASS HTMLFormElement interface object name 
@@ -1999,21 +1999,21 @@
 PASS HTMLFormElement interface: operation reportValidity() 
 PASS HTMLFormElement must be primary interface of document.createElement("form") 
 PASS Stringification of document.createElement("form") 
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "acceptCharset" with the proper type (0) 
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "action" with the proper type (1) 
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "enctype" with the proper type (3) 
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "encoding" with the proper type (4) 
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "method" with the proper type (5) 
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "name" with the proper type (6) 
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "noValidate" with the proper type (7) 
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "target" with the proper type (8) 
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "elements" with the proper type (9) 
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "length" with the proper type (10) 
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "submit" with the proper type (13) 
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "reset" with the proper type (14) 
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "checkValidity" with the proper type (15) 
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "reportValidity" with the proper type (16) 
+PASS HTMLFormElement interface: document.createElement("form") must inherit property "acceptCharset" with the proper type 
+PASS HTMLFormElement interface: document.createElement("form") must inherit property "action" with the proper type 
+PASS HTMLFormElement interface: document.createElement("form") must inherit property "autocomplete" with the proper type 
+PASS HTMLFormElement interface: document.createElement("form") must inherit property "enctype" with the proper type 
+PASS HTMLFormElement interface: document.createElement("form") must inherit property "encoding" with the proper type 
+PASS HTMLFormElement interface: document.createElement("form") must inherit property "method" with the proper type 
+PASS HTMLFormElement interface: document.createElement("form") must inherit property "name" with the proper type 
+PASS HTMLFormElement interface: document.createElement("form") must inherit property "noValidate" with the proper type 
+PASS HTMLFormElement interface: document.createElement("form") must inherit property "target" with the proper type 
+PASS HTMLFormElement interface: document.createElement("form") must inherit property "elements" with the proper type 
+PASS HTMLFormElement interface: document.createElement("form") must inherit property "length" with the proper type 
+PASS HTMLFormElement interface: document.createElement("form") must inherit property "submit()" with the proper type 
+PASS HTMLFormElement interface: document.createElement("form") must inherit property "reset()" with the proper type 
+PASS HTMLFormElement interface: document.createElement("form") must inherit property "checkValidity()" with the proper type 
+PASS HTMLFormElement interface: document.createElement("form") must inherit property "reportValidity()" with the proper type 
 PASS HTMLLabelElement interface: existence and properties of interface object 
 PASS HTMLLabelElement interface object length 
 PASS HTMLLabelElement interface object name 
@@ -2024,9 +2024,9 @@
 PASS HTMLLabelElement interface: attribute control 
 PASS HTMLLabelElement must be primary interface of document.createElement("label") 
 PASS Stringification of document.createElement("label") 
-PASS HTMLLabelElement interface: document.createElement("label") must inherit property "form" with the proper type (0) 
-PASS HTMLLabelElement interface: document.createElement("label") must inherit property "htmlFor" with the proper type (1) 
-PASS HTMLLabelElement interface: document.createElement("label") must inherit property "control" with the proper type (2) 
+PASS HTMLLabelElement interface: document.createElement("label") must inherit property "form" with the proper type 
+PASS HTMLLabelElement interface: document.createElement("label") must inherit property "htmlFor" with the proper type 
+PASS HTMLLabelElement interface: document.createElement("label") must inherit property "control" with the proper type 
 PASS HTMLInputElement interface: existence and properties of interface object 
 PASS HTMLInputElement interface object length 
 PASS HTMLInputElement interface object name 
@@ -2084,1482 +2084,1482 @@
 PASS HTMLInputElement interface: attribute selectionEnd 
 PASS HTMLInputElement interface: attribute selectionDirection 
 PASS HTMLInputElement interface: operation setRangeText(DOMString) 
-PASS HTMLInputElement interface: operation setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) 
-PASS HTMLInputElement interface: operation setSelectionRange(unsigned long,unsigned long,DOMString) 
+PASS HTMLInputElement interface: operation setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) 
+PASS HTMLInputElement interface: operation setSelectionRange(unsigned long, unsigned long, DOMString) 
 PASS HTMLInputElement interface: attribute align 
 PASS HTMLInputElement interface: attribute useMap 
 PASS HTMLInputElement must be primary interface of document.createElement("input") 
 PASS Stringification of document.createElement("input") 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on document.createElement("input") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on document.createElement("input") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on document.createElement("input") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on document.createElement("input") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on document.createElement("input") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on document.createElement("input") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on document.createElement("input") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on document.createElement("input") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: document.createElement("input") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("text") 
 PASS Stringification of createInput("text") 
-PASS HTMLInputElement interface: createInput("text") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("text") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("text") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("text") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("text") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("text") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("text") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("text") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("text") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("text") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("text") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("text") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("text") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("text") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("text") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("text") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("text") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("text") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("text") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("text") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("text") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("text") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("text") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("text") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("hidden") 
 PASS Stringification of createInput("hidden") 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("hidden") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("hidden") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("hidden") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("hidden") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("hidden") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("hidden") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("hidden") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("hidden") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("hidden") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("search") 
 PASS Stringification of createInput("search") 
-PASS HTMLInputElement interface: createInput("search") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("search") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("search") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("search") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("search") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("search") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("search") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("search") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("search") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("search") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("search") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("search") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("search") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("search") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("search") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("search") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("search") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("search") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("search") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("search") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("search") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("search") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("search") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("search") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("tel") 
 PASS Stringification of createInput("tel") 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("tel") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("tel") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("tel") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("tel") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("tel") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("tel") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("tel") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("tel") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("tel") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("tel") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("url") 
 PASS Stringification of createInput("url") 
-PASS HTMLInputElement interface: createInput("url") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("url") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("url") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("url") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("url") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("url") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("url") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("url") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("url") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("url") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("url") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("url") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("url") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("url") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("url") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("url") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("url") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("url") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("url") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("url") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("url") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("url") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("url") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("url") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("email") 
 PASS Stringification of createInput("email") 
-PASS HTMLInputElement interface: createInput("email") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("email") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("email") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("email") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("email") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("email") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("email") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("email") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("email") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("email") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("email") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("email") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("email") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("email") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("email") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("email") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("email") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("email") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("email") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("email") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("email") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("email") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("email") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("email") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("password") 
 PASS Stringification of createInput("password") 
-PASS HTMLInputElement interface: createInput("password") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("password") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("password") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("password") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("password") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("password") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("password") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("password") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("password") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("password") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("password") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("password") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("password") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("password") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("password") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("password") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("password") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("password") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("password") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("password") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("password") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("password") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("password") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("password") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("date") 
 PASS Stringification of createInput("date") 
-PASS HTMLInputElement interface: createInput("date") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("date") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("date") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("date") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("date") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("date") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("date") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("date") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("date") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("date") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("date") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("date") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("date") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("date") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("date") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("date") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("date") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("date") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("date") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("date") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("date") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("date") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("date") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("date") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("month") 
 PASS Stringification of createInput("month") 
-PASS HTMLInputElement interface: createInput("month") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("month") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("month") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("month") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("month") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("month") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("month") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("month") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("month") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("month") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("month") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("month") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("month") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("month") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("month") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("month") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("month") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("month") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("month") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("month") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("month") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("month") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("month") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("month") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("week") 
 PASS Stringification of createInput("week") 
-PASS HTMLInputElement interface: createInput("week") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("week") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("week") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("week") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("week") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("week") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("week") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("week") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("week") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("week") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("week") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("week") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("week") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("week") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("week") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("week") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("week") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("week") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("week") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("week") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("week") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("week") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("week") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("week") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("time") 
 PASS Stringification of createInput("time") 
-PASS HTMLInputElement interface: createInput("time") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("time") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("time") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("time") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("time") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("time") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("time") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("time") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("time") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("time") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("time") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("time") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("time") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("time") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("time") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("time") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("time") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("time") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("time") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("time") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("time") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("time") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("time") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("time") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("datetime-local") 
 PASS Stringification of createInput("datetime-local") 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("datetime-local") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("datetime-local") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("datetime-local") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("datetime-local") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("datetime-local") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("datetime-local") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("datetime-local") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("datetime-local") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("number") 
 PASS Stringification of createInput("number") 
-PASS HTMLInputElement interface: createInput("number") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("number") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("number") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("number") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("number") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("number") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("number") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("number") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("number") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("number") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("number") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("number") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("number") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("number") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("number") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("number") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("number") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("number") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("number") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("number") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("number") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("number") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("number") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("number") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("range") 
 PASS Stringification of createInput("range") 
-PASS HTMLInputElement interface: createInput("range") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("range") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("range") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("range") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("range") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("range") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("range") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("range") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("range") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("range") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("range") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("range") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("range") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("range") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("range") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("range") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("range") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("range") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("range") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("range") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("range") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("range") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("range") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("range") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("color") 
 PASS Stringification of createInput("color") 
-PASS HTMLInputElement interface: createInput("color") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("color") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("color") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("color") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("color") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("color") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("color") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("color") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("color") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("color") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("color") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("color") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("color") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("color") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("color") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("color") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("color") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("color") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("color") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("color") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("color") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("color") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("color") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("color") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("checkbox") 
 PASS Stringification of createInput("checkbox") 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("checkbox") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("checkbox") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("checkbox") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("checkbox") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("checkbox") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("checkbox") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("checkbox") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("checkbox") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("checkbox") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("radio") 
 PASS Stringification of createInput("radio") 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("radio") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("radio") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("radio") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("radio") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("radio") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("radio") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("radio") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("radio") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("radio") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("radio") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("file") 
 PASS Stringification of createInput("file") 
-PASS HTMLInputElement interface: createInput("file") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "form" with the proper type (8) 
-FAIL HTMLInputElement interface: createInput("file") must inherit property "files" with the proper type (9) Unrecognized type FileList
-PASS HTMLInputElement interface: createInput("file") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("file") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "form" with the proper type 
+FAIL HTMLInputElement interface: createInput("file") must inherit property "files" with the proper type Unrecognized type FileList
+PASS HTMLInputElement interface: createInput("file") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("file") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("file") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("file") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("file") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("file") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("file") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("file") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("file") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("file") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("file") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("file") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("file") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("file") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("file") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("file") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("file") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("file") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("file") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("file") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("file") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("file") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("file") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("submit") 
 PASS Stringification of createInput("submit") 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("submit") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("submit") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("submit") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("submit") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("submit") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("submit") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("submit") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("submit") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("submit") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("submit") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("image") 
 PASS Stringification of createInput("image") 
-PASS HTMLInputElement interface: createInput("image") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("image") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("image") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("image") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("image") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("image") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("image") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("image") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("image") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("image") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("image") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("image") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("image") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("image") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("image") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("image") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("image") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("image") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("image") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("image") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("image") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("image") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("image") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("image") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("reset") 
 PASS Stringification of createInput("reset") 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("reset") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("reset") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("reset") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("reset") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("reset") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("reset") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("reset") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("reset") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("reset") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("reset") must inherit property "useMap" with the proper type 
 PASS HTMLInputElement must be primary interface of createInput("button") 
 PASS Stringification of createInput("button") 
-PASS HTMLInputElement interface: createInput("button") must inherit property "accept" with the proper type (0) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "alt" with the proper type (1) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "autocomplete" with the proper type (2) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "autofocus" with the proper type (3) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "defaultChecked" with the proper type (4) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "checked" with the proper type (5) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "dirName" with the proper type (6) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "disabled" with the proper type (7) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "form" with the proper type (8) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "files" with the proper type (9) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "formAction" with the proper type (10) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "formEnctype" with the proper type (11) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "formMethod" with the proper type (12) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "formNoValidate" with the proper type (13) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "formTarget" with the proper type (14) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "height" with the proper type (15) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "indeterminate" with the proper type (16) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "inputMode" with the proper type (17) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "list" with the proper type (18) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "max" with the proper type (19) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "maxLength" with the proper type (20) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "min" with the proper type (21) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "minLength" with the proper type (22) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "multiple" with the proper type (23) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "name" with the proper type (24) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "pattern" with the proper type (25) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "placeholder" with the proper type (26) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "readOnly" with the proper type (27) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "required" with the proper type (28) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "size" with the proper type (29) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "src" with the proper type (30) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "step" with the proper type (31) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "type" with the proper type (32) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "defaultValue" with the proper type (33) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "value" with the proper type (34) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "valueAsDate" with the proper type (35) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "valueAsNumber" with the proper type (36) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "width" with the proper type (37) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "stepUp" with the proper type (38) 
+PASS HTMLInputElement interface: createInput("button") must inherit property "accept" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "alt" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "autocomplete" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "autofocus" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "defaultChecked" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "checked" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "dirName" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "disabled" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "form" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "files" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "formAction" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "formEnctype" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "formMethod" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "formNoValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "formTarget" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "height" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "indeterminate" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "inputMode" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "list" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "max" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "maxLength" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "min" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "minLength" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "multiple" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "name" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "pattern" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "placeholder" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "readOnly" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "required" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "size" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "src" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "step" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "type" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "defaultValue" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "value" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "valueAsDate" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "valueAsNumber" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "width" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "stepUp(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepUp(long) on createInput("button") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("button") must inherit property "stepDown" with the proper type (39) 
+PASS HTMLInputElement interface: createInput("button") must inherit property "stepDown(long)" with the proper type 
 PASS HTMLInputElement interface: calling stepDown(long) on createInput("button") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("button") must inherit property "willValidate" with the proper type (40) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "validity" with the proper type (41) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "validationMessage" with the proper type (42) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "checkValidity" with the proper type (43) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "reportValidity" with the proper type (44) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "setCustomValidity" with the proper type (45) 
+PASS HTMLInputElement interface: createInput("button") must inherit property "willValidate" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "validity" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "validationMessage" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "checkValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "reportValidity()" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("button") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("button") must inherit property "labels" with the proper type (46) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "select" with the proper type (47) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "selectionStart" with the proper type (48) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "selectionEnd" with the proper type (49) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "selectionDirection" with the proper type (50) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "setRangeText" with the proper type (51) 
+PASS HTMLInputElement interface: createInput("button") must inherit property "labels" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "select()" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "selectionStart" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "selectionEnd" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "selectionDirection" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("button") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("button") must inherit property "setRangeText" with the proper type (52) 
-PASS HTMLInputElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on createInput("button") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("button") must inherit property "setSelectionRange" with the proper type (53) 
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on createInput("button") with too few arguments must throw TypeError 
-PASS HTMLInputElement interface: createInput("button") must inherit property "align" with the proper type (54) 
-PASS HTMLInputElement interface: createInput("button") must inherit property "useMap" with the proper type (55) 
+PASS HTMLInputElement interface: createInput("button") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("button") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("button") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("button") with too few arguments must throw TypeError 
+PASS HTMLInputElement interface: createInput("button") must inherit property "align" with the proper type 
+PASS HTMLInputElement interface: createInput("button") must inherit property "useMap" with the proper type 
 PASS HTMLButtonElement interface: existence and properties of interface object 
 PASS HTMLButtonElement interface object length 
 PASS HTMLButtonElement interface object name 
@@ -3585,25 +3585,25 @@
 PASS HTMLButtonElement interface: attribute labels 
 PASS HTMLButtonElement must be primary interface of document.createElement("button") 
 PASS Stringification of document.createElement("button") 
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "autofocus" with the proper type (0) 
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "disabled" with the proper type (1) 
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "form" with the proper type (2) 
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formAction" with the proper type (3) 
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formEnctype" with the proper type (4) 
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formMethod" with the proper type (5) 
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formNoValidate" with the proper type (6) 
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formTarget" with the proper type (7) 
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "name" with the proper type (8) 
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "type" with the proper type (9) 
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "value" with the proper type (10) 
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "willValidate" with the proper type (11) 
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "validity" with the proper type (12) 
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "validationMessage" with the proper type (13) 
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "checkValidity" with the proper type (14) 
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "reportValidity" with the proper type (15) 
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "setCustomValidity" with the proper type (16) 
+PASS HTMLButtonElement interface: document.createElement("button") must inherit property "autofocus" with the proper type 
+PASS HTMLButtonElement interface: document.createElement("button") must inherit property "disabled" with the proper type 
+PASS HTMLButtonElement interface: document.createElement("button") must inherit property "form" with the proper type 
+PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formAction" with the proper type 
+PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formEnctype" with the proper type 
+PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formMethod" with the proper type 
+PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formNoValidate" with the proper type 
+PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formTarget" with the proper type 
+PASS HTMLButtonElement interface: document.createElement("button") must inherit property "name" with the proper type 
+PASS HTMLButtonElement interface: document.createElement("button") must inherit property "type" with the proper type 
+PASS HTMLButtonElement interface: document.createElement("button") must inherit property "value" with the proper type 
+PASS HTMLButtonElement interface: document.createElement("button") must inherit property "willValidate" with the proper type 
+PASS HTMLButtonElement interface: document.createElement("button") must inherit property "validity" with the proper type 
+PASS HTMLButtonElement interface: document.createElement("button") must inherit property "validationMessage" with the proper type 
+PASS HTMLButtonElement interface: document.createElement("button") must inherit property "checkValidity()" with the proper type 
+PASS HTMLButtonElement interface: document.createElement("button") must inherit property "reportValidity()" with the proper type 
+PASS HTMLButtonElement interface: document.createElement("button") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLButtonElement interface: calling setCustomValidity(DOMString) on document.createElement("button") with too few arguments must throw TypeError 
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "labels" with the proper type (17) 
+PASS HTMLButtonElement interface: document.createElement("button") must inherit property "labels" with the proper type 
 PASS HTMLSelectElement interface: existence and properties of interface object 
 PASS HTMLSelectElement interface object length 
 PASS HTMLSelectElement interface object name 
@@ -3622,7 +3622,7 @@
 PASS HTMLSelectElement interface: attribute length 
 PASS HTMLSelectElement interface: operation item(unsigned long) 
 PASS HTMLSelectElement interface: operation namedItem(DOMString) 
-PASS HTMLSelectElement interface: operation add([object Object],[object Object],[object Object],[object Object]) 
+PASS HTMLSelectElement interface: operation add([object Object],[object Object], [object Object],[object Object]) 
 PASS HTMLSelectElement interface: operation remove() 
 PASS HTMLSelectElement interface: operation remove(long) 
 PASS HTMLSelectElement interface: attribute selectedOptions 
@@ -3637,37 +3637,37 @@
 PASS HTMLSelectElement interface: attribute labels 
 PASS HTMLSelectElement must be primary interface of document.createElement("select") 
 PASS Stringification of document.createElement("select") 
-FAIL HTMLSelectElement interface: document.createElement("select") must inherit property "autocomplete" with the proper type (0) assert_inherits: property "autocomplete" not found in prototype chain
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "autofocus" with the proper type (1) 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "disabled" with the proper type (2) 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "form" with the proper type (3) 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "multiple" with the proper type (4) 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "name" with the proper type (5) 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "required" with the proper type (6) 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "size" with the proper type (7) 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "type" with the proper type (8) 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "options" with the proper type (9) 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "length" with the proper type (10) 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "item" with the proper type (11) 
+FAIL HTMLSelectElement interface: document.createElement("select") must inherit property "autocomplete" with the proper type assert_inherits: property "autocomplete" not found in prototype chain
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "autofocus" with the proper type 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "disabled" with the proper type 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "form" with the proper type 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "multiple" with the proper type 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "name" with the proper type 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "required" with the proper type 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "size" with the proper type 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "type" with the proper type 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "options" with the proper type 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "length" with the proper type 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "item(unsigned long)" with the proper type 
 PASS HTMLSelectElement interface: calling item(unsigned long) on document.createElement("select") with too few arguments must throw TypeError 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "namedItem" with the proper type (12) 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "namedItem(DOMString)" with the proper type 
 PASS HTMLSelectElement interface: calling namedItem(DOMString) on document.createElement("select") with too few arguments must throw TypeError 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "add" with the proper type (13) 
-PASS HTMLSelectElement interface: calling add([object Object],[object Object],[object Object],[object Object]) on document.createElement("select") with too few arguments must throw TypeError 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "remove" with the proper type (14) 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "remove" with the proper type (15) 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "add([object Object],[object Object], [object Object],[object Object])" with the proper type 
+PASS HTMLSelectElement interface: calling add([object Object],[object Object], [object Object],[object Object]) on document.createElement("select") with too few arguments must throw TypeError 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "remove()" with the proper type 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "remove(long)" with the proper type 
 PASS HTMLSelectElement interface: calling remove(long) on document.createElement("select") with too few arguments must throw TypeError 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "selectedOptions" with the proper type (17) 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "selectedIndex" with the proper type (18) 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "value" with the proper type (19) 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "willValidate" with the proper type (20) 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "validity" with the proper type (21) 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "validationMessage" with the proper type (22) 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "checkValidity" with the proper type (23) 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "reportValidity" with the proper type (24) 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "setCustomValidity" with the proper type (25) 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "selectedOptions" with the proper type 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "selectedIndex" with the proper type 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "value" with the proper type 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "willValidate" with the proper type 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "validity" with the proper type 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "validationMessage" with the proper type 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "checkValidity()" with the proper type 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "reportValidity()" with the proper type 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLSelectElement interface: calling setCustomValidity(DOMString) on document.createElement("select") with too few arguments must throw TypeError 
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "labels" with the proper type (26) 
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "labels" with the proper type 
 PASS HTMLDataListElement interface: existence and properties of interface object 
 PASS HTMLDataListElement interface object length 
 PASS HTMLDataListElement interface object name 
@@ -3676,7 +3676,7 @@
 PASS HTMLDataListElement interface: attribute options 
 PASS HTMLDataListElement must be primary interface of document.createElement("datalist") 
 PASS Stringification of document.createElement("datalist") 
-PASS HTMLDataListElement interface: document.createElement("datalist") must inherit property "options" with the proper type (0) 
+PASS HTMLDataListElement interface: document.createElement("datalist") must inherit property "options" with the proper type 
 PASS HTMLOptGroupElement interface: existence and properties of interface object 
 PASS HTMLOptGroupElement interface object length 
 PASS HTMLOptGroupElement interface object name 
@@ -3686,8 +3686,8 @@
 PASS HTMLOptGroupElement interface: attribute label 
 PASS HTMLOptGroupElement must be primary interface of document.createElement("optgroup") 
 PASS Stringification of document.createElement("optgroup") 
-PASS HTMLOptGroupElement interface: document.createElement("optgroup") must inherit property "disabled" with the proper type (0) 
-PASS HTMLOptGroupElement interface: document.createElement("optgroup") must inherit property "label" with the proper type (1) 
+PASS HTMLOptGroupElement interface: document.createElement("optgroup") must inherit property "disabled" with the proper type 
+PASS HTMLOptGroupElement interface: document.createElement("optgroup") must inherit property "label" with the proper type 
 PASS HTMLOptionElement interface: existence and properties of interface object 
 PASS HTMLOptionElement interface object length 
 PASS HTMLOptionElement interface object name 
@@ -3703,24 +3703,24 @@
 PASS HTMLOptionElement interface: attribute index 
 PASS HTMLOptionElement must be primary interface of document.createElement("option") 
 PASS Stringification of document.createElement("option") 
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "disabled" with the proper type (0) 
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "form" with the proper type (1) 
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "label" with the proper type (2) 
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "defaultSelected" with the proper type (3) 
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "selected" with the proper type (4) 
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "value" with the proper type (5) 
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "text" with the proper type (6) 
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "index" with the proper type (7) 
+PASS HTMLOptionElement interface: document.createElement("option") must inherit property "disabled" with the proper type 
+PASS HTMLOptionElement interface: document.createElement("option") must inherit property "form" with the proper type 
+PASS HTMLOptionElement interface: document.createElement("option") must inherit property "label" with the proper type 
+PASS HTMLOptionElement interface: document.createElement("option") must inherit property "defaultSelected" with the proper type 
+PASS HTMLOptionElement interface: document.createElement("option") must inherit property "selected" with the proper type 
+PASS HTMLOptionElement interface: document.createElement("option") must inherit property "value" with the proper type 
+PASS HTMLOptionElement interface: document.createElement("option") must inherit property "text" with the proper type 
+PASS HTMLOptionElement interface: document.createElement("option") must inherit property "index" with the proper type 
 PASS HTMLOptionElement must be primary interface of new Option() 
 PASS Stringification of new Option() 
-PASS HTMLOptionElement interface: new Option() must inherit property "disabled" with the proper type (0) 
-PASS HTMLOptionElement interface: new Option() must inherit property "form" with the proper type (1) 
-PASS HTMLOptionElement interface: new Option() must inherit property "label" with the proper type (2) 
-PASS HTMLOptionElement interface: new Option() must inherit property "defaultSelected" with the proper type (3) 
-PASS HTMLOptionElement interface: new Option() must inherit property "selected" with the proper type (4) 
-PASS HTMLOptionElement interface: new Option() must inherit property "value" with the proper type (5) 
-PASS HTMLOptionElement interface: new Option() must inherit property "text" with the proper type (6) 
-PASS HTMLOptionElement interface: new Option() must inherit property "index" with the proper type (7) 
+PASS HTMLOptionElement interface: new Option() must inherit property "disabled" with the proper type 
+PASS HTMLOptionElement interface: new Option() must inherit property "form" with the proper type 
+PASS HTMLOptionElement interface: new Option() must inherit property "label" with the proper type 
+PASS HTMLOptionElement interface: new Option() must inherit property "defaultSelected" with the proper type 
+PASS HTMLOptionElement interface: new Option() must inherit property "selected" with the proper type 
+PASS HTMLOptionElement interface: new Option() must inherit property "value" with the proper type 
+PASS HTMLOptionElement interface: new Option() must inherit property "text" with the proper type 
+PASS HTMLOptionElement interface: new Option() must inherit property "index" with the proper type 
 PASS HTMLTextAreaElement interface: existence and properties of interface object 
 PASS HTMLTextAreaElement interface object length 
 PASS HTMLTextAreaElement interface object name 
@@ -3757,47 +3757,47 @@
 PASS HTMLTextAreaElement interface: attribute selectionEnd 
 PASS HTMLTextAreaElement interface: attribute selectionDirection 
 PASS HTMLTextAreaElement interface: operation setRangeText(DOMString) 
-PASS HTMLTextAreaElement interface: operation setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) 
-PASS HTMLTextAreaElement interface: operation setSelectionRange(unsigned long,unsigned long,DOMString) 
+PASS HTMLTextAreaElement interface: operation setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) 
+PASS HTMLTextAreaElement interface: operation setSelectionRange(unsigned long, unsigned long, DOMString) 
 PASS HTMLTextAreaElement must be primary interface of document.createElement("textarea") 
 PASS Stringification of document.createElement("textarea") 
-FAIL HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autocomplete" with the proper type (0) assert_inherits: property "autocomplete" not found in prototype chain
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autofocus" with the proper type (1) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "cols" with the proper type (2) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "dirName" with the proper type (3) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "disabled" with the proper type (4) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "form" with the proper type (5) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "inputMode" with the proper type (6) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "maxLength" with the proper type (7) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "minLength" with the proper type (8) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "name" with the proper type (9) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "placeholder" with the proper type (10) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "readOnly" with the proper type (11) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "required" with the proper type (12) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "rows" with the proper type (13) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "wrap" with the proper type (14) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "type" with the proper type (15) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "defaultValue" with the proper type (16) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "value" with the proper type (17) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "textLength" with the proper type (18) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "willValidate" with the proper type (19) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "validity" with the proper type (20) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "validationMessage" with the proper type (21) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "checkValidity" with the proper type (22) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "reportValidity" with the proper type (23) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setCustomValidity" with the proper type (24) 
+FAIL HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autocomplete" with the proper type assert_inherits: property "autocomplete" not found in prototype chain
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autofocus" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "cols" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "dirName" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "disabled" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "form" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "inputMode" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "maxLength" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "minLength" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "name" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "placeholder" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "readOnly" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "required" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "rows" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "wrap" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "type" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "defaultValue" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "value" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "textLength" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "willValidate" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "validity" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "validationMessage" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "checkValidity()" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "reportValidity()" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLTextAreaElement interface: calling setCustomValidity(DOMString) on document.createElement("textarea") with too few arguments must throw TypeError 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "labels" with the proper type (25) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "select" with the proper type (26) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "selectionStart" with the proper type (27) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "selectionEnd" with the proper type (28) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "selectionDirection" with the proper type (29) 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setRangeText" with the proper type (30) 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "labels" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "select()" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "selectionStart" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "selectionEnd" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "selectionDirection" with the proper type 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setRangeText(DOMString)" with the proper type 
 PASS HTMLTextAreaElement interface: calling setRangeText(DOMString) on document.createElement("textarea") with too few arguments must throw TypeError 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setRangeText" with the proper type (31) 
-PASS HTMLTextAreaElement interface: calling setRangeText(DOMString,unsigned long,unsigned long,SelectionMode) on document.createElement("textarea") with too few arguments must throw TypeError 
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setSelectionRange" with the proper type (32) 
-PASS HTMLTextAreaElement interface: calling setSelectionRange(unsigned long,unsigned long,DOMString) on document.createElement("textarea") with too few arguments must throw TypeError 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type 
+PASS HTMLTextAreaElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on document.createElement("textarea") with too few arguments must throw TypeError 
+PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type 
+PASS HTMLTextAreaElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on document.createElement("textarea") with too few arguments must throw TypeError 
 PASS HTMLOutputElement interface: existence and properties of interface object 
 PASS HTMLOutputElement interface object length 
 PASS HTMLOutputElement interface object name 
@@ -3818,20 +3818,20 @@
 PASS HTMLOutputElement interface: attribute labels 
 PASS HTMLOutputElement must be primary interface of document.createElement("output") 
 PASS Stringification of document.createElement("output") 
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "htmlFor" with the proper type (0) 
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "form" with the proper type (1) 
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "name" with the proper type (2) 
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "type" with the proper type (3) 
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "defaultValue" with the proper type (4) 
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "value" with the proper type (5) 
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "willValidate" with the proper type (6) 
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "validity" with the proper type (7) 
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "validationMessage" with the proper type (8) 
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "checkValidity" with the proper type (9) 
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "reportValidity" with the proper type (10) 
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "setCustomValidity" with the proper type (11) 
+PASS HTMLOutputElement interface: document.createElement("output") must inherit property "htmlFor" with the proper type 
+PASS HTMLOutputElement interface: document.createElement("output") must inherit property "form" with the proper type 
+PASS HTMLOutputElement interface: document.createElement("output") must inherit property "name" with the proper type 
+PASS HTMLOutputElement interface: document.createElement("output") must inherit property "type" with the proper type 
+PASS HTMLOutputElement interface: document.createElement("output") must inherit property "defaultValue" with the proper type 
+PASS HTMLOutputElement interface: document.createElement("output") must inherit property "value" with the proper type 
+PASS HTMLOutputElement interface: document.createElement("output") must inherit property "willValidate" with the proper type 
+PASS HTMLOutputElement interface: document.createElement("output") must inherit property "validity" with the proper type 
+PASS HTMLOutputElement interface: document.createElement("output") must inherit property "validationMessage" with the proper type 
+PASS HTMLOutputElement interface: document.createElement("output") must inherit property "checkValidity()" with the proper type 
+PASS HTMLOutputElement interface: document.createElement("output") must inherit property "reportValidity()" with the proper type 
+PASS HTMLOutputElement interface: document.createElement("output") must inherit property "setCustomValidity(DOMString)" with the proper type 
 PASS HTMLOutputElement interface: calling setCustomValidity(DOMString) on document.createElement("output") with too few arguments must throw TypeError 
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "labels" with the proper type (12) 
+PASS HTMLOutputElement interface: document.createElement("output") must inherit property "labels" with the proper type 
 PASS HTMLProgressElement interface: existence and properties of interface object 
 PASS HTMLProgressElement interface object length 
 PASS HTMLProgressElement interface object name 
@@ -3843,10 +3843,10 @@
 PASS HTMLProgressElement interface: attribute labels 
 PASS HTMLProgressElement must be primary interface of document.createElement("progress") 
 PASS Stringification of document.createElement("progress") 
-PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "value" with the proper type (0) 
-PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "max" with the proper type (1) 
-PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "position" with the proper type (2) 
-PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "labels" with the proper type (3) 
+PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "value" with the proper type 
+PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "max" with the proper type 
+PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "position" with the proper type 
+PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "labels" with the proper type 
 PASS HTMLMeterElement interface: existence and properties of interface object 
 PASS HTMLMeterElement interface object length 
 PASS HTMLMeterElement interface object name 
@@ -3861,13 +3861,13 @@
 PASS HTMLMeterElement interface: attribute labels 
 PASS HTMLMeterElement must be primary interface of document.createElement("meter") 
 PASS Stringification of document.createElement("meter") 
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "value" with the proper type (0) 
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "min" with the proper type (1) 
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "max" with the proper type (2) 
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "low" with the proper type (3) 
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "high" with the proper type (4) 
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "optimum" with the proper type (5) 
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "labels" with the proper type (6) 
+PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "value" with the proper type 
+PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "min" with the proper type 
+PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "max" with the proper type 
+PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "low" with the proper type 
+PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "high" with the proper type 
+PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "optimum" with the proper type 
+PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "labels" with the proper type 
 PASS HTMLFieldSetElement interface: existence and properties of interface object 
 PASS HTMLFieldSetElement interface object length 
 PASS HTMLFieldSetElement interface object name 
@@ -3893,8 +3893,8 @@
 PASS HTMLLegendElement interface: attribute align 
 PASS HTMLLegendElement must be primary interface of document.createElement("legend") 
 PASS Stringification of document.createElement("legend") 
-PASS HTMLLegendElement interface: document.createElement("legend") must inherit property "form" with the proper type (0) 
-PASS HTMLLegendElement interface: document.createElement("legend") must inherit property "align" with the proper type (1) 
+PASS HTMLLegendElement interface: document.createElement("legend") must inherit property "form" with the proper type 
+PASS HTMLLegendElement interface: document.createElement("legend") must inherit property "align" with the proper type 
 PASS ValidityState interface: existence and properties of interface object 
 PASS ValidityState interface object length 
 PASS ValidityState interface object name 
@@ -3913,17 +3913,17 @@
 PASS ValidityState interface: attribute valid 
 PASS ValidityState must be primary interface of document.createElement("input").validity 
 PASS Stringification of document.createElement("input").validity 
-PASS ValidityState interface: document.createElement("input").validity must inherit property "valueMissing" with the proper type (0) 
-PASS ValidityState interface: document.createElement("input").validity must inherit property "typeMismatch" with the proper type (1) 
-PASS ValidityState interface: document.createElement("input").validity must inherit property "patternMismatch" with the proper type (2) 
-PASS ValidityState interface: document.createElement("input").validity must inherit property "tooLong" with the proper type (3) 
-PASS ValidityState interface: document.createElement("input").validity must inherit property "tooShort" with the proper type (4) 
-PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeUnderflow" with the proper type (5) 
-PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeOverflow" with the proper type (6) 
-PASS ValidityState interface: document.createElement("input").validity must inherit property "stepMismatch" with the proper type (7) 
-PASS ValidityState interface: document.createElement("input").validity must inherit property "badInput" with the proper type (8) 
-PASS ValidityState interface: document.createElement("input").validity must inherit property "customError" with the proper type (9) 
-PASS ValidityState interface: document.createElement("input").validity must inherit property "valid" with the proper type (10) 
+PASS ValidityState interface: document.createElement("input").validity must inherit property "valueMissing" with the proper type 
+PASS ValidityState interface: document.createElement("input").validity must inherit property "typeMismatch" with the proper type 
+PASS ValidityState interface: document.createElement("input").validity must inherit property "patternMismatch" with the proper type 
+PASS ValidityState interface: document.createElement("input").validity must inherit property "tooLong" with the proper type 
+PASS ValidityState interface: document.createElement("input").validity must inherit property "tooShort" with the proper type 
+PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeUnderflow" with the proper type 
+PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeOverflow" with the proper type 
+PASS ValidityState interface: document.createElement("input").validity must inherit property "stepMismatch" with the proper type 
+PASS ValidityState interface: document.createElement("input").validity must inherit property "badInput" with the proper type 
+PASS ValidityState interface: document.createElement("input").validity must inherit property "customError" with the proper type 
+PASS ValidityState interface: document.createElement("input").validity must inherit property "valid" with the proper type 
 PASS HTMLDetailsElement interface: existence and properties of interface object 
 PASS HTMLDetailsElement interface object length 
 PASS HTMLDetailsElement interface object name 
@@ -3932,7 +3932,7 @@
 PASS HTMLDetailsElement interface: attribute open 
 PASS HTMLDetailsElement must be primary interface of document.createElement("details") 
 PASS Stringification of document.createElement("details") 
-PASS HTMLDetailsElement interface: document.createElement("details") must inherit property "open" with the proper type (0) 
+PASS HTMLDetailsElement interface: document.createElement("details") must inherit property "open" with the proper type 
 PASS HTMLMenuElement interface: existence and properties of interface object 
 PASS HTMLMenuElement interface object length 
 PASS HTMLMenuElement interface object name 
@@ -3941,7 +3941,7 @@
 PASS HTMLMenuElement interface: attribute compact 
 PASS HTMLMenuElement must be primary interface of document.createElement("menu") 
 PASS Stringification of document.createElement("menu") 
-PASS HTMLMenuElement interface: document.createElement("menu") must inherit property "compact" with the proper type (0) 
+PASS HTMLMenuElement interface: document.createElement("menu") must inherit property "compact" with the proper type 
 PASS HTMLDialogElement interface: existence and properties of interface object 
 PASS HTMLDialogElement interface object length 
 PASS HTMLDialogElement interface object name 
@@ -3971,18 +3971,18 @@
 PASS HTMLScriptElement interface: attribute htmlFor 
 PASS HTMLScriptElement must be primary interface of document.createElement("script") 
 PASS Stringification of document.createElement("script") 
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "src" with the proper type (0) 
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "type" with the proper type (1) 
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "noModule" with the proper type (2) 
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "charset" with the proper type (3) 
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "async" with the proper type (4) 
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "defer" with the proper type (5) 
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "crossOrigin" with the proper type (6) 
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "text" with the proper type (7) 
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "nonce" with the proper type (8) 
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "integrity" with the proper type (9) 
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "event" with the proper type (10) 
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "htmlFor" with the proper type (11) 
+PASS HTMLScriptElement interface: document.createElement("script") must inherit property "src" with the proper type 
+PASS HTMLScriptElement interface: document.createElement("script") must inherit property "type" with the proper type 
+PASS HTMLScriptElement interface: document.createElement("script") must inherit property "noModule" with the proper type 
+PASS HTMLScriptElement interface: document.createElement("script") must inherit property "charset" with the proper type 
+PASS HTMLScriptElement interface: document.createElement("script") must inherit property "async" with the proper type 
+PASS HTMLScriptElement interface: document.createElement("script") must inherit property "defer" with the proper type 
+PASS HTMLScriptElement interface: document.createElement("script") must inherit property "crossOrigin" with the proper type 
+PASS HTMLScriptElement interface: document.createElement("script") must inherit property "text" with the proper type 
+PASS HTMLScriptElement interface: document.createElement("script") must inherit property "nonce" with the proper type 
+PASS HTMLScriptElement interface: document.createElement("script") must inherit property "integrity" with the proper type 
+PASS HTMLScriptElement interface: document.createElement("script") must inherit property "event" with the proper type 
+PASS HTMLScriptElement interface: document.createElement("script") must inherit property "htmlFor" with the proper type 
 PASS HTMLTemplateElement interface: existence and properties of interface object 
 PASS HTMLTemplateElement interface object length 
 PASS HTMLTemplateElement interface object name 
@@ -3991,7 +3991,7 @@
 PASS HTMLTemplateElement interface: attribute content 
 PASS HTMLTemplateElement must be primary interface of document.createElement("template") 
 PASS Stringification of document.createElement("template") 
-PASS HTMLTemplateElement interface: document.createElement("template") must inherit property "content" with the proper type (0) 
+PASS HTMLTemplateElement interface: document.createElement("template") must inherit property "content" with the proper type 
 PASS HTMLSlotElement interface: existence and properties of interface object 
 PASS HTMLSlotElement interface object length 
 PASS HTMLSlotElement interface object name 
@@ -4001,8 +4001,8 @@
 PASS HTMLSlotElement interface: operation assignedNodes(AssignedNodesOptions) 
 PASS HTMLSlotElement must be primary interface of document.createElement("slot") 
 PASS Stringification of document.createElement("slot") 
-PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "name" with the proper type (0) 
-PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "assignedNodes" with the proper type (1) 
+PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "name" with the proper type 
+PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "assignedNodes(AssignedNodesOptions)" with the proper type 
 PASS HTMLSlotElement interface: calling assignedNodes(AssignedNodesOptions) on document.createElement("slot") with too few arguments must throw TypeError 
 PASS HTMLCanvasElement interface: existence and properties of interface object 
 PASS HTMLCanvasElement interface object length 
@@ -4011,19 +4011,19 @@
 PASS HTMLCanvasElement interface: existence and properties of interface prototype object's "constructor" property 
 PASS HTMLCanvasElement interface: attribute width 
 PASS HTMLCanvasElement interface: attribute height 
-PASS HTMLCanvasElement interface: operation getContext(DOMString,any) 
-PASS HTMLCanvasElement interface: operation toDataURL(DOMString,any) 
-PASS HTMLCanvasElement interface: operation toBlob(BlobCallback,DOMString,any) 
+PASS HTMLCanvasElement interface: operation getContext(DOMString, any) 
+PASS HTMLCanvasElement interface: operation toDataURL(DOMString, any) 
+PASS HTMLCanvasElement interface: operation toBlob(BlobCallback, DOMString, any) 
 PASS HTMLCanvasElement must be primary interface of document.createElement("canvas") 
 PASS Stringification of document.createElement("canvas") 
-PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "width" with the proper type (0) 
-PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "height" with the proper type (1) 
-PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "getContext" with the proper type (2) 
-PASS HTMLCanvasElement interface: calling getContext(DOMString,any) on document.createElement("canvas") with too few arguments must throw TypeError 
-PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toDataURL" with the proper type (3) 
-PASS HTMLCanvasElement interface: calling toDataURL(DOMString,any) on document.createElement("canvas") with too few arguments must throw TypeError 
-PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toBlob" with the proper type (4) 
-PASS HTMLCanvasElement interface: calling toBlob(BlobCallback,DOMString,any) on document.createElement("canvas") with too few arguments must throw TypeError 
+PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "width" with the proper type 
+PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "height" with the proper type 
+PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "getContext(DOMString, any)" with the proper type 
+PASS HTMLCanvasElement interface: calling getContext(DOMString, any) on document.createElement("canvas") with too few arguments must throw TypeError 
+PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toDataURL(DOMString, any)" with the proper type 
+PASS HTMLCanvasElement interface: calling toDataURL(DOMString, any) on document.createElement("canvas") with too few arguments must throw TypeError 
+PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toBlob(BlobCallback, DOMString, any)" with the proper type 
+PASS HTMLCanvasElement interface: calling toBlob(BlobCallback, DOMString, any) on document.createElement("canvas") with too few arguments must throw TypeError 
 PASS CanvasRenderingContext2D interface: existence and properties of interface object 
 PASS CanvasRenderingContext2D interface object length 
 PASS CanvasRenderingContext2D interface object name 
@@ -4032,12 +4032,12 @@
 PASS CanvasRenderingContext2D interface: attribute canvas 
 PASS CanvasRenderingContext2D interface: operation save() 
 PASS CanvasRenderingContext2D interface: operation restore() 
-PASS CanvasRenderingContext2D interface: operation scale(unrestricted double,unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double) 
 PASS CanvasRenderingContext2D interface: operation rotate(unrestricted double) 
-PASS CanvasRenderingContext2D interface: operation translate(unrestricted double,unrestricted double) 
-PASS CanvasRenderingContext2D interface: operation transform(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
 FAIL CanvasRenderingContext2D interface: operation getTransform() assert_own_property: interface prototype object missing non-static operation expected property "getTransform" missing
-FAIL CanvasRenderingContext2D interface: operation setTransform(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) assert_equals: property has wrong .length expected 0 but got 6
+FAIL CanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) assert_equals: property has wrong .length expected 0 but got 6
 FAIL CanvasRenderingContext2D interface: operation setTransform(DOMMatrixInit) assert_equals: property has wrong .length expected 0 but got 6
 PASS CanvasRenderingContext2D interface: operation resetTransform() 
 PASS CanvasRenderingContext2D interface: attribute globalAlpha 
@@ -4046,47 +4046,47 @@
 PASS CanvasRenderingContext2D interface: attribute imageSmoothingQuality 
 PASS CanvasRenderingContext2D interface: attribute strokeStyle 
 PASS CanvasRenderingContext2D interface: attribute fillStyle 
-PASS CanvasRenderingContext2D interface: operation createLinearGradient(double,double,double,double) 
-PASS CanvasRenderingContext2D interface: operation createRadialGradient(double,double,double,double,double,double) 
-PASS CanvasRenderingContext2D interface: operation createPattern(CanvasImageSource,DOMString) 
+PASS CanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double) 
+PASS CanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double) 
+PASS CanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString) 
 PASS CanvasRenderingContext2D interface: attribute shadowOffsetX 
 PASS CanvasRenderingContext2D interface: attribute shadowOffsetY 
 PASS CanvasRenderingContext2D interface: attribute shadowBlur 
 PASS CanvasRenderingContext2D interface: attribute shadowColor 
 PASS CanvasRenderingContext2D interface: attribute filter 
-PASS CanvasRenderingContext2D interface: operation clearRect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS CanvasRenderingContext2D interface: operation fillRect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS CanvasRenderingContext2D interface: operation strokeRect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
 PASS CanvasRenderingContext2D interface: operation beginPath() 
 PASS CanvasRenderingContext2D interface: operation fill(CanvasFillRule) 
-PASS CanvasRenderingContext2D interface: operation fill(Path2D,CanvasFillRule) 
+PASS CanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule) 
 PASS CanvasRenderingContext2D interface: operation stroke() 
 PASS CanvasRenderingContext2D interface: operation stroke(Path2D) 
 PASS CanvasRenderingContext2D interface: operation clip(CanvasFillRule) 
-PASS CanvasRenderingContext2D interface: operation clip(Path2D,CanvasFillRule) 
+PASS CanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule) 
 FAIL CanvasRenderingContext2D interface: operation resetClip() assert_own_property: interface prototype object missing non-static operation expected property "resetClip" missing
-PASS CanvasRenderingContext2D interface: operation isPointInPath(unrestricted double,unrestricted double,CanvasFillRule) 
-PASS CanvasRenderingContext2D interface: operation isPointInPath(Path2D,unrestricted double,unrestricted double,CanvasFillRule) 
-PASS CanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double,unrestricted double) 
-PASS CanvasRenderingContext2D interface: operation isPointInStroke(Path2D,unrestricted double,unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule) 
+PASS CanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule) 
+PASS CanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double) 
 PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Element) 
-PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Path2D,Element) 
+PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Path2D, Element) 
 PASS CanvasRenderingContext2D interface: operation scrollPathIntoView() 
 PASS CanvasRenderingContext2D interface: operation scrollPathIntoView(Path2D) 
-PASS CanvasRenderingContext2D interface: operation fillText(DOMString,unrestricted double,unrestricted double,unrestricted double) 
-PASS CanvasRenderingContext2D interface: operation strokeText(DOMString,unrestricted double,unrestricted double,unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double) 
 PASS CanvasRenderingContext2D interface: operation measureText(DOMString) 
-PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource,unrestricted double,unrestricted double) 
-PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource,unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
 PASS CanvasRenderingContext2D interface: operation addHitRegion(HitRegionOptions) 
 PASS CanvasRenderingContext2D interface: operation removeHitRegion(DOMString) 
 PASS CanvasRenderingContext2D interface: operation clearHitRegions() 
-PASS CanvasRenderingContext2D interface: operation createImageData(double,double) 
+PASS CanvasRenderingContext2D interface: operation createImageData(double, double) 
 PASS CanvasRenderingContext2D interface: operation createImageData(ImageData) 
-PASS CanvasRenderingContext2D interface: operation getImageData(double,double,double,double) 
-PASS CanvasRenderingContext2D interface: operation putImageData(ImageData,double,double) 
-PASS CanvasRenderingContext2D interface: operation putImageData(ImageData,double,double,double,double,double,double) 
+PASS CanvasRenderingContext2D interface: operation getImageData(double, double, double, double) 
+PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, double, double) 
+PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, double, double, double, double, double, double) 
 PASS CanvasRenderingContext2D interface: attribute lineWidth 
 PASS CanvasRenderingContext2D interface: attribute lineCap 
 PASS CanvasRenderingContext2D interface: attribute lineJoin 
@@ -4099,149 +4099,149 @@
 PASS CanvasRenderingContext2D interface: attribute textBaseline 
 PASS CanvasRenderingContext2D interface: attribute direction 
 PASS CanvasRenderingContext2D interface: operation closePath() 
-PASS CanvasRenderingContext2D interface: operation moveTo(unrestricted double,unrestricted double) 
-PASS CanvasRenderingContext2D interface: operation lineTo(unrestricted double,unrestricted double) 
-PASS CanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS CanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS CanvasRenderingContext2D interface: operation arcTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS CanvasRenderingContext2D interface: operation arcTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS CanvasRenderingContext2D interface: operation rect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS CanvasRenderingContext2D interface: operation arc(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,boolean) 
-PASS CanvasRenderingContext2D interface: operation ellipse(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,boolean) 
+PASS CanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS CanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) 
+PASS CanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) 
 PASS CanvasRenderingContext2D must be primary interface of document.createElement("canvas").getContext("2d") 
 PASS Stringification of document.createElement("canvas").getContext("2d") 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "canvas" with the proper type (0) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "save" with the proper type (1) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "restore" with the proper type (2) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scale" with the proper type (3) 
-PASS CanvasRenderingContext2D interface: calling scale(unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rotate" with the proper type (4) 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "canvas" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "save()" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "restore()" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scale(unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling scale(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rotate(unrestricted double)" with the proper type 
 PASS CanvasRenderingContext2D interface: calling rotate(unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "translate" with the proper type (5) 
-PASS CanvasRenderingContext2D interface: calling translate(unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "transform" with the proper type (6) 
-PASS CanvasRenderingContext2D interface: calling transform(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-FAIL CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getTransform" with the proper type (7) assert_inherits: property "getTransform" not found in prototype chain
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform" with the proper type (8) 
-PASS CanvasRenderingContext2D interface: calling setTransform(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform" with the proper type (9) 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "translate(unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling translate(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+FAIL CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getTransform()" with the proper type assert_inherits: property "getTransform" not found in prototype chain
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(DOMMatrixInit)" with the proper type 
 PASS CanvasRenderingContext2D interface: calling setTransform(DOMMatrixInit) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetTransform" with the proper type (10) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalAlpha" with the proper type (11) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalCompositeOperation" with the proper type (12) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingEnabled" with the proper type (13) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingQuality" with the proper type (14) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeStyle" with the proper type (15) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillStyle" with the proper type (16) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createLinearGradient" with the proper type (17) 
-PASS CanvasRenderingContext2D interface: calling createLinearGradient(double,double,double,double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createRadialGradient" with the proper type (18) 
-PASS CanvasRenderingContext2D interface: calling createRadialGradient(double,double,double,double,double,double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createPattern" with the proper type (19) 
-PASS CanvasRenderingContext2D interface: calling createPattern(CanvasImageSource,DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetX" with the proper type (20) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetY" with the proper type (21) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowBlur" with the proper type (22) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowColor" with the proper type (23) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "filter" with the proper type (24) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clearRect" with the proper type (25) 
-PASS CanvasRenderingContext2D interface: calling clearRect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillRect" with the proper type (26) 
-PASS CanvasRenderingContext2D interface: calling fillRect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeRect" with the proper type (27) 
-PASS CanvasRenderingContext2D interface: calling strokeRect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "beginPath" with the proper type (28) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill" with the proper type (29) 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetTransform()" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalAlpha" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalCompositeOperation" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingEnabled" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingQuality" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeStyle" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillStyle" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createLinearGradient(double, double, double, double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling createLinearGradient(double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createRadialGradient(double, double, double, double, double, double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling createRadialGradient(double, double, double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createPattern(CanvasImageSource, DOMString)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling createPattern(CanvasImageSource, DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetX" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetY" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowBlur" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowColor" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "filter" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "beginPath()" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(CanvasFillRule)" with the proper type 
 PASS CanvasRenderingContext2D interface: calling fill(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill" with the proper type (30) 
-PASS CanvasRenderingContext2D interface: calling fill(Path2D,CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke" with the proper type (31) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke" with the proper type (32) 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(Path2D, CanvasFillRule)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling fill(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke()" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke(Path2D)" with the proper type 
 PASS CanvasRenderingContext2D interface: calling stroke(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip" with the proper type (33) 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(CanvasFillRule)" with the proper type 
 PASS CanvasRenderingContext2D interface: calling clip(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip" with the proper type (34) 
-PASS CanvasRenderingContext2D interface: calling clip(Path2D,CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-FAIL CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetClip" with the proper type (35) assert_inherits: property "resetClip" not found in prototype chain
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath" with the proper type (36) 
-PASS CanvasRenderingContext2D interface: calling isPointInPath(unrestricted double,unrestricted double,CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath" with the proper type (37) 
-PASS CanvasRenderingContext2D interface: calling isPointInPath(Path2D,unrestricted double,unrestricted double,CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke" with the proper type (38) 
-PASS CanvasRenderingContext2D interface: calling isPointInStroke(unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke" with the proper type (39) 
-PASS CanvasRenderingContext2D interface: calling isPointInStroke(Path2D,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded" with the proper type (40) 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(Path2D, CanvasFillRule)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling clip(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+FAIL CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetClip()" with the proper type assert_inherits: property "resetClip" not found in prototype chain
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling isPointInPath(unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling isPointInStroke(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(Path2D, unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling isPointInStroke(Path2D, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Element)" with the proper type 
 PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded" with the proper type (41) 
-PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Path2D,Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView" with the proper type (42) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView" with the proper type (43) 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Path2D, Element)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Path2D, Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView()" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView(Path2D)" with the proper type 
 PASS CanvasRenderingContext2D interface: calling scrollPathIntoView(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillText" with the proper type (44) 
-PASS CanvasRenderingContext2D interface: calling fillText(DOMString,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeText" with the proper type (45) 
-PASS CanvasRenderingContext2D interface: calling strokeText(DOMString,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "measureText" with the proper type (46) 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling fillText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "measureText(DOMString)" with the proper type 
 PASS CanvasRenderingContext2D interface: calling measureText(DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage" with the proper type (47) 
-PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage" with the proper type (48) 
-PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage" with the proper type (49) 
-PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "addHitRegion" with the proper type (50) 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "addHitRegion(HitRegionOptions)" with the proper type 
 PASS CanvasRenderingContext2D interface: calling addHitRegion(HitRegionOptions) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "removeHitRegion" with the proper type (51) 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "removeHitRegion(DOMString)" with the proper type 
 PASS CanvasRenderingContext2D interface: calling removeHitRegion(DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clearHitRegions" with the proper type (52) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData" with the proper type (53) 
-PASS CanvasRenderingContext2D interface: calling createImageData(double,double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData" with the proper type (54) 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clearHitRegions()" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(double, double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling createImageData(double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(ImageData)" with the proper type 
 PASS CanvasRenderingContext2D interface: calling createImageData(ImageData) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getImageData" with the proper type (55) 
-PASS CanvasRenderingContext2D interface: calling getImageData(double,double,double,double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData" with the proper type (56) 
-PASS CanvasRenderingContext2D interface: calling putImageData(ImageData,double,double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData" with the proper type (57) 
-PASS CanvasRenderingContext2D interface: calling putImageData(ImageData,double,double,double,double,double,double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineWidth" with the proper type (58) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineCap" with the proper type (59) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineJoin" with the proper type (60) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "miterLimit" with the proper type (61) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setLineDash" with the proper type (62) 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getImageData(double, double, double, double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling getImageData(double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, double, double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, double, double, double, double, double, double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, double, double, double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineWidth" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineCap" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineJoin" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "miterLimit" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setLineDash([object Object])" with the proper type 
 PASS CanvasRenderingContext2D interface: calling setLineDash([object Object]) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getLineDash" with the proper type (63) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineDashOffset" with the proper type (64) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "font" with the proper type (65) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textAlign" with the proper type (66) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textBaseline" with the proper type (67) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "direction" with the proper type (68) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "closePath" with the proper type (69) 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "moveTo" with the proper type (70) 
-PASS CanvasRenderingContext2D interface: calling moveTo(unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineTo" with the proper type (71) 
-PASS CanvasRenderingContext2D interface: calling lineTo(unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "quadraticCurveTo" with the proper type (72) 
-PASS CanvasRenderingContext2D interface: calling quadraticCurveTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "bezierCurveTo" with the proper type (73) 
-PASS CanvasRenderingContext2D interface: calling bezierCurveTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arcTo" with the proper type (74) 
-PASS CanvasRenderingContext2D interface: calling arcTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arcTo" with the proper type (75) 
-PASS CanvasRenderingContext2D interface: calling arcTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rect" with the proper type (76) 
-PASS CanvasRenderingContext2D interface: calling rect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arc" with the proper type (77) 
-PASS CanvasRenderingContext2D interface: calling arc(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "ellipse" with the proper type (78) 
-PASS CanvasRenderingContext2D interface: calling ellipse(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getLineDash()" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineDashOffset" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "font" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textAlign" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textBaseline" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "direction" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "closePath()" with the proper type 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "moveTo(unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling moveTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineTo(unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling lineTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type 
+PASS CanvasRenderingContext2D interface: calling ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError 
 PASS CanvasGradient interface: existence and properties of interface object 
 PASS CanvasGradient interface object length 
 PASS CanvasGradient interface object name 
 PASS CanvasGradient interface: existence and properties of interface prototype object 
 PASS CanvasGradient interface: existence and properties of interface prototype object's "constructor" property 
-PASS CanvasGradient interface: operation addColorStop(double,DOMString) 
+PASS CanvasGradient interface: operation addColorStop(double, DOMString) 
 PASS CanvasPattern interface: existence and properties of interface object 
 PASS CanvasPattern interface object length 
 PASS CanvasPattern interface object name 
@@ -4278,17 +4278,17 @@
 PASS Path2D interface object name 
 PASS Path2D interface: existence and properties of interface prototype object 
 PASS Path2D interface: existence and properties of interface prototype object's "constructor" property 
-PASS Path2D interface: operation addPath(Path2D,DOMMatrixInit) 
+PASS Path2D interface: operation addPath(Path2D, DOMMatrixInit) 
 PASS Path2D interface: operation closePath() 
-PASS Path2D interface: operation moveTo(unrestricted double,unrestricted double) 
-PASS Path2D interface: operation lineTo(unrestricted double,unrestricted double) 
-PASS Path2D interface: operation quadraticCurveTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS Path2D interface: operation bezierCurveTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS Path2D interface: operation arcTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS Path2D interface: operation arcTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS Path2D interface: operation rect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS Path2D interface: operation arc(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,boolean) 
-PASS Path2D interface: operation ellipse(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,boolean) 
+PASS Path2D interface: operation moveTo(unrestricted double, unrestricted double) 
+PASS Path2D interface: operation lineTo(unrestricted double, unrestricted double) 
+PASS Path2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS Path2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS Path2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS Path2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) 
+PASS Path2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) 
 FAIL DataTransfer interface: existence and properties of interface object assert_throws: interface object didn't throw TypeError when called as a constructor function "function () { [native code] }" did not throw
 PASS DataTransfer interface object length 
 PASS DataTransfer interface object name 
@@ -4297,10 +4297,10 @@
 PASS DataTransfer interface: attribute dropEffect 
 PASS DataTransfer interface: attribute effectAllowed 
 PASS DataTransfer interface: attribute items 
-PASS DataTransfer interface: operation setDragImage(Element,long,long) 
+PASS DataTransfer interface: operation setDragImage(Element, long, long) 
 PASS DataTransfer interface: attribute types 
 PASS DataTransfer interface: operation getData(DOMString) 
-PASS DataTransfer interface: operation setData(DOMString,DOMString) 
+PASS DataTransfer interface: operation setData(DOMString, DOMString) 
 PASS DataTransfer interface: operation clearData(DOMString) 
 PASS DataTransfer interface: attribute files 
 PASS DataTransferItemList interface: existence and properties of interface object 
@@ -4309,7 +4309,7 @@
 PASS DataTransferItemList interface: existence and properties of interface prototype object 
 PASS DataTransferItemList interface: existence and properties of interface prototype object's "constructor" property 
 PASS DataTransferItemList interface: attribute length 
-PASS DataTransferItemList interface: operation add(DOMString,DOMString) 
+PASS DataTransferItemList interface: operation add(DOMString, DOMString) 
 PASS DataTransferItemList interface: operation add(File) 
 PASS DataTransferItemList interface: operation remove(unsigned long) 
 PASS DataTransferItemList interface: operation clear() 
@@ -4359,15 +4359,15 @@
 FAIL Window interface: attribute opener assert_equals: "opener" must have a getter expected "function" but got "undefined"
 FAIL Window interface: attribute parent assert_equals: "parent" must have a getter expected "function" but got "undefined"
 PASS Window interface: attribute frameElement 
-FAIL Window interface: operation open(DOMString,DOMString,DOMString,boolean) assert_equals: property has wrong .length expected 0 but got 2
+FAIL Window interface: operation open(DOMString, DOMString, DOMString, boolean) assert_equals: property has wrong .length expected 0 but got 2
 PASS Window interface: attribute navigator 
 PASS Window interface: attribute external 
 PASS Window interface: attribute applicationCache 
 PASS Window interface: operation alert() 
 PASS Window interface: operation confirm(DOMString) 
-PASS Window interface: operation prompt(DOMString,DOMString) 
+PASS Window interface: operation prompt(DOMString, DOMString) 
 PASS Window interface: operation print() 
-PASS Window interface: operation postMessage(any,DOMString,[object Object]) 
+PASS Window interface: operation postMessage(any, DOMString, [object Object]) 
 PASS Window interface: operation captureEvents() 
 PASS Window interface: operation releaseEvents() 
 PASS Window interface: attribute onabort 
@@ -4450,12 +4450,12 @@
 PASS Window interface: attribute origin 
 PASS Window interface: operation btoa(DOMString) 
 PASS Window interface: operation atob(DOMString) 
-PASS Window interface: operation setTimeout(TimerHandler,long,any) 
+PASS Window interface: operation setTimeout(TimerHandler, long, any) 
 PASS Window interface: operation clearTimeout(long) 
-PASS Window interface: operation setInterval(TimerHandler,long,any) 
+PASS Window interface: operation setInterval(TimerHandler, long, any) 
 PASS Window interface: operation clearInterval(long) 
-PASS Window interface: operation createImageBitmap(ImageBitmapSource,ImageBitmapOptions) 
-PASS Window interface: operation createImageBitmap(ImageBitmapSource,long,long,long,long,ImageBitmapOptions) 
+PASS Window interface: operation createImageBitmap(ImageBitmapSource, ImageBitmapOptions) 
+PASS Window interface: operation createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) 
 PASS Window interface: attribute sessionStorage 
 PASS Window interface: attribute localStorage 
 PASS Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError 
@@ -4467,140 +4467,140 @@
 PASS Window must be primary interface of window 
 PASS Stringification of window 
 FAIL Window interface: window must have own property "window" assert_false: property descriptor should not have a "value" field expected false got true
-PASS Window interface: window must inherit property "self" with the proper type (1) 
+PASS Window interface: window must inherit property "self" with the proper type 
 PASS Window interface: window must have own property "document" 
-PASS Window interface: window must inherit property "name" with the proper type (3) 
+PASS Window interface: window must inherit property "name" with the proper type 
 FAIL Window interface: window must have own property "location" assert_false: property descriptor should not have a "value" field expected false got true
-PASS Window interface: window must inherit property "history" with the proper type (5) 
-PASS Window interface: window must inherit property "locationbar" with the proper type (6) 
-PASS Window interface: window must inherit property "menubar" with the proper type (7) 
-PASS Window interface: window must inherit property "personalbar" with the proper type (8) 
-PASS Window interface: window must inherit property "scrollbars" with the proper type (9) 
-PASS Window interface: window must inherit property "statusbar" with the proper type (10) 
-PASS Window interface: window must inherit property "toolbar" with the proper type (11) 
-PASS Window interface: window must inherit property "status" with the proper type (12) 
-PASS Window interface: window must inherit property "close" with the proper type (13) 
-PASS Window interface: window must inherit property "closed" with the proper type (14) 
-PASS Window interface: window must inherit property "stop" with the proper type (15) 
-PASS Window interface: window must inherit property "focus" with the proper type (16) 
-PASS Window interface: window must inherit property "blur" with the proper type (17) 
-PASS Window interface: window must inherit property "frames" with the proper type (18) 
-PASS Window interface: window must inherit property "length" with the proper type (19) 
+PASS Window interface: window must inherit property "history" with the proper type 
+PASS Window interface: window must inherit property "locationbar" with the proper type 
+PASS Window interface: window must inherit property "menubar" with the proper type 
+PASS Window interface: window must inherit property "personalbar" with the proper type 
+PASS Window interface: window must inherit property "scrollbars" with the proper type 
+PASS Window interface: window must inherit property "statusbar" with the proper type 
+PASS Window interface: window must inherit property "toolbar" with the proper type 
+PASS Window interface: window must inherit property "status" with the proper type 
+PASS Window interface: window must inherit property "close()" with the proper type 
+PASS Window interface: window must inherit property "closed" with the proper type 
+PASS Window interface: window must inherit property "stop()" with the proper type 
+PASS Window interface: window must inherit property "focus()" with the proper type 
+PASS Window interface: window must inherit property "blur()" with the proper type 
+PASS Window interface: window must inherit property "frames" with the proper type 
+PASS Window interface: window must inherit property "length" with the proper type 
 FAIL Window interface: window must have own property "top" assert_false: property descriptor should not have a "value" field expected false got true
-PASS Window interface: window must inherit property "opener" with the proper type (21) 
-PASS Window interface: window must inherit property "parent" with the proper type (22) 
-PASS Window interface: window must inherit property "frameElement" with the proper type (23) 
-PASS Window interface: window must inherit property "open" with the proper type (24) 
-PASS Window interface: calling open(DOMString,DOMString,DOMString,boolean) on window with too few arguments must throw TypeError 
-PASS Window interface: window must inherit property "navigator" with the proper type (27) 
-PASS Window interface: window must inherit property "external" with the proper type (28) 
-PASS Window interface: window must inherit property "applicationCache" with the proper type (29) 
-PASS Window interface: window must inherit property "alert" with the proper type (30) 
-PASS Window interface: window must inherit property "confirm" with the proper type (31) 
+PASS Window interface: window must inherit property "opener" with the proper type 
+PASS Window interface: window must inherit property "parent" with the proper type 
+PASS Window interface: window must inherit property "frameElement" with the proper type 
+PASS Window interface: window must inherit property "open(DOMString, DOMString, DOMString, boolean)" with the proper type 
+PASS Window interface: calling open(DOMString, DOMString, DOMString, boolean) on window with too few arguments must throw TypeError 
+PASS Window interface: window must inherit property "navigator" with the proper type 
+PASS Window interface: window must inherit property "external" with the proper type 
+PASS Window interface: window must inherit property "applicationCache" with the proper type 
+PASS Window interface: window must inherit property "alert()" with the proper type 
+PASS Window interface: window must inherit property "confirm(DOMString)" with the proper type 
 PASS Window interface: calling confirm(DOMString) on window with too few arguments must throw TypeError 
-PASS Window interface: window must inherit property "prompt" with the proper type (32) 
-PASS Window interface: calling prompt(DOMString,DOMString) on window with too few arguments must throw TypeError 
-PASS Window interface: window must inherit property "print" with the proper type (33) 
-PASS Window interface: window must inherit property "postMessage" with the proper type (34) 
-PASS Window interface: calling postMessage(any,DOMString,[object Object]) on window with too few arguments must throw TypeError 
-PASS Window interface: window must inherit property "captureEvents" with the proper type (35) 
-PASS Window interface: window must inherit property "releaseEvents" with the proper type (36) 
-PASS Window interface: window must inherit property "onabort" with the proper type (37) 
-PASS Window interface: window must inherit property "onauxclick" with the proper type (38) 
-PASS Window interface: window must inherit property "onblur" with the proper type (39) 
-PASS Window interface: window must inherit property "oncancel" with the proper type (40) 
-PASS Window interface: window must inherit property "oncanplay" with the proper type (41) 
-PASS Window interface: window must inherit property "oncanplaythrough" with the proper type (42) 
-PASS Window interface: window must inherit property "onchange" with the proper type (43) 
-PASS Window interface: window must inherit property "onclick" with the proper type (44) 
-PASS Window interface: window must inherit property "onclose" with the proper type (45) 
-PASS Window interface: window must inherit property "oncontextmenu" with the proper type (46) 
-PASS Window interface: window must inherit property "oncuechange" with the proper type (47) 
-PASS Window interface: window must inherit property "ondblclick" with the proper type (48) 
-PASS Window interface: window must inherit property "ondrag" with the proper type (49) 
-PASS Window interface: window must inherit property "ondragend" with the proper type (50) 
-PASS Window interface: window must inherit property "ondragenter" with the proper type (51) 
-FAIL Window interface: window must inherit property "ondragexit" with the proper type (52) assert_own_property: expected property "ondragexit" missing
-PASS Window interface: window must inherit property "ondragleave" with the proper type (53) 
-PASS Window interface: window must inherit property "ondragover" with the proper type (54) 
-PASS Window interface: window must inherit property "ondragstart" with the proper type (55) 
-PASS Window interface: window must inherit property "ondrop" with the proper type (56) 
-PASS Window interface: window must inherit property "ondurationchange" with the proper type (57) 
-PASS Window interface: window must inherit property "onemptied" with the proper type (58) 
-PASS Window interface: window must inherit property "onended" with the proper type (59) 
-PASS Window interface: window must inherit property "onerror" with the proper type (60) 
-PASS Window interface: window must inherit property "onfocus" with the proper type (61) 
-PASS Window interface: window must inherit property "oninput" with the proper type (62) 
-PASS Window interface: window must inherit property "oninvalid" with the proper type (63) 
-PASS Window interface: window must inherit property "onkeydown" with the proper type (64) 
-PASS Window interface: window must inherit property "onkeypress" with the proper type (65) 
-PASS Window interface: window must inherit property "onkeyup" with the proper type (66) 
-PASS Window interface: window must inherit property "onload" with the proper type (67) 
-PASS Window interface: window must inherit property "onloadeddata" with the proper type (68) 
-PASS Window interface: window must inherit property "onloadedmetadata" with the proper type (69) 
-FAIL Window interface: window must inherit property "onloadend" with the proper type (70) assert_own_property: expected property "onloadend" missing
-PASS Window interface: window must inherit property "onloadstart" with the proper type (71) 
-PASS Window interface: window must inherit property "onmousedown" with the proper type (72) 
-PASS Window interface: window must inherit property "onmouseenter" with the proper type (73) 
-PASS Window interface: window must inherit property "onmouseleave" with the proper type (74) 
-PASS Window interface: window must inherit property "onmousemove" with the proper type (75) 
-PASS Window interface: window must inherit property "onmouseout" with the proper type (76) 
-PASS Window interface: window must inherit property "onmouseover" with the proper type (77) 
-PASS Window interface: window must inherit property "onmouseup" with the proper type (78) 
-PASS Window interface: window must inherit property "onwheel" with the proper type (79) 
-PASS Window interface: window must inherit property "onpause" with the proper type (80) 
-PASS Window interface: window must inherit property "onplay" with the proper type (81) 
-PASS Window interface: window must inherit property "onplaying" with the proper type (82) 
-PASS Window interface: window must inherit property "onprogress" with the proper type (83) 
-PASS Window interface: window must inherit property "onratechange" with the proper type (84) 
-PASS Window interface: window must inherit property "onreset" with the proper type (85) 
-PASS Window interface: window must inherit property "onresize" with the proper type (86) 
-PASS Window interface: window must inherit property "onscroll" with the proper type (87) 
-PASS Window interface: window must inherit property "onseeked" with the proper type (88) 
-PASS Window interface: window must inherit property "onseeking" with the proper type (89) 
-PASS Window interface: window must inherit property "onselect" with the proper type (90) 
-PASS Window interface: window must inherit property "onstalled" with the proper type (91) 
-PASS Window interface: window must inherit property "onsubmit" with the proper type (92) 
-PASS Window interface: window must inherit property "onsuspend" with the proper type (93) 
-PASS Window interface: window must inherit property "ontimeupdate" with the proper type (94) 
-PASS Window interface: window must inherit property "ontoggle" with the proper type (95) 
-PASS Window interface: window must inherit property "onvolumechange" with the proper type (96) 
-PASS Window interface: window must inherit property "onwaiting" with the proper type (97) 
-FAIL Window interface: window must inherit property "onafterprint" with the proper type (98) assert_own_property: expected property "onafterprint" missing
-FAIL Window interface: window must inherit property "onbeforeprint" with the proper type (99) assert_own_property: expected property "onbeforeprint" missing
-PASS Window interface: window must inherit property "onbeforeunload" with the proper type (100) 
-PASS Window interface: window must inherit property "onhashchange" with the proper type (101) 
-PASS Window interface: window must inherit property "onlanguagechange" with the proper type (102) 
-PASS Window interface: window must inherit property "onmessage" with the proper type (103) 
-PASS Window interface: window must inherit property "onmessageerror" with the proper type (104) 
-PASS Window interface: window must inherit property "onoffline" with the proper type (105) 
-PASS Window interface: window must inherit property "ononline" with the proper type (106) 
-PASS Window interface: window must inherit property "onpagehide" with the proper type (107) 
-PASS Window interface: window must inherit property "onpageshow" with the proper type (108) 
-PASS Window interface: window must inherit property "onpopstate" with the proper type (109) 
-PASS Window interface: window must inherit property "onrejectionhandled" with the proper type (110) 
-PASS Window interface: window must inherit property "onstorage" with the proper type (111) 
-PASS Window interface: window must inherit property "onunhandledrejection" with the proper type (112) 
-PASS Window interface: window must inherit property "onunload" with the proper type (113) 
-PASS Window interface: window must inherit property "origin" with the proper type (114) 
-PASS Window interface: window must inherit property "btoa" with the proper type (115) 
+PASS Window interface: window must inherit property "prompt(DOMString, DOMString)" with the proper type 
+PASS Window interface: calling prompt(DOMString, DOMString) on window with too few arguments must throw TypeError 
+PASS Window interface: window must inherit property "print()" with the proper type 
+PASS Window interface: window must inherit property "postMessage(any, DOMString, [object Object])" with the proper type 
+PASS Window interface: calling postMessage(any, DOMString, [object Object]) on window with too few arguments must throw TypeError 
+PASS Window interface: window must inherit property "captureEvents()" with the proper type 
+PASS Window interface: window must inherit property "releaseEvents()" with the proper type 
+PASS Window interface: window must inherit property "onabort" with the proper type 
+PASS Window interface: window must inherit property "onauxclick" with the proper type 
+PASS Window interface: window must inherit property "onblur" with the proper type 
+PASS Window interface: window must inherit property "oncancel" with the proper type 
+PASS Window interface: window must inherit property "oncanplay" with the proper type 
+PASS Window interface: window must inherit property "oncanplaythrough" with the proper type 
+PASS Window interface: window must inherit property "onchange" with the proper type 
+PASS Window interface: window must inherit property "onclick" with the proper type 
+PASS Window interface: window must inherit property "onclose" with the proper type 
+PASS Window interface: window must inherit property "oncontextmenu" with the proper type 
+PASS Window interface: window must inherit property "oncuechange" with the proper type 
+PASS Window interface: window must inherit property "ondblclick" with the proper type 
+PASS Window interface: window must inherit property "ondrag" with the proper type 
+PASS Window interface: window must inherit property "ondragend" with the proper type 
+PASS Window interface: window must inherit property "ondragenter" with the proper type 
+FAIL Window interface: window must inherit property "ondragexit" with the proper type assert_own_property: expected property "ondragexit" missing
+PASS Window interface: window must inherit property "ondragleave" with the proper type 
+PASS Window interface: window must inherit property "ondragover" with the proper type 
+PASS Window interface: window must inherit property "ondragstart" with the proper type 
+PASS Window interface: window must inherit property "ondrop" with the proper type 
+PASS Window interface: window must inherit property "ondurationchange" with the proper type 
+PASS Window interface: window must inherit property "onemptied" with the proper type 
+PASS Window interface: window must inherit property "onended" with the proper type 
+PASS Window interface: window must inherit property "onerror" with the proper type 
+PASS Window interface: window must inherit property "onfocus" with the proper type 
+PASS Window interface: window must inherit property "oninput" with the proper type 
+PASS Window interface: window must inherit property "oninvalid" with the proper type 
+PASS Window interface: window must inherit property "onkeydown" with the proper type 
+PASS Window interface: window must inherit property "onkeypress" with the proper type 
+PASS Window interface: window must inherit property "onkeyup" with the proper type 
+PASS Window interface: window must inherit property "onload" with the proper type 
+PASS Window interface: window must inherit property "onloadeddata" with the proper type 
+PASS Window interface: window must inherit property "onloadedmetadata" with the proper type 
+FAIL Window interface: window must inherit property "onloadend" with the proper type assert_own_property: expected property "onloadend" missing
+PASS Window interface: window must inherit property "onloadstart" with the proper type 
+PASS Window interface: window must inherit property "onmousedown" with the proper type 
+PASS Window interface: window must inherit property "onmouseenter" with the proper type 
+PASS Window interface: window must inherit property "onmouseleave" with the proper type 
+PASS Window interface: window must inherit property "onmousemove" with the proper type 
+PASS Window interface: window must inherit property "onmouseout" with the proper type 
+PASS Window interface: window must inherit property "onmouseover" with the proper type 
+PASS Window interface: window must inherit property "onmouseup" with the proper type 
+PASS Window interface: window must inherit property "onwheel" with the proper type 
+PASS Window interface: window must inherit property "onpause" with the proper type 
+PASS Window interface: window must inherit property "onplay" with the proper type 
+PASS Window interface: window must inherit property "onplaying" with the proper type 
+PASS Window interface: window must inherit property "onprogress" with the proper type 
+PASS Window interface: window must inherit property "onratechange" with the proper type 
+PASS Window interface: window must inherit property "onreset" with the proper type 
+PASS Window interface: window must inherit property "onresize" with the proper type 
+PASS Window interface: window must inherit property "onscroll" with the proper type 
+PASS Window interface: window must inherit property "onseeked" with the proper type 
+PASS Window interface: window must inherit property "onseeking" with the proper type 
+PASS Window interface: window must inherit property "onselect" with the proper type 
+PASS Window interface: window must inherit property "onstalled" with the proper type 
+PASS Window interface: window must inherit property "onsubmit" with the proper type 
+PASS Window interface: window must inherit property "onsuspend" with the proper type 
+PASS Window interface: window must inherit property "ontimeupdate" with the proper type 
+PASS Window interface: window must inherit property "ontoggle" with the proper type 
+PASS Window interface: window must inherit property "onvolumechange" with the proper type 
+PASS Window interface: window must inherit property "onwaiting" with the proper type 
+FAIL Window interface: window must inherit property "onafterprint" with the proper type assert_own_property: expected property "onafterprint" missing
+FAIL Window interface: window must inherit property "onbeforeprint" with the proper type assert_own_property: expected property "onbeforeprint" missing
+PASS Window interface: window must inherit property "onbeforeunload" with the proper type 
+PASS Window interface: window must inherit property "onhashchange" with the proper type 
+PASS Window interface: window must inherit property "onlanguagechange" with the proper type 
+PASS Window interface: window must inherit property "onmessage" with the proper type 
+PASS Window interface: window must inherit property "onmessageerror" with the proper type 
+PASS Window interface: window must inherit property "onoffline" with the proper type 
+PASS Window interface: window must inherit property "ononline" with the proper type 
+PASS Window interface: window must inherit property "onpagehide" with the proper type 
+PASS Window interface: window must inherit property "onpageshow" with the proper type 
+PASS Window interface: window must inherit property "onpopstate" with the proper type 
+PASS Window interface: window must inherit property "onrejectionhandled" with the proper type 
+PASS Window interface: window must inherit property "onstorage" with the proper type 
+PASS Window interface: window must inherit property "onunhandledrejection" with the proper type 
+PASS Window interface: window must inherit property "onunload" with the proper type 
+PASS Window interface: window must inherit property "origin" with the proper type 
+PASS Window interface: window must inherit property "btoa(DOMString)" with the proper type 
 PASS Window interface: calling btoa(DOMString) on window with too few arguments must throw TypeError 
-PASS Window interface: window must inherit property "atob" with the proper type (116) 
+PASS Window interface: window must inherit property "atob(DOMString)" with the proper type 
 PASS Window interface: calling atob(DOMString) on window with too few arguments must throw TypeError 
-PASS Window interface: window must inherit property "setTimeout" with the proper type (117) 
-PASS Window interface: calling setTimeout(TimerHandler,long,any) on window with too few arguments must throw TypeError 
-PASS Window interface: window must inherit property "clearTimeout" with the proper type (118) 
+PASS Window interface: window must inherit property "setTimeout(TimerHandler, long, any)" with the proper type 
+PASS Window interface: calling setTimeout(TimerHandler, long, any) on window with too few arguments must throw TypeError 
+PASS Window interface: window must inherit property "clearTimeout(long)" with the proper type 
 PASS Window interface: calling clearTimeout(long) on window with too few arguments must throw TypeError 
-PASS Window interface: window must inherit property "setInterval" with the proper type (119) 
-PASS Window interface: calling setInterval(TimerHandler,long,any) on window with too few arguments must throw TypeError 
-PASS Window interface: window must inherit property "clearInterval" with the proper type (120) 
+PASS Window interface: window must inherit property "setInterval(TimerHandler, long, any)" with the proper type 
+PASS Window interface: calling setInterval(TimerHandler, long, any) on window with too few arguments must throw TypeError 
+PASS Window interface: window must inherit property "clearInterval(long)" with the proper type 
 PASS Window interface: calling clearInterval(long) on window with too few arguments must throw TypeError 
-PASS Window interface: window must inherit property "createImageBitmap" with the proper type (121) 
-PASS Window interface: calling createImageBitmap(ImageBitmapSource,ImageBitmapOptions) on window with too few arguments must throw TypeError 
-PASS Window interface: window must inherit property "createImageBitmap" with the proper type (122) 
-PASS Window interface: calling createImageBitmap(ImageBitmapSource,long,long,long,long,ImageBitmapOptions) on window with too few arguments must throw TypeError 
-PASS Window interface: window must inherit property "sessionStorage" with the proper type (123) 
-PASS Window interface: window must inherit property "localStorage" with the proper type (124) 
+PASS Window interface: window must inherit property "createImageBitmap(ImageBitmapSource, ImageBitmapOptions)" with the proper type 
+PASS Window interface: calling createImageBitmap(ImageBitmapSource, ImageBitmapOptions) on window with too few arguments must throw TypeError 
+PASS Window interface: window must inherit property "createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions)" with the proper type 
+PASS Window interface: calling createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) on window with too few arguments must throw TypeError 
+PASS Window interface: window must inherit property "sessionStorage" with the proper type 
+PASS Window interface: window must inherit property "localStorage" with the proper type 
 PASS BarProp interface: existence and properties of interface object 
 PASS BarProp interface object length 
 PASS BarProp interface object name 
@@ -4618,21 +4618,21 @@
 PASS History interface: operation go(long) 
 PASS History interface: operation back() 
 PASS History interface: operation forward() 
-PASS History interface: operation pushState(any,DOMString,DOMString) 
-PASS History interface: operation replaceState(any,DOMString,DOMString) 
+PASS History interface: operation pushState(any, DOMString, DOMString) 
+PASS History interface: operation replaceState(any, DOMString, DOMString) 
 PASS History must be primary interface of window.history 
 PASS Stringification of window.history 
-PASS History interface: window.history must inherit property "length" with the proper type (0) 
-PASS History interface: window.history must inherit property "scrollRestoration" with the proper type (1) 
-PASS History interface: window.history must inherit property "state" with the proper type (2) 
-PASS History interface: window.history must inherit property "go" with the proper type (3) 
+PASS History interface: window.history must inherit property "length" with the proper type 
+PASS History interface: window.history must inherit property "scrollRestoration" with the proper type 
+PASS History interface: window.history must inherit property "state" with the proper type 
+PASS History interface: window.history must inherit property "go(long)" with the proper type 
 PASS History interface: calling go(long) on window.history with too few arguments must throw TypeError 
-PASS History interface: window.history must inherit property "back" with the proper type (4) 
-PASS History interface: window.history must inherit property "forward" with the proper type (5) 
-PASS History interface: window.history must inherit property "pushState" with the proper type (6) 
-PASS History interface: calling pushState(any,DOMString,DOMString) on window.history with too few arguments must throw TypeError 
-PASS History interface: window.history must inherit property "replaceState" with the proper type (7) 
-PASS History interface: calling replaceState(any,DOMString,DOMString) on window.history with too few arguments must throw TypeError 
+PASS History interface: window.history must inherit property "back()" with the proper type 
+PASS History interface: window.history must inherit property "forward()" with the proper type 
+PASS History interface: window.history must inherit property "pushState(any, DOMString, DOMString)" with the proper type 
+PASS History interface: calling pushState(any, DOMString, DOMString) on window.history with too few arguments must throw TypeError 
+PASS History interface: window.history must inherit property "replaceState(any, DOMString, DOMString)" with the proper type 
+PASS History interface: calling replaceState(any, DOMString, DOMString) on window.history with too few arguments must throw TypeError 
 PASS Location interface: existence and properties of interface object 
 PASS Location interface object length 
 PASS Location interface object name 
@@ -4664,7 +4664,7 @@
 PASS PopStateEvent interface: attribute state 
 PASS PopStateEvent must be primary interface of new PopStateEvent("popstate", { data: {} }) 
 PASS Stringification of new PopStateEvent("popstate", { data: {} }) 
-PASS PopStateEvent interface: new PopStateEvent("popstate", { data: {} }) must inherit property "state" with the proper type (0) 
+PASS PopStateEvent interface: new PopStateEvent("popstate", { data: {} }) must inherit property "state" with the proper type 
 PASS HashChangeEvent interface: existence and properties of interface object 
 PASS HashChangeEvent interface object length 
 PASS HashChangeEvent interface object name 
@@ -4715,24 +4715,24 @@
 PASS ApplicationCache interface: attribute onobsolete 
 PASS ApplicationCache must be primary interface of window.applicationCache 
 PASS Stringification of window.applicationCache 
-PASS ApplicationCache interface: window.applicationCache must inherit property "UNCACHED" with the proper type (0) 
-PASS ApplicationCache interface: window.applicationCache must inherit property "IDLE" with the proper type (1) 
-PASS ApplicationCache interface: window.applicationCache must inherit property "CHECKING" with the proper type (2) 
-PASS ApplicationCache interface: window.applicationCache must inherit property "DOWNLOADING" with the proper type (3) 
-PASS ApplicationCache interface: window.applicationCache must inherit property "UPDATEREADY" with the proper type (4) 
-PASS ApplicationCache interface: window.applicationCache must inherit property "OBSOLETE" with the proper type (5) 
-PASS ApplicationCache interface: window.applicationCache must inherit property "status" with the proper type (6) 
-PASS ApplicationCache interface: window.applicationCache must inherit property "update" with the proper type (7) 
-PASS ApplicationCache interface: window.applicationCache must inherit property "abort" with the proper type (8) 
-PASS ApplicationCache interface: window.applicationCache must inherit property "swapCache" with the proper type (9) 
-PASS ApplicationCache interface: window.applicationCache must inherit property "onchecking" with the proper type (10) 
-PASS ApplicationCache interface: window.applicationCache must inherit property "onerror" with the proper type (11) 
-PASS ApplicationCache interface: window.applicationCache must inherit property "onnoupdate" with the proper type (12) 
-PASS ApplicationCache interface: window.applicationCache must inherit property "ondownloading" with the proper type (13) 
-PASS ApplicationCache interface: window.applicationCache must inherit property "onprogress" with the proper type (14) 
-PASS ApplicationCache interface: window.applicationCache must inherit property "onupdateready" with the proper type (15) 
-PASS ApplicationCache interface: window.applicationCache must inherit property "oncached" with the proper type (16) 
-PASS ApplicationCache interface: window.applicationCache must inherit property "onobsolete" with the proper type (17) 
+PASS ApplicationCache interface: window.applicationCache must inherit property "UNCACHED" with the proper type 
+PASS ApplicationCache interface: window.applicationCache must inherit property "IDLE" with the proper type 
+PASS ApplicationCache interface: window.applicationCache must inherit property "CHECKING" with the proper type 
+PASS ApplicationCache interface: window.applicationCache must inherit property "DOWNLOADING" with the proper type 
+PASS ApplicationCache interface: window.applicationCache must inherit property "UPDATEREADY" with the proper type 
+PASS ApplicationCache interface: window.applicationCache must inherit property "OBSOLETE" with the proper type 
+PASS ApplicationCache interface: window.applicationCache must inherit property "status" with the proper type 
+PASS ApplicationCache interface: window.applicationCache must inherit property "update()" with the proper type 
+PASS ApplicationCache interface: window.applicationCache must inherit property "abort()" with the proper type 
+PASS ApplicationCache interface: window.applicationCache must inherit property "swapCache()" with the proper type 
+PASS ApplicationCache interface: window.applicationCache must inherit property "onchecking" with the proper type 
+PASS ApplicationCache interface: window.applicationCache must inherit property "onerror" with the proper type 
+PASS ApplicationCache interface: window.applicationCache must inherit property "onnoupdate" with the proper type 
+PASS ApplicationCache interface: window.applicationCache must inherit property "ondownloading" with the proper type 
+PASS ApplicationCache interface: window.applicationCache must inherit property "onprogress" with the proper type 
+PASS ApplicationCache interface: window.applicationCache must inherit property "onupdateready" with the proper type 
+PASS ApplicationCache interface: window.applicationCache must inherit property "oncached" with the proper type 
+PASS ApplicationCache interface: window.applicationCache must inherit property "onobsolete" with the proper type 
 PASS ErrorEvent interface: existence and properties of interface object 
 PASS ErrorEvent interface object length 
 PASS ErrorEvent interface object name 
@@ -4760,12 +4760,12 @@
 PASS Navigator interface: attribute language 
 PASS Navigator interface: attribute languages 
 PASS Navigator interface: attribute onLine 
-PASS Navigator interface: operation registerProtocolHandler(DOMString,USVString,DOMString) 
-FAIL Navigator interface: operation registerContentHandler(DOMString,USVString,DOMString) assert_own_property: interface prototype object missing non-static operation expected property "registerContentHandler" missing
-PASS Navigator interface: operation isProtocolHandlerRegistered(DOMString,USVString) 
-FAIL Navigator interface: operation isContentHandlerRegistered(DOMString,USVString) assert_own_property: interface prototype object missing non-static operation expected property "isContentHandlerRegistered" missing
-PASS Navigator interface: operation unregisterProtocolHandler(DOMString,USVString) 
-FAIL Navigator interface: operation unregisterContentHandler(DOMString,USVString) assert_own_property: interface prototype object missing non-static operation expected property "unregisterContentHandler" missing
+PASS Navigator interface: operation registerProtocolHandler(DOMString, USVString, DOMString) 
+FAIL Navigator interface: operation registerContentHandler(DOMString, USVString, DOMString) assert_own_property: interface prototype object missing non-static operation expected property "registerContentHandler" missing
+PASS Navigator interface: operation isProtocolHandlerRegistered(DOMString, USVString) 
+FAIL Navigator interface: operation isContentHandlerRegistered(DOMString, USVString) assert_own_property: interface prototype object missing non-static operation expected property "isContentHandlerRegistered" missing
+PASS Navigator interface: operation unregisterProtocolHandler(DOMString, USVString) 
+FAIL Navigator interface: operation unregisterContentHandler(DOMString, USVString) assert_own_property: interface prototype object missing non-static operation expected property "unregisterContentHandler" missing
 PASS Navigator interface: attribute cookieEnabled 
 PASS Navigator interface: attribute plugins 
 PASS Navigator interface: attribute mimeTypes 
@@ -4773,35 +4773,35 @@
 PASS Navigator interface: attribute hardwareConcurrency 
 PASS Navigator must be primary interface of window.navigator 
 PASS Stringification of window.navigator 
-PASS Navigator interface: window.navigator must inherit property "appCodeName" with the proper type (0) 
-PASS Navigator interface: window.navigator must inherit property "appName" with the proper type (1) 
-PASS Navigator interface: window.navigator must inherit property "appVersion" with the proper type (2) 
-PASS Navigator interface: window.navigator must inherit property "platform" with the proper type (3) 
-PASS Navigator interface: window.navigator must inherit property "product" with the proper type (4) 
-PASS Navigator interface: window.navigator must inherit property "productSub" with the proper type (5) 
-PASS Navigator interface: window.navigator must inherit property "userAgent" with the proper type (6) 
-PASS Navigator interface: window.navigator must inherit property "vendor" with the proper type (7) 
-PASS Navigator interface: window.navigator must inherit property "vendorSub" with the proper type (8) 
-PASS Navigator interface: window.navigator must inherit property "language" with the proper type (9) 
-PASS Navigator interface: window.navigator must inherit property "languages" with the proper type (10) 
-PASS Navigator interface: window.navigator must inherit property "onLine" with the proper type (11) 
-PASS Navigator interface: window.navigator must inherit property "registerProtocolHandler" with the proper type (12) 
-PASS Navigator interface: calling registerProtocolHandler(DOMString,USVString,DOMString) on window.navigator with too few arguments must throw TypeError 
-FAIL Navigator interface: window.navigator must inherit property "registerContentHandler" with the proper type (13) assert_inherits: property "registerContentHandler" not found in prototype chain
-FAIL Navigator interface: calling registerContentHandler(DOMString,USVString,DOMString) on window.navigator with too few arguments must throw TypeError assert_inherits: property "registerContentHandler" not found in prototype chain
-PASS Navigator interface: window.navigator must inherit property "isProtocolHandlerRegistered" with the proper type (14) 
-PASS Navigator interface: calling isProtocolHandlerRegistered(DOMString,USVString) on window.navigator with too few arguments must throw TypeError 
-FAIL Navigator interface: window.navigator must inherit property "isContentHandlerRegistered" with the proper type (15) assert_inherits: property "isContentHandlerRegistered" not found in prototype chain
-FAIL Navigator interface: calling isContentHandlerRegistered(DOMString,USVString) on window.navigator with too few arguments must throw TypeError assert_inherits: property "isContentHandlerRegistered" not found in prototype chain
-PASS Navigator interface: window.navigator must inherit property "unregisterProtocolHandler" with the proper type (16) 
-PASS Navigator interface: calling unregisterProtocolHandler(DOMString,USVString) on window.navigator with too few arguments must throw TypeError 
-FAIL Navigator interface: window.navigator must inherit property "unregisterContentHandler" with the proper type (17) assert_inherits: property "unregisterContentHandler" not found in prototype chain
-FAIL Navigator interface: calling unregisterContentHandler(DOMString,USVString) on window.navigator with too few arguments must throw TypeError assert_inherits: property "unregisterContentHandler" not found in prototype chain
-PASS Navigator interface: window.navigator must inherit property "cookieEnabled" with the proper type (18) 
-PASS Navigator interface: window.navigator must inherit property "plugins" with the proper type (19) 
-PASS Navigator interface: window.navigator must inherit property "mimeTypes" with the proper type (20) 
-PASS Navigator interface: window.navigator must inherit property "javaEnabled" with the proper type (21) 
-PASS Navigator interface: window.navigator must inherit property "hardwareConcurrency" with the proper type (22) 
+PASS Navigator interface: window.navigator must inherit property "appCodeName" with the proper type 
+PASS Navigator interface: window.navigator must inherit property "appName" with the proper type 
+PASS Navigator interface: window.navigator must inherit property "appVersion" with the proper type 
+PASS Navigator interface: window.navigator must inherit property "platform" with the proper type 
+PASS Navigator interface: window.navigator must inherit property "product" with the proper type 
+PASS Navigator interface: window.navigator must inherit property "productSub" with the proper type 
+PASS Navigator interface: window.navigator must inherit property "userAgent" with the proper type 
+PASS Navigator interface: window.navigator must inherit property "vendor" with the proper type 
+PASS Navigator interface: window.navigator must inherit property "vendorSub" with the proper type 
+PASS Navigator interface: window.navigator must inherit property "language" with the proper type 
+PASS Navigator interface: window.navigator must inherit property "languages" with the proper type 
+PASS Navigator interface: window.navigator must inherit property "onLine" with the proper type 
+PASS Navigator interface: window.navigator must inherit property "registerProtocolHandler(DOMString, USVString, DOMString)" with the proper type 
+PASS Navigator interface: calling registerProtocolHandler(DOMString, USVString, DOMString) on window.navigator with too few arguments must throw TypeError 
+FAIL Navigator interface: window.navigator must inherit property "registerContentHandler(DOMString, USVString, DOMString)" with the proper type assert_inherits: property "registerContentHandler" not found in prototype chain
+FAIL Navigator interface: calling registerContentHandler(DOMString, USVString, DOMString) on window.navigator with too few arguments must throw TypeError assert_inherits: property "registerContentHandler" not found in prototype chain
+PASS Navigator interface: window.navigator must inherit property "isProtocolHandlerRegistered(DOMString, USVString)" with the proper type 
+PASS Navigator interface: calling isProtocolHandlerRegistered(DOMString, USVString) on window.navigator with too few arguments must throw TypeError 
+FAIL Navigator interface: window.navigator must inherit property "isContentHandlerRegistered(DOMString, USVString)" with the proper type assert_inherits: property "isContentHandlerRegistered" not found in prototype chain
+FAIL Navigator interface: calling isContentHandlerRegistered(DOMString, USVString) on window.navigator with too few arguments must throw TypeError assert_inherits: property "isContentHandlerRegistered" not found in prototype chain
+PASS Navigator interface: window.navigator must inherit property "unregisterProtocolHandler(DOMString, USVString)" with the proper type 
+PASS Navigator interface: calling unregisterProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError 
+FAIL Navigator interface: window.navigator must inherit property "unregisterContentHandler(DOMString, USVString)" with the proper type assert_inherits: property "unregisterContentHandler" not found in prototype chain
+FAIL Navigator interface: calling unregisterContentHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError assert_inherits: property "unregisterContentHandler" not found in prototype chain
+PASS Navigator interface: window.navigator must inherit property "cookieEnabled" with the proper type 
+PASS Navigator interface: window.navigator must inherit property "plugins" with the proper type 
+PASS Navigator interface: window.navigator must inherit property "mimeTypes" with the proper type 
+PASS Navigator interface: window.navigator must inherit property "javaEnabled()" with the proper type 
+PASS Navigator interface: window.navigator must inherit property "hardwareConcurrency" with the proper type 
 PASS PluginArray interface: existence and properties of interface object 
 PASS PluginArray interface object length 
 PASS PluginArray interface object name 
@@ -4848,11 +4848,11 @@
 FAIL External interface: operation IsSearchProviderInstalled(DOMString) assert_own_property: self does not have own property "External" expected property "External" missing
 FAIL External must be primary interface of window.external assert_own_property: self does not have own property "External" expected property "External" missing
 PASS Stringification of window.external 
-PASS External interface: window.external must inherit property "AddSearchProvider" with the proper type (0) 
+PASS External interface: window.external must inherit property "AddSearchProvider(DOMString)" with the proper type 
 FAIL External interface: calling AddSearchProvider(DOMString) on window.external with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () {
             fn.apply(obj, args);
         }" did not throw
-PASS External interface: window.external must inherit property "IsSearchProviderInstalled" with the proper type (1) 
+PASS External interface: window.external must inherit property "IsSearchProviderInstalled(DOMString)" with the proper type 
 FAIL External interface: calling IsSearchProviderInstalled(DOMString) on window.external with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () {
             fn.apply(obj, args);
         }" did not throw
@@ -4873,16 +4873,16 @@
 PASS MessageEvent interface: attribute lastEventId 
 PASS MessageEvent interface: attribute source 
 PASS MessageEvent interface: attribute ports 
-FAIL MessageEvent interface: operation initMessageEvent(DOMString,boolean,boolean,any,DOMString,DOMString,[object Object],[object Object],[object Object]) assert_equals: property has wrong .length expected 1 but got 0
+FAIL MessageEvent interface: operation initMessageEvent(DOMString, boolean, boolean, any, DOMString, DOMString, [object Object],[object Object], [object Object]) assert_equals: property has wrong .length expected 1 but got 0
 PASS MessageEvent must be primary interface of new MessageEvent("message", { data: 5 }) 
 PASS Stringification of new MessageEvent("message", { data: 5 }) 
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type (0) 
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type (1) 
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type (2) 
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type (3) 
-FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type (4) assert_true: Value should be array expected true got false
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent" with the proper type (5) 
-FAIL MessageEvent interface: calling initMessageEvent(DOMString,boolean,boolean,any,DOMString,DOMString,[object Object],[object Object],[object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () {
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type 
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type 
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type 
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type 
+FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type assert_true: Value should be array expected true got false
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent(DOMString, boolean, boolean, any, DOMString, DOMString, [object Object],[object Object], [object Object])" with the proper type 
+FAIL MessageEvent interface: calling initMessageEvent(DOMString, boolean, boolean, any, DOMString, DOMString, [object Object],[object Object], [object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () {
             fn.apply(obj, args);
         }" did not throw
 PASS EventSource interface: existence and properties of interface object 
@@ -4924,7 +4924,7 @@
 PASS WebSocket interface: attribute onclose 
 PASS WebSocket interface: attribute extensions 
 PASS WebSocket interface: attribute protocol 
-PASS WebSocket interface: operation close(unsigned short,USVString) 
+PASS WebSocket interface: operation close(unsigned short, USVString) 
 PASS WebSocket interface: attribute onmessage 
 PASS WebSocket interface: attribute binaryType 
 PASS WebSocket interface: operation send(USVString) 
@@ -4933,29 +4933,29 @@
 PASS WebSocket interface: operation send(ArrayBufferView) 
 PASS WebSocket must be primary interface of new WebSocket("ws://foo") 
 PASS Stringification of new WebSocket("ws://foo") 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "url" with the proper type (0) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CONNECTING" with the proper type (1) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "OPEN" with the proper type (2) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSING" with the proper type (3) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSED" with the proper type (4) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "readyState" with the proper type (5) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "bufferedAmount" with the proper type (6) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onopen" with the proper type (7) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onerror" with the proper type (8) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onclose" with the proper type (9) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "extensions" with the proper type (10) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "protocol" with the proper type (11) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "close" with the proper type (12) 
-PASS WebSocket interface: calling close(unsigned short,USVString) on new WebSocket("ws://foo") with too few arguments must throw TypeError 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onmessage" with the proper type (13) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "binaryType" with the proper type (14) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (15) 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "url" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CONNECTING" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "OPEN" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSING" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSED" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "readyState" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "bufferedAmount" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onopen" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onerror" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onclose" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "extensions" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "protocol" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "close(unsigned short, USVString)" with the proper type 
+PASS WebSocket interface: calling close(unsigned short, USVString) on new WebSocket("ws://foo") with too few arguments must throw TypeError 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onmessage" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "binaryType" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(USVString)" with the proper type 
 PASS WebSocket interface: calling send(USVString) on new WebSocket("ws://foo") with too few arguments must throw TypeError 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (16) 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(Blob)" with the proper type 
 PASS WebSocket interface: calling send(Blob) on new WebSocket("ws://foo") with too few arguments must throw TypeError 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (17) 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(ArrayBuffer)" with the proper type 
 PASS WebSocket interface: calling send(ArrayBuffer) on new WebSocket("ws://foo") with too few arguments must throw TypeError 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (18) 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(ArrayBufferView)" with the proper type 
 PASS WebSocket interface: calling send(ArrayBufferView) on new WebSocket("ws://foo") with too few arguments must throw TypeError 
 PASS CloseEvent interface: existence and properties of interface object 
 PASS CloseEvent interface object length 
@@ -4967,9 +4967,9 @@
 PASS CloseEvent interface: attribute reason 
 PASS CloseEvent must be primary interface of new CloseEvent("close") 
 PASS Stringification of new CloseEvent("close") 
-PASS CloseEvent interface: new CloseEvent("close") must inherit property "wasClean" with the proper type (0) 
-PASS CloseEvent interface: new CloseEvent("close") must inherit property "code" with the proper type (1) 
-PASS CloseEvent interface: new CloseEvent("close") must inherit property "reason" with the proper type (2) 
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "wasClean" with the proper type 
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "code" with the proper type 
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "reason" with the proper type 
 PASS MessageChannel interface: existence and properties of interface object 
 PASS MessageChannel interface object length 
 PASS MessageChannel interface object name 
@@ -4982,7 +4982,7 @@
 PASS MessagePort interface object name 
 PASS MessagePort interface: existence and properties of interface prototype object 
 PASS MessagePort interface: existence and properties of interface prototype object's "constructor" property 
-PASS MessagePort interface: operation postMessage(any,[object Object]) 
+PASS MessagePort interface: operation postMessage(any, [object Object]) 
 PASS MessagePort interface: operation start() 
 PASS MessagePort interface: operation close() 
 PASS MessagePort interface: attribute onmessage 
@@ -5006,7 +5006,7 @@
 PASS Worker interface: existence and properties of interface prototype object 
 PASS Worker interface: existence and properties of interface prototype object's "constructor" property 
 PASS Worker interface: operation terminate() 
-PASS Worker interface: operation postMessage(any,[object Object]) 
+PASS Worker interface: operation postMessage(any, [object Object]) 
 PASS Worker interface: attribute onmessage 
 PASS Worker interface: attribute onerror 
 PASS SharedWorker interface: existence and properties of interface object 
@@ -5026,7 +5026,7 @@
 FAIL Storage interface: attribute length assert_true: property should be enumerable expected true got false
 FAIL Storage interface: operation key(unsigned long) assert_true: property should be enumerable expected true got false
 FAIL Storage interface: operation getItem(DOMString) assert_true: property should be enumerable expected true got false
-FAIL Storage interface: operation setItem(DOMString,DOMString) assert_true: property should be enumerable expected true got false
+FAIL Storage interface: operation setItem(DOMString, DOMString) assert_true: property should be enumerable expected true got false
 FAIL Storage interface: operation removeItem(DOMString) assert_true: property should be enumerable expected true got false
 FAIL Storage interface: operation clear() assert_true: property should be enumerable expected true got false
 PASS StorageEvent interface: existence and properties of interface object 
@@ -5057,17 +5057,17 @@
 FAIL HTMLAppletElement interface: attribute width assert_own_property: self does not have own property "HTMLAppletElement" expected property "HTMLAppletElement" missing
 FAIL HTMLAppletElement must be primary interface of document.createElement("applet") assert_own_property: self does not have own property "HTMLAppletElement" expected property "HTMLAppletElement" missing
 FAIL Stringification of document.createElement("applet") assert_equals: class string of document.createElement("applet") expected "[object HTMLAppletElement]" but got "[object HTMLUnknownElement]"
-FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "align" with the proper type (0) assert_inherits: property "align" not found in prototype chain
-FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "alt" with the proper type (1) assert_inherits: property "alt" not found in prototype chain
-FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "archive" with the proper type (2) assert_inherits: property "archive" not found in prototype chain
-FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "code" with the proper type (3) assert_inherits: property "code" not found in prototype chain
-FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "codeBase" with the proper type (4) assert_inherits: property "codeBase" not found in prototype chain
-FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "height" with the proper type (5) assert_inherits: property "height" not found in prototype chain
-FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "hspace" with the proper type (6) assert_inherits: property "hspace" not found in prototype chain
-FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "name" with the proper type (7) assert_inherits: property "name" not found in prototype chain
-FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "object" with the proper type (8) assert_inherits: property "object" not found in prototype chain
-FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "vspace" with the proper type (9) assert_inherits: property "vspace" not found in prototype chain
-FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "width" with the proper type (10) assert_inherits: property "width" not found in prototype chain
+FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "align" with the proper type assert_inherits: property "align" not found in prototype chain
+FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "alt" with the proper type assert_inherits: property "alt" not found in prototype chain
+FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "archive" with the proper type assert_inherits: property "archive" not found in prototype chain
+FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "code" with the proper type assert_inherits: property "code" not found in prototype chain
+FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "codeBase" with the proper type assert_inherits: property "codeBase" not found in prototype chain
+FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "height" with the proper type assert_inherits: property "height" not found in prototype chain
+FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "hspace" with the proper type assert_inherits: property "hspace" not found in prototype chain
+FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "name" with the proper type assert_inherits: property "name" not found in prototype chain
+FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "object" with the proper type assert_inherits: property "object" not found in prototype chain
+FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "vspace" with the proper type assert_inherits: property "vspace" not found in prototype chain
+FAIL HTMLAppletElement interface: document.createElement("applet") must inherit property "width" with the proper type assert_inherits: property "width" not found in prototype chain
 PASS HTMLMarqueeElement interface: existence and properties of interface object 
 PASS HTMLMarqueeElement interface object length 
 PASS HTMLMarqueeElement interface object name 
@@ -5091,22 +5091,22 @@
 PASS HTMLMarqueeElement interface: operation stop() 
 PASS HTMLMarqueeElement must be primary interface of document.createElement("marquee") 
 PASS Stringification of document.createElement("marquee") 
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "behavior" with the proper type (0) 
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "bgColor" with the proper type (1) 
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "direction" with the proper type (2) 
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "height" with the proper type (3) 
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "hspace" with the proper type (4) 
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "loop" with the proper type (5) 
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollAmount" with the proper type (6) 
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollDelay" with the proper type (7) 
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "trueSpeed" with the proper type (8) 
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "vspace" with the proper type (9) 
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "width" with the proper type (10) 
-FAIL HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onbounce" with the proper type (11) assert_inherits: property "onbounce" not found in prototype chain
-FAIL HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onfinish" with the proper type (12) assert_inherits: property "onfinish" not found in prototype chain
-FAIL HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onstart" with the proper type (13) assert_inherits: property "onstart" not found in prototype chain
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "start" with the proper type (14) 
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "stop" with the proper type (15) 
+PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "behavior" with the proper type 
+PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "bgColor" with the proper type 
+PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "direction" with the proper type 
+PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "height" with the proper type 
+PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "hspace" with the proper type 
+PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "loop" with the proper type 
+PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollAmount" with the proper type 
+PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollDelay" with the proper type 
+PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "trueSpeed" with the proper type 
+PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "vspace" with the proper type 
+PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "width" with the proper type 
+FAIL HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onbounce" with the proper type assert_inherits: property "onbounce" not found in prototype chain
+FAIL HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onfinish" with the proper type assert_inherits: property "onfinish" not found in prototype chain
+FAIL HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onstart" with the proper type assert_inherits: property "onstart" not found in prototype chain
+PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "start()" with the proper type 
+PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "stop()" with the proper type 
 PASS HTMLFrameSetElement interface: existence and properties of interface object 
 PASS HTMLFrameSetElement interface object length 
 PASS HTMLFrameSetElement interface object name 
@@ -5132,24 +5132,24 @@
 PASS HTMLFrameSetElement interface: attribute onunload 
 PASS HTMLFrameSetElement must be primary interface of document.createElement("frameset") 
 PASS Stringification of document.createElement("frameset") 
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "cols" with the proper type (0) 
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "rows" with the proper type (1) 
-FAIL HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onafterprint" with the proper type (2) assert_inherits: property "onafterprint" not found in prototype chain
-FAIL HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onbeforeprint" with the proper type (3) assert_inherits: property "onbeforeprint" not found in prototype chain
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onbeforeunload" with the proper type (4) 
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onhashchange" with the proper type (5) 
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onlanguagechange" with the proper type (6) 
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onmessage" with the proper type (7) 
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onmessageerror" with the proper type (8) 
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onoffline" with the proper type (9) 
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "ononline" with the proper type (10) 
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpagehide" with the proper type (11) 
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpageshow" with the proper type (12) 
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpopstate" with the proper type (13) 
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onrejectionhandled" with the proper type (14) 
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onstorage" with the proper type (15) 
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onunhandledrejection" with the proper type (16) 
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onunload" with the proper type (17) 
+PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "cols" with the proper type 
+PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "rows" with the proper type 
+FAIL HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onafterprint" with the proper type assert_inherits: property "onafterprint" not found in prototype chain
+FAIL HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onbeforeprint" with the proper type assert_inherits: property "onbeforeprint" not found in prototype chain
+PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onbeforeunload" with the proper type 
+PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onhashchange" with the proper type 
+PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onlanguagechange" with the proper type 
+PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onmessage" with the proper type 
+PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onmessageerror" with the proper type 
+PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onoffline" with the proper type 
+PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "ononline" with the proper type 
+PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpagehide" with the proper type 
+PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpageshow" with the proper type 
+PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpopstate" with the proper type 
+PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onrejectionhandled" with the proper type 
+PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onstorage" with the proper type 
+PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onunhandledrejection" with the proper type 
+PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onunload" with the proper type 
 PASS HTMLFrameElement interface: existence and properties of interface object 
 PASS HTMLFrameElement interface object length 
 PASS HTMLFrameElement interface object name 
@@ -5167,16 +5167,16 @@
 PASS HTMLFrameElement interface: attribute marginWidth 
 PASS HTMLFrameElement must be primary interface of document.createElement("frame") 
 PASS Stringification of document.createElement("frame") 
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "name" with the proper type (0) 
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "scrolling" with the proper type (1) 
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "src" with the proper type (2) 
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "frameBorder" with the proper type (3) 
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "longDesc" with the proper type (4) 
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "noResize" with the proper type (5) 
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "contentDocument" with the proper type (6) 
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "contentWindow" with the proper type (7) 
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "marginHeight" with the proper type (8) 
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "marginWidth" with the proper type (9) 
+PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "name" with the proper type 
+PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "scrolling" with the proper type 
+PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "src" with the proper type 
+PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "frameBorder" with the proper type 
+PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "longDesc" with the proper type 
+PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "noResize" with the proper type 
+PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "contentDocument" with the proper type 
+PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "contentWindow" with the proper type 
+PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "marginHeight" with the proper type 
+PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "marginWidth" with the proper type 
 PASS HTMLDirectoryElement interface: existence and properties of interface object 
 PASS HTMLDirectoryElement interface object length 
 PASS HTMLDirectoryElement interface object name 
@@ -5185,7 +5185,7 @@
 PASS HTMLDirectoryElement interface: attribute compact 
 PASS HTMLDirectoryElement must be primary interface of document.createElement("dir") 
 PASS Stringification of document.createElement("dir") 
-PASS HTMLDirectoryElement interface: document.createElement("dir") must inherit property "compact" with the proper type (0) 
+PASS HTMLDirectoryElement interface: document.createElement("dir") must inherit property "compact" with the proper type 
 PASS HTMLFontElement interface: existence and properties of interface object 
 PASS HTMLFontElement interface object length 
 PASS HTMLFontElement interface object name 
@@ -5196,8 +5196,8 @@
 PASS HTMLFontElement interface: attribute size 
 PASS HTMLFontElement must be primary interface of document.createElement("font") 
 PASS Stringification of document.createElement("font") 
-PASS HTMLFontElement interface: document.createElement("font") must inherit property "color" with the proper type (0) 
-PASS HTMLFontElement interface: document.createElement("font") must inherit property "face" with the proper type (1) 
-PASS HTMLFontElement interface: document.createElement("font") must inherit property "size" with the proper type (2) 
+PASS HTMLFontElement interface: document.createElement("font") must inherit property "color" with the proper type 
+PASS HTMLFontElement interface: document.createElement("font") must inherit property "face" with the proper type 
+PASS HTMLFontElement interface: document.createElement("font") must inherit property "size" with the proper type 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.worker-expected.txt
index b0cc4e40..4c9e33b 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.worker-expected.txt
@@ -142,17 +142,17 @@
 PASS Path2D interface object name 
 PASS Path2D interface: existence and properties of interface prototype object 
 PASS Path2D interface: existence and properties of interface prototype object's "constructor" property 
-PASS Path2D interface: operation addPath(Path2D,DOMMatrixInit) 
+PASS Path2D interface: operation addPath(Path2D, DOMMatrixInit) 
 PASS Path2D interface: operation closePath() 
-PASS Path2D interface: operation moveTo(unrestricted double,unrestricted double) 
-PASS Path2D interface: operation lineTo(unrestricted double,unrestricted double) 
-PASS Path2D interface: operation quadraticCurveTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS Path2D interface: operation bezierCurveTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS Path2D interface: operation arcTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS Path2D interface: operation arcTo(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS Path2D interface: operation rect(unrestricted double,unrestricted double,unrestricted double,unrestricted double) 
-PASS Path2D interface: operation arc(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,boolean) 
-PASS Path2D interface: operation ellipse(unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,unrestricted double,boolean) 
+PASS Path2D interface: operation moveTo(unrestricted double, unrestricted double) 
+PASS Path2D interface: operation lineTo(unrestricted double, unrestricted double) 
+PASS Path2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS Path2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS Path2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) 
+PASS Path2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) 
+PASS Path2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) 
 PASS DataTransfer interface: existence and properties of interface object 
 PASS DataTransferItemList interface: existence and properties of interface object 
 PASS DataTransferItem interface: existence and properties of interface object 
@@ -199,16 +199,16 @@
 PASS MessageEvent interface: attribute lastEventId 
 PASS MessageEvent interface: attribute source 
 PASS MessageEvent interface: attribute ports 
-FAIL MessageEvent interface: operation initMessageEvent(DOMString,boolean,boolean,any,DOMString,DOMString,[object Object],[object Object],[object Object]) assert_equals: property has wrong .length expected 1 but got 0
+FAIL MessageEvent interface: operation initMessageEvent(DOMString, boolean, boolean, any, DOMString, DOMString, [object Object],[object Object], [object Object]) assert_equals: property has wrong .length expected 1 but got 0
 PASS MessageEvent must be primary interface of new MessageEvent("message", { data: 5 }) 
 PASS Stringification of new MessageEvent("message", { data: 5 }) 
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type (0) 
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type (1) 
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type (2) 
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type (3) 
-FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type (4) assert_true: Value should be array expected true got false
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent" with the proper type (5) 
-FAIL MessageEvent interface: calling initMessageEvent(DOMString,boolean,boolean,any,DOMString,DOMString,[object Object],[object Object],[object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () {
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type 
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type 
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type 
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type 
+FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type assert_true: Value should be array expected true got false
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent(DOMString, boolean, boolean, any, DOMString, DOMString, [object Object],[object Object], [object Object])" with the proper type 
+FAIL MessageEvent interface: calling initMessageEvent(DOMString, boolean, boolean, any, DOMString, DOMString, [object Object],[object Object], [object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () {
             fn.apply(obj, args);
         }" did not throw
 PASS EventSource interface: existence and properties of interface object 
@@ -250,7 +250,7 @@
 PASS WebSocket interface: attribute onclose 
 PASS WebSocket interface: attribute extensions 
 PASS WebSocket interface: attribute protocol 
-PASS WebSocket interface: operation close(unsigned short,USVString) 
+PASS WebSocket interface: operation close(unsigned short, USVString) 
 PASS WebSocket interface: attribute onmessage 
 PASS WebSocket interface: attribute binaryType 
 PASS WebSocket interface: operation send(USVString) 
@@ -259,29 +259,29 @@
 PASS WebSocket interface: operation send(ArrayBufferView) 
 PASS WebSocket must be primary interface of new WebSocket("ws://foo") 
 PASS Stringification of new WebSocket("ws://foo") 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "url" with the proper type (0) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CONNECTING" with the proper type (1) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "OPEN" with the proper type (2) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSING" with the proper type (3) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSED" with the proper type (4) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "readyState" with the proper type (5) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "bufferedAmount" with the proper type (6) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onopen" with the proper type (7) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onerror" with the proper type (8) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onclose" with the proper type (9) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "extensions" with the proper type (10) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "protocol" with the proper type (11) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "close" with the proper type (12) 
-PASS WebSocket interface: calling close(unsigned short,USVString) on new WebSocket("ws://foo") with too few arguments must throw TypeError 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onmessage" with the proper type (13) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "binaryType" with the proper type (14) 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (15) 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "url" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CONNECTING" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "OPEN" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSING" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSED" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "readyState" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "bufferedAmount" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onopen" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onerror" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onclose" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "extensions" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "protocol" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "close(unsigned short, USVString)" with the proper type 
+PASS WebSocket interface: calling close(unsigned short, USVString) on new WebSocket("ws://foo") with too few arguments must throw TypeError 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "onmessage" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "binaryType" with the proper type 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(USVString)" with the proper type 
 PASS WebSocket interface: calling send(USVString) on new WebSocket("ws://foo") with too few arguments must throw TypeError 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (16) 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(Blob)" with the proper type 
 PASS WebSocket interface: calling send(Blob) on new WebSocket("ws://foo") with too few arguments must throw TypeError 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (17) 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(ArrayBuffer)" with the proper type 
 PASS WebSocket interface: calling send(ArrayBuffer) on new WebSocket("ws://foo") with too few arguments must throw TypeError 
-PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (18) 
+PASS WebSocket interface: new WebSocket("ws://foo") must inherit property "send(ArrayBufferView)" with the proper type 
 PASS WebSocket interface: calling send(ArrayBufferView) on new WebSocket("ws://foo") with too few arguments must throw TypeError 
 PASS CloseEvent interface: existence and properties of interface object 
 PASS CloseEvent interface object length 
@@ -293,9 +293,9 @@
 PASS CloseEvent interface: attribute reason 
 PASS CloseEvent must be primary interface of new CloseEvent("close") 
 PASS Stringification of new CloseEvent("close") 
-PASS CloseEvent interface: new CloseEvent("close") must inherit property "wasClean" with the proper type (0) 
-PASS CloseEvent interface: new CloseEvent("close") must inherit property "code" with the proper type (1) 
-PASS CloseEvent interface: new CloseEvent("close") must inherit property "reason" with the proper type (2) 
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "wasClean" with the proper type 
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "code" with the proper type 
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "reason" with the proper type 
 PASS MessageChannel interface: existence and properties of interface object 
 PASS MessageChannel interface object length 
 PASS MessageChannel interface object name 
@@ -308,7 +308,7 @@
 PASS MessagePort interface object name 
 PASS MessagePort interface: existence and properties of interface prototype object 
 PASS MessagePort interface: existence and properties of interface prototype object's "constructor" property 
-PASS MessagePort interface: operation postMessage(any,[object Object]) 
+PASS MessagePort interface: operation postMessage(any, [object Object]) 
 PASS MessagePort interface: operation start() 
 PASS MessagePort interface: operation close() 
 PASS MessagePort interface: attribute onmessage 
@@ -339,12 +339,12 @@
 PASS WorkerGlobalScope interface: attribute origin 
 PASS WorkerGlobalScope interface: operation btoa(DOMString) 
 PASS WorkerGlobalScope interface: operation atob(DOMString) 
-PASS WorkerGlobalScope interface: operation setTimeout(TimerHandler,long,any) 
+PASS WorkerGlobalScope interface: operation setTimeout(TimerHandler, long, any) 
 PASS WorkerGlobalScope interface: operation clearTimeout(long) 
-PASS WorkerGlobalScope interface: operation setInterval(TimerHandler,long,any) 
+PASS WorkerGlobalScope interface: operation setInterval(TimerHandler, long, any) 
 PASS WorkerGlobalScope interface: operation clearInterval(long) 
-PASS WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource,ImageBitmapOptions) 
-PASS WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource,long,long,long,long,ImageBitmapOptions) 
+PASS WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource, ImageBitmapOptions) 
+PASS WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) 
 PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object 
 PASS DedicatedWorkerGlobalScope interface object length 
 PASS DedicatedWorkerGlobalScope interface object name 
@@ -356,7 +356,7 @@
 PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw 
 PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true 
 PASS DedicatedWorkerGlobalScope interface: existence and properties of interface prototype object's "constructor" property 
-PASS DedicatedWorkerGlobalScope interface: operation postMessage(any,[object Object]) 
+PASS DedicatedWorkerGlobalScope interface: operation postMessage(any, [object Object]) 
 PASS DedicatedWorkerGlobalScope interface: operation close() 
 PASS DedicatedWorkerGlobalScope interface: attribute onmessage 
 PASS DedicatedWorkerGlobalScope interface: attribute onmessageerror 
@@ -368,37 +368,37 @@
 PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true 
 PASS DedicatedWorkerGlobalScope must be primary interface of self 
 PASS Stringification of self 
-PASS DedicatedWorkerGlobalScope interface: self must inherit property "postMessage" with the proper type (0) 
-PASS DedicatedWorkerGlobalScope interface: calling postMessage(any,[object Object]) on self with too few arguments must throw TypeError 
-PASS DedicatedWorkerGlobalScope interface: self must inherit property "close" with the proper type (1) 
-PASS DedicatedWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type (2) 
-PASS DedicatedWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type (3) 
-PASS WorkerGlobalScope interface: self must inherit property "self" with the proper type (0) 
-PASS WorkerGlobalScope interface: self must inherit property "location" with the proper type (1) 
-PASS WorkerGlobalScope interface: self must inherit property "navigator" with the proper type (2) 
-PASS WorkerGlobalScope interface: self must inherit property "importScripts" with the proper type (3) 
+PASS DedicatedWorkerGlobalScope interface: self must inherit property "postMessage(any, [object Object])" with the proper type 
+PASS DedicatedWorkerGlobalScope interface: calling postMessage(any, [object Object]) on self with too few arguments must throw TypeError 
+PASS DedicatedWorkerGlobalScope interface: self must inherit property "close()" with the proper type 
+PASS DedicatedWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type 
+PASS DedicatedWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type 
+PASS WorkerGlobalScope interface: self must inherit property "self" with the proper type 
+PASS WorkerGlobalScope interface: self must inherit property "location" with the proper type 
+PASS WorkerGlobalScope interface: self must inherit property "navigator" with the proper type 
+PASS WorkerGlobalScope interface: self must inherit property "importScripts(USVString)" with the proper type 
 PASS WorkerGlobalScope interface: calling importScripts(USVString) on self with too few arguments must throw TypeError 
-PASS WorkerGlobalScope interface: self must inherit property "onerror" with the proper type (4) 
-FAIL WorkerGlobalScope interface: self must inherit property "onlanguagechange" with the proper type (5) assert_inherits: property "onlanguagechange" not found in prototype chain
-FAIL WorkerGlobalScope interface: self must inherit property "onoffline" with the proper type (6) assert_inherits: property "onoffline" not found in prototype chain
-FAIL WorkerGlobalScope interface: self must inherit property "ononline" with the proper type (7) assert_inherits: property "ononline" not found in prototype chain
-PASS WorkerGlobalScope interface: self must inherit property "origin" with the proper type (8) 
-PASS WorkerGlobalScope interface: self must inherit property "btoa" with the proper type (9) 
+PASS WorkerGlobalScope interface: self must inherit property "onerror" with the proper type 
+FAIL WorkerGlobalScope interface: self must inherit property "onlanguagechange" with the proper type assert_inherits: property "onlanguagechange" not found in prototype chain
+FAIL WorkerGlobalScope interface: self must inherit property "onoffline" with the proper type assert_inherits: property "onoffline" not found in prototype chain
+FAIL WorkerGlobalScope interface: self must inherit property "ononline" with the proper type assert_inherits: property "ononline" not found in prototype chain
+PASS WorkerGlobalScope interface: self must inherit property "origin" with the proper type 
+PASS WorkerGlobalScope interface: self must inherit property "btoa(DOMString)" with the proper type 
 PASS WorkerGlobalScope interface: calling btoa(DOMString) on self with too few arguments must throw TypeError 
-PASS WorkerGlobalScope interface: self must inherit property "atob" with the proper type (10) 
+PASS WorkerGlobalScope interface: self must inherit property "atob(DOMString)" with the proper type 
 PASS WorkerGlobalScope interface: calling atob(DOMString) on self with too few arguments must throw TypeError 
-PASS WorkerGlobalScope interface: self must inherit property "setTimeout" with the proper type (11) 
-PASS WorkerGlobalScope interface: calling setTimeout(TimerHandler,long,any) on self with too few arguments must throw TypeError 
-PASS WorkerGlobalScope interface: self must inherit property "clearTimeout" with the proper type (12) 
+PASS WorkerGlobalScope interface: self must inherit property "setTimeout(TimerHandler, long, any)" with the proper type 
+PASS WorkerGlobalScope interface: calling setTimeout(TimerHandler, long, any) on self with too few arguments must throw TypeError 
+PASS WorkerGlobalScope interface: self must inherit property "clearTimeout(long)" with the proper type 
 PASS WorkerGlobalScope interface: calling clearTimeout(long) on self with too few arguments must throw TypeError 
-PASS WorkerGlobalScope interface: self must inherit property "setInterval" with the proper type (13) 
-PASS WorkerGlobalScope interface: calling setInterval(TimerHandler,long,any) on self with too few arguments must throw TypeError 
-PASS WorkerGlobalScope interface: self must inherit property "clearInterval" with the proper type (14) 
+PASS WorkerGlobalScope interface: self must inherit property "setInterval(TimerHandler, long, any)" with the proper type 
+PASS WorkerGlobalScope interface: calling setInterval(TimerHandler, long, any) on self with too few arguments must throw TypeError 
+PASS WorkerGlobalScope interface: self must inherit property "clearInterval(long)" with the proper type 
 PASS WorkerGlobalScope interface: calling clearInterval(long) on self with too few arguments must throw TypeError 
-PASS WorkerGlobalScope interface: self must inherit property "createImageBitmap" with the proper type (15) 
-PASS WorkerGlobalScope interface: calling createImageBitmap(ImageBitmapSource,ImageBitmapOptions) on self with too few arguments must throw TypeError 
-PASS WorkerGlobalScope interface: self must inherit property "createImageBitmap" with the proper type (16) 
-PASS WorkerGlobalScope interface: calling createImageBitmap(ImageBitmapSource,long,long,long,long,ImageBitmapOptions) on self with too few arguments must throw TypeError 
+PASS WorkerGlobalScope interface: self must inherit property "createImageBitmap(ImageBitmapSource, ImageBitmapOptions)" with the proper type 
+PASS WorkerGlobalScope interface: calling createImageBitmap(ImageBitmapSource, ImageBitmapOptions) on self with too few arguments must throw TypeError 
+PASS WorkerGlobalScope interface: self must inherit property "createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions)" with the proper type 
+PASS WorkerGlobalScope interface: calling createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) on self with too few arguments must throw TypeError 
 PASS SharedWorkerGlobalScope interface: existence and properties of interface object 
 FAIL Worker interface: existence and properties of interface object assert_own_property: self does not have own property "Worker" expected property "Worker" missing
 FAIL Worker interface object length assert_own_property: self does not have own property "Worker" expected property "Worker" missing
@@ -406,7 +406,7 @@
 FAIL Worker interface: existence and properties of interface prototype object assert_own_property: self does not have own property "Worker" expected property "Worker" missing
 FAIL Worker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "Worker" expected property "Worker" missing
 FAIL Worker interface: operation terminate() assert_own_property: self does not have own property "Worker" expected property "Worker" missing
-FAIL Worker interface: operation postMessage(any,[object Object]) assert_own_property: self does not have own property "Worker" expected property "Worker" missing
+FAIL Worker interface: operation postMessage(any, [object Object]) assert_own_property: self does not have own property "Worker" expected property "Worker" missing
 FAIL Worker interface: attribute onmessage assert_own_property: self does not have own property "Worker" expected property "Worker" missing
 FAIL Worker interface: attribute onerror assert_own_property: self does not have own property "Worker" expected property "Worker" missing
 FAIL SharedWorker interface: existence and properties of interface object assert_own_property: self does not have own property "SharedWorker" expected property "SharedWorker" missing
@@ -435,18 +435,18 @@
 PASS WorkerNavigator interface: attribute onLine 
 PASS WorkerNavigator must be primary interface of self.navigator 
 PASS Stringification of self.navigator 
-PASS WorkerNavigator interface: self.navigator must inherit property "appCodeName" with the proper type (0) 
-PASS WorkerNavigator interface: self.navigator must inherit property "appName" with the proper type (1) 
-PASS WorkerNavigator interface: self.navigator must inherit property "appVersion" with the proper type (2) 
-PASS WorkerNavigator interface: self.navigator must inherit property "platform" with the proper type (3) 
-PASS WorkerNavigator interface: self.navigator must inherit property "product" with the proper type (4) 
+PASS WorkerNavigator interface: self.navigator must inherit property "appCodeName" with the proper type 
+PASS WorkerNavigator interface: self.navigator must inherit property "appName" with the proper type 
+PASS WorkerNavigator interface: self.navigator must inherit property "appVersion" with the proper type 
+PASS WorkerNavigator interface: self.navigator must inherit property "platform" with the proper type 
+PASS WorkerNavigator interface: self.navigator must inherit property "product" with the proper type 
 PASS WorkerNavigatorinterface: self.navigatormust not have property "productSub" 
-PASS WorkerNavigator interface: self.navigator must inherit property "userAgent" with the proper type (6) 
+PASS WorkerNavigator interface: self.navigator must inherit property "userAgent" with the proper type 
 PASS WorkerNavigatorinterface: self.navigatormust not have property "vendor" 
 PASS WorkerNavigatorinterface: self.navigatormust not have property "vendorSub" 
-FAIL WorkerNavigator interface: self.navigator must inherit property "language" with the proper type (9) assert_inherits: property "language" not found in prototype chain
-FAIL WorkerNavigator interface: self.navigator must inherit property "languages" with the proper type (10) assert_inherits: property "languages" not found in prototype chain
-PASS WorkerNavigator interface: self.navigator must inherit property "onLine" with the proper type (11) 
+FAIL WorkerNavigator interface: self.navigator must inherit property "language" with the proper type assert_inherits: property "language" not found in prototype chain
+FAIL WorkerNavigator interface: self.navigator must inherit property "languages" with the proper type assert_inherits: property "languages" not found in prototype chain
+PASS WorkerNavigator interface: self.navigator must inherit property "onLine" with the proper type 
 PASS WorkerLocation interface: existence and properties of interface object 
 PASS WorkerLocation interface object length 
 PASS WorkerLocation interface object name 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/image-decodes/image-decode-iframe.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html
similarity index 100%
rename from third_party/WebKit/LayoutTests/external/wpt/image-decodes/image-decode-iframe.html
rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html
diff --git a/third_party/WebKit/LayoutTests/external/wpt/image-decodes/image-decode-path-changes.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html
similarity index 100%
rename from third_party/WebKit/LayoutTests/external/wpt/image-decodes/image-decode-path-changes.html
rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html
diff --git a/third_party/WebKit/LayoutTests/external/wpt/image-decodes/image-decode.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-img-element/decode/image-decode.html
similarity index 100%
rename from third_party/WebKit/LayoutTests/external/wpt/image-decodes/image-decode.html
rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/the-img-element/decode/image-decode.html
diff --git a/third_party/WebKit/LayoutTests/external/wpt/input-events/input-events-typing-data-manual.html b/third_party/WebKit/LayoutTests/external/wpt/input-events/input-events-typing-data-manual.html
index 2b4a809..26e179c3 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/input-events/input-events-typing-data-manual.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/input-events/input-events-typing-data-manual.html
@@ -9,7 +9,7 @@
 <br/>
 If a "PASS" result appears the test passes, otherwise it fails</p>
 <textarea id='plain'></textarea>
-<div id='rich' style='border-style: solid;' contenteditable></div>
+<div id='rich' style='border-style: solid;' contenteditable><br></div>
 <script>
 async_test(t => {
     const expectedResult = [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/intersection-observer/timestamp.html b/third_party/WebKit/LayoutTests/external/wpt/intersection-observer/timestamp.html
index cffd915..90032560 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/intersection-observer/timestamp.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/intersection-observer/timestamp.html
@@ -87,7 +87,13 @@
   // Test results are only significant if there's a gap between
   // top window time and iframe window time.
   assert_greater_than(topWindowTimeBeforeNotification, iframeWindowTimeAfterNotification,
-    "Time ranges for top and iframe windows are disjoint.");
+    "Time ranges for top and iframe windows are disjoint. Times: " +
+      [topWindowTimeOnTestStart, topWindowTimeBeforeCreatingIframe,
+       topWindowTimeBeforeNotification, topWindowTimeAfterNotification,
+       iframeWindowTimeBeforeNotification, iframeWindowTimeAfterNotification,
+       topWindowEntries[1].time - topWindowTimeBeforeNotification,
+       iframeWindowEntries[1].time - iframeWindowTimeBeforeNotification
+      ]);
 
   assert_equals(topWindowEntries.length, 2, "Top window observer has two notifications.");
   assert_between_inclusive(
diff --git a/third_party/WebKit/LayoutTests/external/wpt/keyboard-lock/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/keyboard-lock/idlharness.https-expected.txt
index 888b6049..3a95eb3 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/keyboard-lock/idlharness.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/keyboard-lock/idlharness.https-expected.txt
@@ -3,8 +3,8 @@
             fn.apply(obj, args);
         }" did not throw
 PASS Navigator interface: operation cancelKeyboardLock() 
-PASS Navigator interface: navigator must inherit property "requestKeyboardLock" with the proper type (0) 
+PASS Navigator interface: navigator must inherit property "requestKeyboardLock(sequence)" with the proper type 
 PASS Navigator interface: calling requestKeyboardLock(sequence) on navigator with too few arguments must throw TypeError 
-PASS Navigator interface: navigator must inherit property "cancelKeyboardLock" with the proper type (1) 
+PASS Navigator interface: navigator must inherit property "cancelKeyboardLock()" with the proper type 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness-expected.txt
index c455fe7..a488b2c 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness-expected.txt
@@ -1,6 +1,6 @@
 This is a testharness.js-based test.
 PASS Navigator interface: attribute mediaCapabilities 
-PASS Navigator interface: navigator must inherit property "mediaCapabilities" with the proper type (0) 
+PASS Navigator interface: navigator must inherit property "mediaCapabilities" with the proper type 
 PASS WorkerNavigator interface: existence and properties of interface object 
 PASS MediaCapabilitiesInfo interface: existence and properties of interface object 
 PASS MediaCapabilitiesInfo interface object length 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/media-source/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/media-source/interfaces-expected.txt
index 19f99bb..98f4a88 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/media-source/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/media-source/interfaces-expected.txt
@@ -19,28 +19,28 @@
 PASS MediaSource interface: operation addSourceBuffer(DOMString) 
 PASS MediaSource interface: operation removeSourceBuffer(SourceBuffer) 
 PASS MediaSource interface: operation endOfStream(EndOfStreamError) 
-PASS MediaSource interface: operation setLiveSeekableRange(double,double) 
+PASS MediaSource interface: operation setLiveSeekableRange(double, double) 
 PASS MediaSource interface: operation clearLiveSeekableRange() 
 PASS MediaSource interface: operation isTypeSupported(DOMString) 
 PASS MediaSource must be primary interface of mediaSource 
 PASS Stringification of mediaSource 
-PASS MediaSource interface: mediaSource must inherit property "sourceBuffers" with the proper type (0) 
-PASS MediaSource interface: mediaSource must inherit property "activeSourceBuffers" with the proper type (1) 
-PASS MediaSource interface: mediaSource must inherit property "readyState" with the proper type (2) 
-PASS MediaSource interface: mediaSource must inherit property "duration" with the proper type (3) 
-PASS MediaSource interface: mediaSource must inherit property "onsourceopen" with the proper type (4) 
-PASS MediaSource interface: mediaSource must inherit property "onsourceended" with the proper type (5) 
-PASS MediaSource interface: mediaSource must inherit property "onsourceclose" with the proper type (6) 
-PASS MediaSource interface: mediaSource must inherit property "addSourceBuffer" with the proper type (7) 
+PASS MediaSource interface: mediaSource must inherit property "sourceBuffers" with the proper type 
+PASS MediaSource interface: mediaSource must inherit property "activeSourceBuffers" with the proper type 
+PASS MediaSource interface: mediaSource must inherit property "readyState" with the proper type 
+PASS MediaSource interface: mediaSource must inherit property "duration" with the proper type 
+PASS MediaSource interface: mediaSource must inherit property "onsourceopen" with the proper type 
+PASS MediaSource interface: mediaSource must inherit property "onsourceended" with the proper type 
+PASS MediaSource interface: mediaSource must inherit property "onsourceclose" with the proper type 
+PASS MediaSource interface: mediaSource must inherit property "addSourceBuffer(DOMString)" with the proper type 
 PASS MediaSource interface: calling addSourceBuffer(DOMString) on mediaSource with too few arguments must throw TypeError 
-PASS MediaSource interface: mediaSource must inherit property "removeSourceBuffer" with the proper type (8) 
+PASS MediaSource interface: mediaSource must inherit property "removeSourceBuffer(SourceBuffer)" with the proper type 
 PASS MediaSource interface: calling removeSourceBuffer(SourceBuffer) on mediaSource with too few arguments must throw TypeError 
-PASS MediaSource interface: mediaSource must inherit property "endOfStream" with the proper type (9) 
+PASS MediaSource interface: mediaSource must inherit property "endOfStream(EndOfStreamError)" with the proper type 
 PASS MediaSource interface: calling endOfStream(EndOfStreamError) on mediaSource with too few arguments must throw TypeError 
-PASS MediaSource interface: mediaSource must inherit property "setLiveSeekableRange" with the proper type (10) 
-PASS MediaSource interface: calling setLiveSeekableRange(double,double) on mediaSource with too few arguments must throw TypeError 
-PASS MediaSource interface: mediaSource must inherit property "clearLiveSeekableRange" with the proper type (11) 
-PASS MediaSource interface: mediaSource must inherit property "isTypeSupported" with the proper type (12) 
+PASS MediaSource interface: mediaSource must inherit property "setLiveSeekableRange(double, double)" with the proper type 
+PASS MediaSource interface: calling setLiveSeekableRange(double, double) on mediaSource with too few arguments must throw TypeError 
+PASS MediaSource interface: mediaSource must inherit property "clearLiveSeekableRange()" with the proper type 
+PASS MediaSource interface: mediaSource must inherit property "isTypeSupported(DOMString)" with the proper type 
 PASS MediaSource interface: calling isTypeSupported(DOMString) on mediaSource with too few arguments must throw TypeError 
 PASS SourceBuffer interface: existence and properties of interface object 
 PASS SourceBuffer interface object length 
@@ -63,28 +63,28 @@
 PASS SourceBuffer interface: attribute onabort 
 PASS SourceBuffer interface: operation appendBuffer(BufferSource) 
 PASS SourceBuffer interface: operation abort() 
-PASS SourceBuffer interface: operation remove(double,unrestricted double) 
+PASS SourceBuffer interface: operation remove(double, unrestricted double) 
 PASS SourceBuffer must be primary interface of sourceBuffer 
 PASS Stringification of sourceBuffer 
-PASS SourceBuffer interface: sourceBuffer must inherit property "mode" with the proper type (0) 
-PASS SourceBuffer interface: sourceBuffer must inherit property "updating" with the proper type (1) 
-PASS SourceBuffer interface: sourceBuffer must inherit property "buffered" with the proper type (2) 
-PASS SourceBuffer interface: sourceBuffer must inherit property "timestampOffset" with the proper type (3) 
-PASS SourceBuffer interface: sourceBuffer must inherit property "audioTracks" with the proper type (4) 
-PASS SourceBuffer interface: sourceBuffer must inherit property "videoTracks" with the proper type (5) 
-FAIL SourceBuffer interface: sourceBuffer must inherit property "textTracks" with the proper type (6) assert_inherits: property "textTracks" not found in prototype chain
-PASS SourceBuffer interface: sourceBuffer must inherit property "appendWindowStart" with the proper type (7) 
-PASS SourceBuffer interface: sourceBuffer must inherit property "appendWindowEnd" with the proper type (8) 
-PASS SourceBuffer interface: sourceBuffer must inherit property "onupdatestart" with the proper type (9) 
-PASS SourceBuffer interface: sourceBuffer must inherit property "onupdate" with the proper type (10) 
-PASS SourceBuffer interface: sourceBuffer must inherit property "onupdateend" with the proper type (11) 
-PASS SourceBuffer interface: sourceBuffer must inherit property "onerror" with the proper type (12) 
-PASS SourceBuffer interface: sourceBuffer must inherit property "onabort" with the proper type (13) 
-PASS SourceBuffer interface: sourceBuffer must inherit property "appendBuffer" with the proper type (14) 
+PASS SourceBuffer interface: sourceBuffer must inherit property "mode" with the proper type 
+PASS SourceBuffer interface: sourceBuffer must inherit property "updating" with the proper type 
+PASS SourceBuffer interface: sourceBuffer must inherit property "buffered" with the proper type 
+PASS SourceBuffer interface: sourceBuffer must inherit property "timestampOffset" with the proper type 
+PASS SourceBuffer interface: sourceBuffer must inherit property "audioTracks" with the proper type 
+PASS SourceBuffer interface: sourceBuffer must inherit property "videoTracks" with the proper type 
+FAIL SourceBuffer interface: sourceBuffer must inherit property "textTracks" with the proper type assert_inherits: property "textTracks" not found in prototype chain
+PASS SourceBuffer interface: sourceBuffer must inherit property "appendWindowStart" with the proper type 
+PASS SourceBuffer interface: sourceBuffer must inherit property "appendWindowEnd" with the proper type 
+PASS SourceBuffer interface: sourceBuffer must inherit property "onupdatestart" with the proper type 
+PASS SourceBuffer interface: sourceBuffer must inherit property "onupdate" with the proper type 
+PASS SourceBuffer interface: sourceBuffer must inherit property "onupdateend" with the proper type 
+PASS SourceBuffer interface: sourceBuffer must inherit property "onerror" with the proper type 
+PASS SourceBuffer interface: sourceBuffer must inherit property "onabort" with the proper type 
+PASS SourceBuffer interface: sourceBuffer must inherit property "appendBuffer(BufferSource)" with the proper type 
 PASS SourceBuffer interface: calling appendBuffer(BufferSource) on sourceBuffer with too few arguments must throw TypeError 
-PASS SourceBuffer interface: sourceBuffer must inherit property "abort" with the proper type (15) 
-PASS SourceBuffer interface: sourceBuffer must inherit property "remove" with the proper type (16) 
-PASS SourceBuffer interface: calling remove(double,unrestricted double) on sourceBuffer with too few arguments must throw TypeError 
+PASS SourceBuffer interface: sourceBuffer must inherit property "abort()" with the proper type 
+PASS SourceBuffer interface: sourceBuffer must inherit property "remove(double, unrestricted double)" with the proper type 
+PASS SourceBuffer interface: calling remove(double, unrestricted double) on sourceBuffer with too few arguments must throw TypeError 
 PASS SourceBufferList interface: existence and properties of interface object 
 PASS SourceBufferList interface object length 
 PASS SourceBufferList interface object name 
@@ -95,8 +95,8 @@
 PASS SourceBufferList interface: attribute onremovesourcebuffer 
 PASS SourceBufferList must be primary interface of mediaSource.sourceBuffers 
 PASS Stringification of mediaSource.sourceBuffers 
-PASS SourceBufferList interface: mediaSource.sourceBuffers must inherit property "length" with the proper type (0) 
-PASS SourceBufferList interface: mediaSource.sourceBuffers must inherit property "onaddsourcebuffer" with the proper type (1) 
-PASS SourceBufferList interface: mediaSource.sourceBuffers must inherit property "onremovesourcebuffer" with the proper type (2) 
+PASS SourceBufferList interface: mediaSource.sourceBuffers must inherit property "length" with the proper type 
+PASS SourceBufferList interface: mediaSource.sourceBuffers must inherit property "onaddsourcebuffer" with the proper type 
+PASS SourceBufferList interface: mediaSource.sourceBuffers must inherit property "onremovesourcebuffer" with the proper type 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-fromelement/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-fromelement/idlharness-expected.txt
index a2ccb543..f782506 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-fromelement/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-fromelement/idlharness-expected.txt
@@ -1,9 +1,9 @@
 This is a testharness.js-based test.
 PASS HTMLCanvasElement interface: operation captureStream(double) 
-PASS HTMLCanvasElement interface: [object HTMLCanvasElement] must inherit property "captureStream" with the proper type (0) 
+PASS HTMLCanvasElement interface: [object HTMLCanvasElement] must inherit property "captureStream(double)" with the proper type 
 PASS HTMLCanvasElement interface: calling captureStream(double) on [object HTMLCanvasElement] with too few arguments must throw TypeError 
 PASS HTMLMediaElement interface: operation captureStream() 
-FAIL HTMLMediaElement interface: [object HTMLUnknownElement] must inherit property "captureStream" with the proper type (0) assert_inherits: property "captureStream" not found in prototype chain
+FAIL HTMLMediaElement interface: [object HTMLUnknownElement] must inherit property "captureStream()" with the proper type assert_inherits: property "captureStream" not found in prototype chain
 PASS CanvasCaptureMediaStreamTrack interface: existence and properties of interface object 
 PASS CanvasCaptureMediaStreamTrack interface object length 
 PASS CanvasCaptureMediaStreamTrack interface object name 
@@ -13,7 +13,7 @@
 PASS CanvasCaptureMediaStreamTrack interface: operation requestFrame() 
 PASS CanvasCaptureMediaStreamTrack must be primary interface of [object CanvasCaptureMediaStreamTrack] 
 PASS Stringification of [object CanvasCaptureMediaStreamTrack] 
-PASS CanvasCaptureMediaStreamTrack interface: [object CanvasCaptureMediaStreamTrack] must inherit property "canvas" with the proper type (0) 
-PASS CanvasCaptureMediaStreamTrack interface: [object CanvasCaptureMediaStreamTrack] must inherit property "requestFrame" with the proper type (1) 
+PASS CanvasCaptureMediaStreamTrack interface: [object CanvasCaptureMediaStreamTrack] must inherit property "canvas" with the proper type 
+PASS CanvasCaptureMediaStreamTrack interface: [object CanvasCaptureMediaStreamTrack] must inherit property "requestFrame()" with the proper type 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness-expected.txt
index c50ba89..d2bf23a 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness-expected.txt
@@ -24,24 +24,24 @@
 PASS MediaRecorder interface: operation isTypeSupported(DOMString) 
 PASS MediaRecorder must be primary interface of [object MediaRecorder] 
 PASS Stringification of [object MediaRecorder] 
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "stream" with the proper type (0) 
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "mimeType" with the proper type (1) 
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "state" with the proper type (2) 
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onstart" with the proper type (3) 
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onstop" with the proper type (4) 
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "ondataavailable" with the proper type (5) 
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onpause" with the proper type (6) 
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onresume" with the proper type (7) 
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onerror" with the proper type (8) 
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "videoBitsPerSecond" with the proper type (9) 
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "audioBitsPerSecond" with the proper type (10) 
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "start" with the proper type (11) 
+PASS MediaRecorder interface: [object MediaRecorder] must inherit property "stream" with the proper type 
+PASS MediaRecorder interface: [object MediaRecorder] must inherit property "mimeType" with the proper type 
+PASS MediaRecorder interface: [object MediaRecorder] must inherit property "state" with the proper type 
+PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onstart" with the proper type 
+PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onstop" with the proper type 
+PASS MediaRecorder interface: [object MediaRecorder] must inherit property "ondataavailable" with the proper type 
+PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onpause" with the proper type 
+PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onresume" with the proper type 
+PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onerror" with the proper type 
+PASS MediaRecorder interface: [object MediaRecorder] must inherit property "videoBitsPerSecond" with the proper type 
+PASS MediaRecorder interface: [object MediaRecorder] must inherit property "audioBitsPerSecond" with the proper type 
+PASS MediaRecorder interface: [object MediaRecorder] must inherit property "start(long)" with the proper type 
 PASS MediaRecorder interface: calling start(long) on [object MediaRecorder] with too few arguments must throw TypeError 
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "stop" with the proper type (12) 
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "pause" with the proper type (13) 
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "resume" with the proper type (14) 
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "requestData" with the proper type (15) 
-PASS MediaRecorder interface: [object MediaRecorder] must inherit property "isTypeSupported" with the proper type (16) 
+PASS MediaRecorder interface: [object MediaRecorder] must inherit property "stop()" with the proper type 
+PASS MediaRecorder interface: [object MediaRecorder] must inherit property "pause()" with the proper type 
+PASS MediaRecorder interface: [object MediaRecorder] must inherit property "resume()" with the proper type 
+PASS MediaRecorder interface: [object MediaRecorder] must inherit property "requestData()" with the proper type 
+PASS MediaRecorder interface: [object MediaRecorder] must inherit property "isTypeSupported(DOMString)" with the proper type 
 PASS MediaRecorder interface: calling isTypeSupported(DOMString) on [object MediaRecorder] with too few arguments must throw TypeError 
 PASS BlobEvent interface: existence and properties of interface object 
 PASS BlobEvent interface object length 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt
index b8c4217f..bbb473c7 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-all-expected.txt
@@ -2,10 +2,10 @@
 Found 86 tests; 71 PASS, 15 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Test driver 
 PASS Navigator interface: attribute mediaDevices 
-PASS Navigator interface: operation getUserMedia(MediaStreamConstraints,NavigatorUserMediaSuccessCallback,NavigatorUserMediaErrorCallback) 
-PASS Navigator interface: navigator must inherit property "mediaDevices" with the proper type (0) 
-PASS Navigator interface: navigator must inherit property "getUserMedia" with the proper type (1) 
-PASS Navigator interface: calling getUserMedia(MediaStreamConstraints,NavigatorUserMediaSuccessCallback,NavigatorUserMediaErrorCallback) on navigator with too few arguments must throw TypeError 
+PASS Navigator interface: operation getUserMedia(MediaStreamConstraints, NavigatorUserMediaSuccessCallback, NavigatorUserMediaErrorCallback) 
+PASS Navigator interface: navigator must inherit property "mediaDevices" with the proper type 
+PASS Navigator interface: navigator must inherit property "getUserMedia(MediaStreamConstraints, NavigatorUserMediaSuccessCallback, NavigatorUserMediaErrorCallback)" with the proper type 
+PASS Navigator interface: calling getUserMedia(MediaStreamConstraints, NavigatorUserMediaSuccessCallback, NavigatorUserMediaErrorCallback) on navigator with too few arguments must throw TypeError 
 PASS MediaStream interface: existence and properties of interface object 
 PASS MediaStream interface object length 
 PASS MediaStream interface object name 
@@ -66,10 +66,10 @@
 PASS MediaDevices interface: operation getUserMedia(MediaStreamConstraints) 
 PASS MediaDevices must be primary interface of navigator.mediaDevices 
 PASS Stringification of navigator.mediaDevices 
-PASS MediaDevices interface: navigator.mediaDevices must inherit property "ondevicechange" with the proper type (0) 
-PASS MediaDevices interface: navigator.mediaDevices must inherit property "enumerateDevices" with the proper type (1) 
-PASS MediaDevices interface: navigator.mediaDevices must inherit property "getSupportedConstraints" with the proper type (2) 
-PASS MediaDevices interface: navigator.mediaDevices must inherit property "getUserMedia" with the proper type (3) 
+PASS MediaDevices interface: navigator.mediaDevices must inherit property "ondevicechange" with the proper type 
+PASS MediaDevices interface: navigator.mediaDevices must inherit property "enumerateDevices()" with the proper type 
+PASS MediaDevices interface: navigator.mediaDevices must inherit property "getSupportedConstraints()" with the proper type 
+PASS MediaDevices interface: navigator.mediaDevices must inherit property "getUserMedia(MediaStreamConstraints)" with the proper type 
 PASS MediaDevices interface: calling getUserMedia(MediaStreamConstraints) on navigator.mediaDevices with too few arguments must throw TypeError 
 PASS MediaDeviceInfo interface: existence and properties of interface object 
 PASS MediaDeviceInfo interface object length 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-enumerateDevices-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-enumerateDevices-expected.txt
index 274fec7..c86482c 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-enumerateDevices-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaDevices-IDL-enumerateDevices-expected.txt
@@ -2,7 +2,7 @@
 Found 82 tests; 61 PASS, 21 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Test MediaDevices.enumerateDevices call and result. Types only. 
 PASS Navigator interface: attribute mediaDevices 
-PASS Navigator interface: operation getUserMedia(MediaStreamConstraints,NavigatorUserMediaSuccessCallback,NavigatorUserMediaErrorCallback) 
+PASS Navigator interface: operation getUserMedia(MediaStreamConstraints, NavigatorUserMediaSuccessCallback, NavigatorUserMediaErrorCallback) 
 FAIL MediaStream interface: existence and properties of interface object Cannot read property 'has_extended_attribute' of undefined
 PASS MediaStream interface object length 
 PASS MediaStream interface object name 
@@ -72,10 +72,10 @@
 PASS MediaDeviceInfo interface: attribute groupId 
 PASS MediaDeviceInfo must be primary interface of _mediaInfo 
 PASS Stringification of _mediaInfo 
-PASS MediaDeviceInfo interface: _mediaInfo must inherit property "deviceId" with the proper type (0) 
-PASS MediaDeviceInfo interface: _mediaInfo must inherit property "kind" with the proper type (1) 
-PASS MediaDeviceInfo interface: _mediaInfo must inherit property "label" with the proper type (2) 
-PASS MediaDeviceInfo interface: _mediaInfo must inherit property "groupId" with the proper type (3) 
+PASS MediaDeviceInfo interface: _mediaInfo must inherit property "deviceId" with the proper type 
+PASS MediaDeviceInfo interface: _mediaInfo must inherit property "kind" with the proper type 
+PASS MediaDeviceInfo interface: _mediaInfo must inherit property "label" with the proper type 
+PASS MediaDeviceInfo interface: _mediaInfo must inherit property "groupId" with the proper type 
 FAIL InputDeviceInfo interface: existence and properties of interface object assert_own_property: self does not have own property "InputDeviceInfo" expected property "InputDeviceInfo" missing
 FAIL InputDeviceInfo interface object length assert_own_property: self does not have own property "InputDeviceInfo" expected property "InputDeviceInfo" missing
 FAIL InputDeviceInfo interface object name assert_own_property: self does not have own property "InputDeviceInfo" expected property "InputDeviceInfo" missing
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-init.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-init.https-expected.txt
index dac4e22a..8fd95d4 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-init.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-init.https-expected.txt
@@ -5,8 +5,8 @@
 PASS EventTarget interface object name 
 PASS EventTarget interface: existence and properties of interface prototype object 
 PASS EventTarget interface: existence and properties of interface prototype object's "constructor" property 
-PASS EventTarget interface: operation addEventListener(DOMString,EventListener,boolean) 
-PASS EventTarget interface: operation removeEventListener(DOMString,EventListener,boolean) 
+PASS EventTarget interface: operation addEventListener(DOMString, EventListener, boolean) 
+PASS EventTarget interface: operation removeEventListener(DOMString, EventListener, boolean) 
 PASS EventTarget interface: operation dispatchEvent(Event) 
 PASS MediaStreamTrack interface: existence and properties of interface object 
 PASS MediaStreamTrack interface object length 
@@ -31,28 +31,28 @@
 PASS MediaStreamTrack interface: operation applyConstraints(MediaTrackConstraints) 
 PASS MediaStreamTrack must be primary interface of track 
 PASS Stringification of track 
-PASS MediaStreamTrack interface: track must inherit property "kind" with the proper type (0) 
-PASS MediaStreamTrack interface: track must inherit property "id" with the proper type (1) 
-PASS MediaStreamTrack interface: track must inherit property "label" with the proper type (2) 
-PASS MediaStreamTrack interface: track must inherit property "enabled" with the proper type (3) 
-PASS MediaStreamTrack interface: track must inherit property "muted" with the proper type (4) 
-FAIL MediaStreamTrack interface: track must inherit property "onmute" with the proper type (5) Unrecognized type EventHandler
-FAIL MediaStreamTrack interface: track must inherit property "onunmute" with the proper type (6) Unrecognized type EventHandler
-FAIL MediaStreamTrack interface: track must inherit property "readyState" with the proper type (7) Unrecognized type MediaStreamTrackState
-FAIL MediaStreamTrack interface: track must inherit property "onended" with the proper type (8) Unrecognized type EventHandler
-FAIL MediaStreamTrack interface: track must inherit property "onoverconstrained" with the proper type (9) assert_inherits: property "onoverconstrained" not found in prototype chain
-PASS MediaStreamTrack interface: track must inherit property "clone" with the proper type (10) 
-PASS MediaStreamTrack interface: track must inherit property "stop" with the proper type (11) 
-PASS MediaStreamTrack interface: track must inherit property "getCapabilities" with the proper type (12) 
-PASS MediaStreamTrack interface: track must inherit property "getConstraints" with the proper type (13) 
-PASS MediaStreamTrack interface: track must inherit property "getSettings" with the proper type (14) 
-PASS MediaStreamTrack interface: track must inherit property "applyConstraints" with the proper type (15) 
+PASS MediaStreamTrack interface: track must inherit property "kind" with the proper type 
+PASS MediaStreamTrack interface: track must inherit property "id" with the proper type 
+PASS MediaStreamTrack interface: track must inherit property "label" with the proper type 
+PASS MediaStreamTrack interface: track must inherit property "enabled" with the proper type 
+PASS MediaStreamTrack interface: track must inherit property "muted" with the proper type 
+FAIL MediaStreamTrack interface: track must inherit property "onmute" with the proper type Unrecognized type EventHandler
+FAIL MediaStreamTrack interface: track must inherit property "onunmute" with the proper type Unrecognized type EventHandler
+FAIL MediaStreamTrack interface: track must inherit property "readyState" with the proper type Unrecognized type MediaStreamTrackState
+FAIL MediaStreamTrack interface: track must inherit property "onended" with the proper type Unrecognized type EventHandler
+FAIL MediaStreamTrack interface: track must inherit property "onoverconstrained" with the proper type assert_inherits: property "onoverconstrained" not found in prototype chain
+PASS MediaStreamTrack interface: track must inherit property "clone()" with the proper type 
+PASS MediaStreamTrack interface: track must inherit property "stop()" with the proper type 
+PASS MediaStreamTrack interface: track must inherit property "getCapabilities()" with the proper type 
+PASS MediaStreamTrack interface: track must inherit property "getConstraints()" with the proper type 
+PASS MediaStreamTrack interface: track must inherit property "getSettings()" with the proper type 
+PASS MediaStreamTrack interface: track must inherit property "applyConstraints(MediaTrackConstraints)" with the proper type 
 PASS MediaStreamTrack interface: calling applyConstraints(MediaTrackConstraints) on track with too few arguments must throw TypeError 
-PASS EventTarget interface: track must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,boolean) on track with too few arguments must throw TypeError 
-PASS EventTarget interface: track must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,boolean) on track with too few arguments must throw TypeError 
-PASS EventTarget interface: track must inherit property "dispatchEvent" with the proper type (2) 
+PASS EventTarget interface: track must inherit property "addEventListener(DOMString, EventListener, boolean)" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, boolean) on track with too few arguments must throw TypeError 
+PASS EventTarget interface: track must inherit property "removeEventListener(DOMString, EventListener, boolean)" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, boolean) on track with too few arguments must throw TypeError 
+PASS EventTarget interface: track must inherit property "dispatchEvent(Event)" with the proper type 
 PASS EventTarget interface: calling dispatchEvent(Event) on track with too few arguments must throw TypeError 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediasession/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediasession/idlharness-expected.txt
index 3aa5626c..f4b7381 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/mediasession/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/mediasession/idlharness-expected.txt
@@ -1,6 +1,6 @@
 This is a testharness.js-based test.
 PASS Navigator interface: attribute mediaSession 
-PASS Navigator interface: navigator must inherit property "mediaSession" with the proper type (0) 
+PASS Navigator interface: navigator must inherit property "mediaSession" with the proper type 
 PASS MediaSession interface: existence and properties of interface object 
 PASS MediaSession interface object length 
 PASS MediaSession interface object name 
@@ -8,7 +8,7 @@
 PASS MediaSession interface: existence and properties of interface prototype object's "constructor" property 
 PASS MediaSession interface: attribute metadata 
 PASS MediaSession interface: attribute playbackState 
-PASS MediaSession interface: operation setActionHandler(MediaSessionAction,MediaSessionActionHandler) 
+PASS MediaSession interface: operation setActionHandler(MediaSessionAction, MediaSessionActionHandler) 
 PASS MediaMetadata interface: existence and properties of interface object 
 PASS MediaMetadata interface object length 
 PASS MediaMetadata interface object name 
@@ -20,9 +20,9 @@
 PASS MediaMetadata interface: attribute artwork 
 PASS MediaMetadata must be primary interface of [object MediaMetadata] 
 PASS Stringification of [object MediaMetadata] 
-PASS MediaMetadata interface: [object MediaMetadata] must inherit property "title" with the proper type (0) 
-PASS MediaMetadata interface: [object MediaMetadata] must inherit property "artist" with the proper type (1) 
-PASS MediaMetadata interface: [object MediaMetadata] must inherit property "album" with the proper type (2) 
-FAIL MediaMetadata interface: [object MediaMetadata] must inherit property "artwork" with the proper type (3) Unrecognized type FrozenArray
+PASS MediaMetadata interface: [object MediaMetadata] must inherit property "title" with the proper type 
+PASS MediaMetadata interface: [object MediaMetadata] must inherit property "artist" with the proper type 
+PASS MediaMetadata interface: [object MediaMetadata] must inherit property "album" with the proper type 
+FAIL MediaMetadata interface: [object MediaMetadata] must inherit property "artwork" with the proper type Unrecognized type FrozenArray
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/orientation-event/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/orientation-event/idlharness-expected.txt
index 69f4502f..7966052 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/orientation-event/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/orientation-event/idlharness-expected.txt
@@ -12,10 +12,10 @@
 PASS DeviceOrientationEvent interface: attribute absolute 
 PASS DeviceOrientationEvent must be primary interface of new DeviceOrientationEvent("foo") 
 PASS Stringification of new DeviceOrientationEvent("foo") 
-PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "alpha" with the proper type (0) 
-PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "beta" with the proper type (1) 
-PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "gamma" with the proper type (2) 
-PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "absolute" with the proper type (3) 
+PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "alpha" with the proper type 
+PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "beta" with the proper type 
+PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "gamma" with the proper type 
+PASS DeviceOrientationEvent interface: new DeviceOrientationEvent("foo") must inherit property "absolute" with the proper type 
 PASS DeviceMotionEvent interface: existence and properties of interface object 
 PASS DeviceMotionEvent interface object length 
 PASS DeviceMotionEvent interface object name 
@@ -27,9 +27,9 @@
 PASS DeviceMotionEvent interface: attribute interval 
 PASS DeviceMotionEvent must be primary interface of new DeviceMotionEvent("foo") 
 PASS Stringification of new DeviceMotionEvent("foo") 
-PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "acceleration" with the proper type (0) 
-PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "accelerationIncludingGravity" with the proper type (1) 
-PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "rotationRate" with the proper type (2) 
-PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "interval" with the proper type (3) 
+PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "acceleration" with the proper type 
+PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "accelerationIncludingGravity" with the proper type 
+PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "rotationRate" with the proper type 
+PASS DeviceMotionEvent interface: new DeviceMotionEvent("foo") must inherit property "interval" with the proper type 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/page-visibility/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/page-visibility/idlharness-expected.txt
index 11c3e67..12ab6fc 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/page-visibility/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/page-visibility/idlharness-expected.txt
@@ -2,8 +2,8 @@
 PASS Document interface: attribute hidden 
 PASS Document interface: attribute visibilityState 
 FAIL Document interface: attribute onvisibilitychange assert_true: The prototype object must have a property "onvisibilitychange" expected true got false
-PASS Document interface: window.document must inherit property "hidden" with the proper type (0) 
-PASS Document interface: window.document must inherit property "visibilityState" with the proper type (1) 
-FAIL Document interface: window.document must inherit property "onvisibilitychange" with the proper type (2) assert_inherits: property "onvisibilitychange" not found in prototype chain
+PASS Document interface: window.document must inherit property "hidden" with the proper type 
+PASS Document interface: window.document must inherit property "visibilityState" with the proper type 
+FAIL Document interface: window.document must inherit property "onvisibilitychange" with the proper type assert_inherits: property "onvisibilitychange" not found in prototype chain
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https-expected.txt
index 170486c..9e920f5 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https-expected.txt
@@ -15,20 +15,22 @@
 PASS PaymentRequest interface: attribute onshippingoptionchange 
 FAIL PaymentRequest must be primary interface of new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
 FAIL Stringification of new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
-FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "show" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
-FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "abort" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
-FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "canMakePayment" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
-FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "id" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
-FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "shippingAddress" with the proper type (4) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
-FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "shippingOption" with the proper type (5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
-FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "shippingType" with the proper type (6) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
-FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "onshippingaddresschange" with the proper type (7) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
-FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "onshippingoptionchange" with the proper type (8) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
+FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "show()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
+FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "abort()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
+FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "canMakePayment()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
+FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "id" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
+FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "shippingAddress" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
+FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "shippingOption" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
+FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "shippingType" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
+FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "onshippingaddresschange" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
+FAIL PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}}) must inherit property "onshippingoptionchange" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Failed to construct 'PaymentRequest': The provided value cannot be converted to a sequence."
 PASS PaymentAddress interface: existence and properties of interface object 
 PASS PaymentAddress interface object length 
 PASS PaymentAddress interface object name 
 PASS PaymentAddress interface: existence and properties of interface prototype object 
 PASS PaymentAddress interface: existence and properties of interface prototype object's "constructor" property 
+PASS PaymentAddress interface: operation toJSON() 
+FAIL Test default toJSON operation of PaymentAddress Illegal invocation
 PASS PaymentAddress interface: attribute country 
 PASS PaymentAddress interface: attribute addressLine 
 PASS PaymentAddress interface: attribute region 
@@ -45,6 +47,8 @@
 PASS PaymentResponse interface object name 
 PASS PaymentResponse interface: existence and properties of interface prototype object 
 PASS PaymentResponse interface: existence and properties of interface prototype object's "constructor" property 
+PASS PaymentResponse interface: operation toJSON() 
+FAIL Test default toJSON operation of PaymentResponse Illegal invocation
 PASS PaymentResponse interface: attribute requestId 
 PASS PaymentResponse interface: attribute methodName 
 PASS PaymentResponse interface: attribute details 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https.html b/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https.html
index bc76247..db70765 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https.html
@@ -12,112 +12,112 @@
 interface EventTarget {};
 </script>
 <script type=text/plain>
-[Constructor(sequence<PaymentMethodData> methodData, PaymentDetailsInit details, optional PaymentOptions options),
- SecureContext]
+[Constructor(sequence<PaymentMethodData> methodData, PaymentDetailsInit details, optional PaymentOptions options), SecureContext]
 interface PaymentRequest : EventTarget {
-    Promise<PaymentResponse> show();
-    Promise<void>            abort();
-    Promise<boolean>         canMakePayment();
+  Promise<PaymentResponse> show();
+  Promise<void> abort();
+  Promise<boolean> canMakePayment();
 
-    readonly attribute DOMString            id;
-    readonly attribute PaymentAddress?      shippingAddress;
-    readonly attribute DOMString?           shippingOption;
-    readonly attribute PaymentShippingType? shippingType;
+  readonly attribute DOMString id;
+  readonly attribute PaymentAddress? shippingAddress;
+  readonly attribute DOMString? shippingOption;
+  readonly attribute PaymentShippingType? shippingType;
 
-             attribute EventHandler         onshippingaddresschange;
+  attribute EventHandler onshippingaddresschange;
 
-             attribute EventHandler         onshippingoptionchange;
+  attribute EventHandler onshippingoptionchange;
 };
 dictionary PaymentMethodData {
-    required DOMString supportedMethods;
-             object    data;
+  required DOMString supportedMethods;
+  object data;
 };
 dictionary PaymentCurrencyAmount {
-    required DOMString currency;
-    required DOMString value;
-             DOMString currencySystem = "urn:iso:std:iso:4217";
+  required DOMString currency;
+  required DOMString value;
+  // Note: currencySystem is "at risk" of being removed!
+  DOMString currencySystem = "urn:iso:std:iso:4217";
 };
 dictionary PaymentDetailsBase {
-    sequence<PaymentItem>            displayItems;
-    sequence<PaymentShippingOption>  shippingOptions;
-    sequence<PaymentDetailsModifier> modifiers;
+  sequence<PaymentItem> displayItems;
+  sequence<PaymentShippingOption> shippingOptions;
+  sequence<PaymentDetailsModifier> modifiers;
 };
 dictionary PaymentDetailsInit : PaymentDetailsBase {
-             DOMString   id;
-    required PaymentItem total;
+  DOMString id;
+  required PaymentItem total;
 };
 dictionary PaymentDetailsUpdate : PaymentDetailsBase {
-    DOMString   error;
-    PaymentItem total;
+  DOMString error;
+  PaymentItem total;
 };
 dictionary PaymentDetailsModifier {
-    required DOMString             supportedMethods;
-             PaymentItem           total;
-             sequence<PaymentItem> additionalDisplayItems;
-             object                data;
+  required DOMString supportedMethods;
+  PaymentItem total;
+  sequence<PaymentItem> additionalDisplayItems;
+  object data;
 };
 enum PaymentShippingType {
-    "shipping",
-    "delivery",
-    "pickup"
+  "shipping",
+  "delivery",
+  "pickup"
 };
 dictionary PaymentOptions {
-    boolean             requestPayerName = false;
-    boolean             requestPayerEmail = false;
-    boolean             requestPayerPhone = false;
-    boolean             requestShipping = false;
-    PaymentShippingType shippingType = "shipping";
+  boolean requestPayerName = false;
+  boolean requestPayerEmail = false;
+  boolean requestPayerPhone = false;
+  boolean requestShipping = false;
+  PaymentShippingType shippingType = "shipping";
 };
 dictionary PaymentItem {
-    required DOMString             label;
-    required PaymentCurrencyAmount amount;
-             boolean               pending = false;
+  required DOMString label;
+  required PaymentCurrencyAmount amount;
+  boolean pending = false;
 };
 [SecureContext]
 interface PaymentAddress {
-    serializer = {attribute};
-    readonly attribute DOMString              country;
-    readonly attribute FrozenArray<DOMString> addressLine;
-    readonly attribute DOMString              region;
-    readonly attribute DOMString              city;
-    readonly attribute DOMString              dependentLocality;
-    readonly attribute DOMString              postalCode;
-    readonly attribute DOMString              sortingCode;
-    readonly attribute DOMString              languageCode;
-    readonly attribute DOMString              organization;
-    readonly attribute DOMString              recipient;
-    readonly attribute DOMString              phone;
+  [Default] object toJSON();
+  readonly attribute DOMString country;
+  readonly attribute FrozenArray<DOMString> addressLine;
+  readonly attribute DOMString region;
+  readonly attribute DOMString city;
+  readonly attribute DOMString dependentLocality;
+  readonly attribute DOMString postalCode;
+  readonly attribute DOMString sortingCode;
+  readonly attribute DOMString languageCode;
+  readonly attribute DOMString organization;
+  readonly attribute DOMString recipient;
+  readonly attribute DOMString phone;
 };
 dictionary PaymentShippingOption {
-    required DOMString             id;
-    required DOMString             label;
-    required PaymentCurrencyAmount amount;
-             boolean               selected = false;
+  required DOMString id;
+  required DOMString label;
+  required PaymentCurrencyAmount amount;
+  boolean selected = false;
 };
 enum PaymentComplete {
-    "fail",
-    "success",
-    "unknown"
+  "fail",
+  "success",
+  "unknown"
 };
 [SecureContext]
 interface PaymentResponse {
-    serializer = {attribute};
+  [Default] object toJSON();
 
-    readonly attribute DOMString       requestId;
-    readonly attribute DOMString       methodName;
-    readonly attribute object          details;
-    readonly attribute PaymentAddress? shippingAddress;
-    readonly attribute DOMString?      shippingOption;
-    readonly attribute DOMString?      payerName;
-    readonly attribute DOMString?      payerEmail;
-    readonly attribute DOMString?      payerPhone;
+  readonly attribute DOMString requestId;
+  readonly attribute DOMString methodName;
+  readonly attribute object details;
+  readonly attribute PaymentAddress? shippingAddress;
+  readonly attribute DOMString? shippingOption;
+  readonly attribute DOMString? payerName;
+  readonly attribute DOMString? payerEmail;
+  readonly attribute DOMString? payerPhone;
 
-    Promise<void> complete(optional PaymentComplete result = "unknown");
+  Promise<void> complete(optional PaymentComplete result = "unknown");
 };
 [Constructor(DOMString type, optional PaymentRequestUpdateEventInit eventInitDict),
- SecureContext]
+  SecureContext]
 interface PaymentRequestUpdateEvent : Event {
-    void updateWith(Promise<PaymentDetailsUpdate> detailsPromise);
+  void updateWith(Promise<PaymentDetailsUpdate> detailsPromise);
 };
 dictionary PaymentRequestUpdateEventInit : EventInit {
 };
diff --git a/third_party/WebKit/LayoutTests/external/wpt/performance-timeline/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/performance-timeline/idlharness-expected.txt
index 61a1522..76539705 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/performance-timeline/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/performance-timeline/idlharness-expected.txt
@@ -1,13 +1,13 @@
 This is a testharness.js-based test.
 PASS Performance interface: operation getEntries(PerformanceEntryFilterOptions) 
 PASS Performance interface: operation getEntriesByType(DOMString) 
-PASS Performance interface: operation getEntriesByName(DOMString,DOMString) 
-PASS Performance interface: window.performance must inherit property "getEntries" with the proper type (0) 
+PASS Performance interface: operation getEntriesByName(DOMString, DOMString) 
+PASS Performance interface: window.performance must inherit property "getEntries(PerformanceEntryFilterOptions)" with the proper type 
 PASS Performance interface: calling getEntries(PerformanceEntryFilterOptions) on window.performance with too few arguments must throw TypeError 
-PASS Performance interface: window.performance must inherit property "getEntriesByType" with the proper type (1) 
+PASS Performance interface: window.performance must inherit property "getEntriesByType(DOMString)" with the proper type 
 PASS Performance interface: calling getEntriesByType(DOMString) on window.performance with too few arguments must throw TypeError 
-PASS Performance interface: window.performance must inherit property "getEntriesByName" with the proper type (2) 
-PASS Performance interface: calling getEntriesByName(DOMString,DOMString) on window.performance with too few arguments must throw TypeError 
+PASS Performance interface: window.performance must inherit property "getEntriesByName(DOMString, DOMString)" with the proper type 
+PASS Performance interface: calling getEntriesByName(DOMString, DOMString) on window.performance with too few arguments must throw TypeError 
 PASS PerformanceEntry interface: existence and properties of interface object 
 PASS PerformanceEntry interface object length 
 PASS PerformanceEntry interface object name 
@@ -25,7 +25,7 @@
 PASS PerformanceObserverEntryList interface: existence and properties of interface prototype object's "constructor" property 
 PASS PerformanceObserverEntryList interface: operation getEntries(PerformanceEntryFilterOptions) 
 PASS PerformanceObserverEntryList interface: operation getEntriesByType(DOMString) 
-PASS PerformanceObserverEntryList interface: operation getEntriesByName(DOMString,DOMString) 
+PASS PerformanceObserverEntryList interface: operation getEntriesByName(DOMString, DOMString) 
 PASS PerformanceObserver interface: existence and properties of interface object 
 PASS PerformanceObserver interface object length 
 PASS PerformanceObserver interface object name 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/pointerlock/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/pointerlock/idlharness-expected.txt
index 3a47aae..50ba585 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/pointerlock/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/pointerlock/idlharness-expected.txt
@@ -1,19 +1,19 @@
 This is a testharness.js-based test.
 PASS Element interface: operation requestPointerLock() 
-PASS Element interface: window.document.documentElement must inherit property "requestPointerLock" with the proper type (0) 
+PASS Element interface: window.document.documentElement must inherit property "requestPointerLock()" with the proper type 
 PASS Document interface: attribute onpointerlockchange 
 PASS Document interface: attribute onpointerlockerror 
 PASS Document interface: attribute pointerLockElement 
 PASS Document interface: operation exitPointerLock() 
-FAIL Document interface: window.document must inherit property "onpointerlockchange" with the proper type (0) Unrecognized type EventHandler
-FAIL Document interface: window.document must inherit property "onpointerlockerror" with the proper type (1) Unrecognized type EventHandler
-PASS Document interface: window.document must inherit property "pointerLockElement" with the proper type (2) 
-PASS Document interface: window.document must inherit property "exitPointerLock" with the proper type (3) 
+FAIL Document interface: window.document must inherit property "onpointerlockchange" with the proper type Unrecognized type EventHandler
+FAIL Document interface: window.document must inherit property "onpointerlockerror" with the proper type Unrecognized type EventHandler
+PASS Document interface: window.document must inherit property "pointerLockElement" with the proper type 
+PASS Document interface: window.document must inherit property "exitPointerLock()" with the proper type 
 PASS MouseEvent interface: attribute movementX 
 PASS MouseEvent interface: attribute movementY 
-PASS MouseEvent interface: new MouseEvent('mousemove') must inherit property "movementX" with the proper type (0) 
-PASS MouseEvent interface: new MouseEvent('mousemove') must inherit property "movementY" with the proper type (1) 
-PASS MouseEvent interface: new MouseEvent('pointerlockchange') must inherit property "movementX" with the proper type (0) 
-PASS MouseEvent interface: new MouseEvent('pointerlockchange') must inherit property "movementY" with the proper type (1) 
+PASS MouseEvent interface: new MouseEvent('mousemove') must inherit property "movementX" with the proper type 
+PASS MouseEvent interface: new MouseEvent('mousemove') must inherit property "movementY" with the proper type 
+PASS MouseEvent interface: new MouseEvent('pointerlockchange') must inherit property "movementX" with the proper type 
+PASS MouseEvent interface: new MouseEvent('pointerlockchange') must inherit property "movementY" with the proper type 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resource-timing/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/resource-timing/idlharness-expected.txt
index 451d5a9..a3a616b 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/resource-timing/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/resource-timing/idlharness-expected.txt
@@ -2,10 +2,10 @@
 PASS Performance interface: operation clearResourceTimings() 
 PASS Performance interface: operation setResourceTimingBufferSize(unsigned long) 
 PASS Performance interface: attribute onresourcetimingbufferfull 
-PASS Performance interface: window.performance must inherit property "clearResourceTimings" with the proper type (3) 
-PASS Performance interface: window.performance must inherit property "setResourceTimingBufferSize" with the proper type (4) 
+PASS Performance interface: window.performance must inherit property "clearResourceTimings()" with the proper type 
+PASS Performance interface: window.performance must inherit property "setResourceTimingBufferSize(unsigned long)" with the proper type 
 PASS Performance interface: calling setResourceTimingBufferSize(unsigned long) on window.performance with too few arguments must throw TypeError 
-PASS Performance interface: window.performance must inherit property "onresourcetimingbufferfull" with the proper type (5) 
+PASS Performance interface: window.performance must inherit property "onresourcetimingbufferfull" with the proper type 
 PASS PerformanceResourceTiming interface: existence and properties of interface object 
 PASS PerformanceResourceTiming interface object length 
 PASS PerformanceResourceTiming interface object name 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js b/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js
index d12748f..adaef20 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js
@@ -1687,7 +1687,7 @@
 {
     var a_test = async_test(this.name + " interface: operation " + member.name +
                             "(" + member.arguments.map(
-                                function(m) {return m.idlType.idlType; } )
+                                function(m) {return m.idlType.idlType; } ).join(", ")
                             +")");
     a_test.step(function()
     {
@@ -2182,6 +2182,11 @@
         || member.type == "operation")
         && member.name)
         {
+            var described_name = member.name;
+            if (member.type == "operation")
+            {
+                described_name += "(" + member.arguments.map(arg => arg.idlType.idlType).join(", ") + ")";
+            }
             test(function()
             {
                 assert_equals(exception, null, "Unexpected exception when evaluating object");
@@ -2221,7 +2226,7 @@
                         assert_equals(typeof obj[member.name], "function");
                     }
                 }
-            }.bind(this), this.name + " interface: " + desc + ' must inherit property "' + member.name + '" with the proper type (' + i + ')');
+            }.bind(this), this.name + " interface: " + desc + ' must inherit property "' + described_name + '" with the proper type');
         }
         // TODO: This is wrong if there are multiple operations with the same
         // identifier.
@@ -2229,7 +2234,7 @@
         if (member.type == "operation" && member.name && member.arguments.length)
         {
             var a_test = async_test( this.name + " interface: calling " + member.name +
-            "(" + member.arguments.map(function(m) { return m.idlType.idlType; }) +
+            "(" + member.arguments.map(function(m) { return m.idlType.idlType; }).join(", ") +
             ") on " + desc + " with too few arguments must throw TypeError");
             a_test.step(function()
             {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/server-timing/test_server_timing.html b/third_party/WebKit/LayoutTests/external/wpt/server-timing/test_server_timing.html
index 43164d69..6a6c8977 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/server-timing/test_server_timing.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/server-timing/test_server_timing.html
@@ -11,21 +11,21 @@
       window.addEventListener('load', function() {
         // there should be exactly two server-timing entries, 1 for document, 1 for img#one
         test_entries(performance.getEntriesByType('navigation')[0].serverTiming, [{
-          value: 1.2,
-          metric: 'metric1',
+          duration: 1.2,
+          name: 'metric1',
           description: 'document',
         }])
         test_entries(performance.getEntriesByName(document.querySelector('img#one').src)[0].serverTiming, [{
-          value: 3.4,
-          metric: 'metric2',
+          duration: 3.4,
+          name: 'metric2',
           description: 'blue.png',
         }])
 
         new PerformanceObserver(function(entryList, observer) {
           // there should be exactly one server-timing entry, 1 for img#two
           test_entries(entryList.getEntriesByName(document.querySelector('img#two').src)[0].serverTiming, [{
-            value: 5.6,
-            metric: 'metric3',
+            duration: 5.6,
+            name: 'metric3',
             description: 'green.png',
           }])
           observer.disconnect()
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
index 7970a4e..b92d7aa 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -30,15 +30,15 @@
 PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true 
 PASS ServiceWorkerGlobalScope must be primary interface of self 
 PASS Stringification of self 
-PASS ServiceWorkerGlobalScope interface: self must inherit property "clients" with the proper type (0) 
-PASS ServiceWorkerGlobalScope interface: self must inherit property "registration" with the proper type (1) 
-PASS ServiceWorkerGlobalScope interface: self must inherit property "skipWaiting" with the proper type (2) 
-PASS ServiceWorkerGlobalScope interface: self must inherit property "oninstall" with the proper type (3) 
-PASS ServiceWorkerGlobalScope interface: self must inherit property "onactivate" with the proper type (4) 
-PASS ServiceWorkerGlobalScope interface: self must inherit property "onfetch" with the proper type (5) 
-PASS ServiceWorkerGlobalScope interface: self must inherit property "onforeignfetch" with the proper type (6) 
-PASS ServiceWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type (7) 
-FAIL ServiceWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type (8) assert_own_property: expected property "onmessageerror" missing
+PASS ServiceWorkerGlobalScope interface: self must inherit property "clients" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "registration" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "skipWaiting()" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "oninstall" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onactivate" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onfetch" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onforeignfetch" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type 
+FAIL ServiceWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type assert_own_property: expected property "onmessageerror" missing
 PASS Client interface: existence and properties of interface object 
 PASS Client interface object length 
 PASS Client interface object name 
@@ -48,7 +48,7 @@
 PASS Client interface: attribute id 
 PASS Client interface: attribute type 
 FAIL Client interface: attribute reserved assert_true: The prototype object must have a property "reserved" expected true got false
-PASS Client interface: operation postMessage(any,[object Object]) 
+PASS Client interface: operation postMessage(any, [object Object]) 
 PASS WindowClient interface: existence and properties of interface object 
 PASS WindowClient interface object length 
 PASS WindowClient interface object name 
@@ -70,13 +70,13 @@
 PASS Clients interface: operation claim() 
 PASS Clients must be primary interface of self.clients 
 PASS Stringification of self.clients 
-PASS Clients interface: self.clients must inherit property "get" with the proper type (0) 
+PASS Clients interface: self.clients must inherit property "get(DOMString)" with the proper type 
 PASS Clients interface: calling get(DOMString) on self.clients with too few arguments must throw TypeError 
-PASS Clients interface: self.clients must inherit property "matchAll" with the proper type (1) 
+PASS Clients interface: self.clients must inherit property "matchAll(ClientQueryOptions)" with the proper type 
 PASS Clients interface: calling matchAll(ClientQueryOptions) on self.clients with too few arguments must throw TypeError 
-PASS Clients interface: self.clients must inherit property "openWindow" with the proper type (2) 
+PASS Clients interface: self.clients must inherit property "openWindow(USVString)" with the proper type 
 PASS Clients interface: calling openWindow(USVString) on self.clients with too few arguments must throw TypeError 
-PASS Clients interface: self.clients must inherit property "claim" with the proper type (3) 
+PASS Clients interface: self.clients must inherit property "claim()" with the proper type 
 FAIL ServiceWorker interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
 FAIL ServiceWorker interface object length assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
 FAIL ServiceWorker interface object name assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
@@ -84,7 +84,7 @@
 FAIL ServiceWorker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
 FAIL ServiceWorker interface: attribute scriptURL assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
 FAIL ServiceWorker interface: attribute state assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
-FAIL ServiceWorker interface: operation postMessage(any,[object Object]) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: operation postMessage(any, [object Object]) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
 FAIL ServiceWorker interface: attribute onstatechange assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
 PASS ServiceWorkerRegistration interface: existence and properties of interface object 
 PASS ServiceWorkerRegistration interface object length 
@@ -102,28 +102,28 @@
 PASS ServiceWorkerRegistration interface: attribute onupdatefound 
 PASS ServiceWorkerRegistration must be primary interface of self.registration 
 PASS Stringification of self.registration 
-PASS ServiceWorkerRegistration interface: self.registration must inherit property "installing" with the proper type (0) 
-PASS ServiceWorkerRegistration interface: self.registration must inherit property "waiting" with the proper type (1) 
-PASS ServiceWorkerRegistration interface: self.registration must inherit property "active" with the proper type (2) 
-PASS ServiceWorkerRegistration interface: self.registration must inherit property "navigationPreload" with the proper type (3) 
-PASS ServiceWorkerRegistration interface: self.registration must inherit property "scope" with the proper type (4) 
-FAIL ServiceWorkerRegistration interface: self.registration must inherit property "updateViaCache" with the proper type (5) assert_inherits: property "updateViaCache" not found in prototype chain
-PASS ServiceWorkerRegistration interface: self.registration must inherit property "update" with the proper type (6) 
-PASS ServiceWorkerRegistration interface: self.registration must inherit property "unregister" with the proper type (7) 
-PASS ServiceWorkerRegistration interface: self.registration must inherit property "onupdatefound" with the proper type (8) 
-PASS EventTarget interface: self.registration must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on self.registration with too few arguments must throw TypeError 
-PASS EventTarget interface: self.registration must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on self.registration with too few arguments must throw TypeError 
-PASS EventTarget interface: self.registration must inherit property "dispatchEvent" with the proper type (2) 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "installing" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "waiting" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "active" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "navigationPreload" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "scope" with the proper type 
+FAIL ServiceWorkerRegistration interface: self.registration must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "update()" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "unregister()" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "onupdatefound" with the proper type 
+PASS EventTarget interface: self.registration must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError 
+PASS EventTarget interface: self.registration must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError 
+PASS EventTarget interface: self.registration must inherit property "dispatchEvent(Event)" with the proper type 
 PASS EventTarget interface: calling dispatchEvent(Event) on self.registration 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 
 PASS EventTarget interface: existence and properties of interface prototype object 
 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 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 NavigationPreloadManager interface: existence and properties of interface object 
 PASS NavigationPreloadManager interface object length 
@@ -139,49 +139,49 @@
 PASS Cache interface object name 
 PASS Cache interface: existence and properties of interface prototype object 
 PASS Cache interface: existence and properties of interface prototype object's "constructor" property 
-PASS Cache interface: operation match(RequestInfo,CacheQueryOptions) 
-PASS Cache interface: operation matchAll(RequestInfo,CacheQueryOptions) 
+PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) 
 PASS Cache interface: operation add(RequestInfo) 
 PASS Cache interface: operation addAll([object Object]) 
-PASS Cache interface: operation put(RequestInfo,Response) 
-PASS Cache interface: operation delete(RequestInfo,CacheQueryOptions) 
-PASS Cache interface: operation keys(RequestInfo,CacheQueryOptions) 
+PASS Cache interface: operation put(RequestInfo, Response) 
+PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) 
 PASS Cache must be primary interface of self.cacheInstance 
 PASS Stringification of self.cacheInstance 
-PASS Cache interface: self.cacheInstance must inherit property "match" with the proper type (0) 
-PASS Cache interface: calling match(RequestInfo,CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
-PASS Cache interface: self.cacheInstance must inherit property "matchAll" with the proper type (1) 
-PASS Cache interface: calling matchAll(RequestInfo,CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
-PASS Cache interface: self.cacheInstance must inherit property "add" with the proper type (2) 
+PASS Cache interface: self.cacheInstance must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling match(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "matchAll(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling matchAll(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "add(RequestInfo)" with the proper type 
 PASS Cache interface: calling add(RequestInfo) on self.cacheInstance with too few arguments must throw TypeError 
-PASS Cache interface: self.cacheInstance must inherit property "addAll" with the proper type (3) 
+PASS Cache interface: self.cacheInstance must inherit property "addAll([object Object])" with the proper type 
 PASS Cache interface: calling addAll([object Object]) on self.cacheInstance with too few arguments must throw TypeError 
-PASS Cache interface: self.cacheInstance must inherit property "put" with the proper type (4) 
-PASS Cache interface: calling put(RequestInfo,Response) on self.cacheInstance with too few arguments must throw TypeError 
-PASS Cache interface: self.cacheInstance must inherit property "delete" with the proper type (5) 
-PASS Cache interface: calling delete(RequestInfo,CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
-PASS Cache interface: self.cacheInstance must inherit property "keys" with the proper type (6) 
-PASS Cache interface: calling keys(RequestInfo,CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "put(RequestInfo, Response)" with the proper type 
+PASS Cache interface: calling put(RequestInfo, Response) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "delete(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling delete(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "keys(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling keys(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
 PASS CacheStorage interface: existence and properties of interface object 
 PASS CacheStorage interface object length 
 PASS CacheStorage interface object name 
 PASS CacheStorage interface: existence and properties of interface prototype object 
 PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property 
-PASS CacheStorage interface: operation match(RequestInfo,CacheQueryOptions) 
+PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) 
 PASS CacheStorage interface: operation has(DOMString) 
 PASS CacheStorage interface: operation open(DOMString) 
 PASS CacheStorage interface: operation delete(DOMString) 
 PASS CacheStorage interface: operation keys() 
 PASS CacheStorage must be primary interface of self.caches 
 PASS Stringification of self.caches 
-PASS CacheStorage interface: self.caches must inherit property "match" with the proper type (0) 
-PASS CacheStorage interface: calling match(RequestInfo,CacheQueryOptions) on self.caches with too few arguments must throw TypeError 
-PASS CacheStorage interface: self.caches must inherit property "has" with the proper type (1) 
+PASS CacheStorage interface: self.caches must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS CacheStorage interface: calling match(RequestInfo, CacheQueryOptions) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "has(DOMString)" with the proper type 
 PASS CacheStorage interface: calling has(DOMString) on self.caches with too few arguments must throw TypeError 
-PASS CacheStorage interface: self.caches must inherit property "open" with the proper type (2) 
+PASS CacheStorage interface: self.caches must inherit property "open(DOMString)" with the proper type 
 PASS CacheStorage interface: calling open(DOMString) on self.caches with too few arguments must throw TypeError 
-PASS CacheStorage interface: self.caches must inherit property "delete" with the proper type (3) 
+PASS CacheStorage interface: self.caches must inherit property "delete(DOMString)" with the proper type 
 PASS CacheStorage interface: calling delete(DOMString) on self.caches with too few arguments must throw TypeError 
-PASS CacheStorage interface: self.caches must inherit property "keys" with the proper type (4) 
+PASS CacheStorage interface: self.caches must inherit property "keys()" with the proper type 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
index 02fed36..c9f3ca90 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
@@ -12,20 +12,20 @@
 PASS ServiceWorker interface: existence and properties of interface prototype object's "constructor" property 
 PASS ServiceWorker interface: attribute scriptURL 
 PASS ServiceWorker interface: attribute state 
-PASS ServiceWorker interface: operation postMessage(any,[object Object]) 
+PASS ServiceWorker interface: operation postMessage(any, [object Object]) 
 PASS ServiceWorker interface: attribute onstatechange 
 PASS ServiceWorker must be primary interface of window.registrationInstance.installing 
 PASS Stringification of window.registrationInstance.installing 
-PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "scriptURL" with the proper type (0) 
-PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "state" with the proper type (1) 
-PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "postMessage" with the proper type (2) 
-PASS ServiceWorker interface: calling postMessage(any,[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
-PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "onstatechange" with the proper type (3) 
-PASS EventTarget interface: window.registrationInstance.installing must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
-PASS EventTarget interface: window.registrationInstance.installing must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
-PASS EventTarget interface: window.registrationInstance.installing must inherit property "dispatchEvent" with the proper type (2) 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "scriptURL" with the proper type 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "state" with the proper type 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "postMessage(any, [object Object])" with the proper type 
+PASS ServiceWorker interface: calling postMessage(any, [object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "onstatechange" with the proper type 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "dispatchEvent(Event)" with the proper type 
 PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance.installing with too few arguments must throw TypeError 
 PASS ServiceWorkerRegistration interface: existence and properties of interface object 
 PASS ServiceWorkerRegistration interface object length 
@@ -43,28 +43,28 @@
 PASS ServiceWorkerRegistration interface: attribute onupdatefound 
 PASS ServiceWorkerRegistration must be primary interface of window.registrationInstance 
 PASS Stringification of window.registrationInstance 
-PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "installing" with the proper type (0) 
-PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "waiting" with the proper type (1) 
-PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "active" with the proper type (2) 
-PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "navigationPreload" with the proper type (3) 
-PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "scope" with the proper type (4) 
-FAIL ServiceWorkerRegistration interface: window.registrationInstance must inherit property "updateViaCache" with the proper type (5) assert_inherits: property "updateViaCache" not found in prototype chain
-PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "update" with the proper type (6) 
-PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "unregister" with the proper type (7) 
-PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "onupdatefound" with the proper type (8) 
-PASS EventTarget interface: window.registrationInstance must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError 
-PASS EventTarget interface: window.registrationInstance must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError 
-PASS EventTarget interface: window.registrationInstance must inherit property "dispatchEvent" with the proper type (2) 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "installing" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "waiting" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "active" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "navigationPreload" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "scope" with the proper type 
+FAIL ServiceWorkerRegistration interface: window.registrationInstance must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "update()" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "unregister()" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "onupdatefound" with the proper type 
+PASS EventTarget interface: window.registrationInstance must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance must inherit property "dispatchEvent(Event)" with the proper type 
 PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance 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 
 PASS EventTarget interface: existence and properties of interface prototype object 
 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 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 NavigationPreloadManager interface: existence and properties of interface object 
 PASS NavigationPreloadManager interface object length 
@@ -80,19 +80,19 @@
 PASS Cache interface object name 
 PASS Cache interface: existence and properties of interface prototype object 
 PASS Cache interface: existence and properties of interface prototype object's "constructor" property 
-PASS Cache interface: operation match(RequestInfo,CacheQueryOptions) 
-PASS Cache interface: operation matchAll(RequestInfo,CacheQueryOptions) 
+PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) 
 PASS Cache interface: operation add(RequestInfo) 
 PASS Cache interface: operation addAll([object Object]) 
-PASS Cache interface: operation put(RequestInfo,Response) 
-PASS Cache interface: operation delete(RequestInfo,CacheQueryOptions) 
-PASS Cache interface: operation keys(RequestInfo,CacheQueryOptions) 
+PASS Cache interface: operation put(RequestInfo, Response) 
+PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) 
 PASS CacheStorage interface: existence and properties of interface object 
 PASS CacheStorage interface object length 
 PASS CacheStorage interface object name 
 PASS CacheStorage interface: existence and properties of interface prototype object 
 PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property 
-PASS CacheStorage interface: operation match(RequestInfo,CacheQueryOptions) 
+PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) 
 PASS CacheStorage interface: operation has(DOMString) 
 PASS CacheStorage interface: operation open(DOMString) 
 PASS CacheStorage interface: operation delete(DOMString) 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/svg/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/svg/interfaces-expected.txt
index d691a5a0..d077ff5cde 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/svg/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/svg/interfaces-expected.txt
@@ -42,7 +42,7 @@
 PASS SVGNumber interface: attribute value 
 PASS SVGNumber must be primary interface of svg.createSVGNumber() 
 PASS Stringification of svg.createSVGNumber() 
-PASS SVGNumber interface: svg.createSVGNumber() must inherit property "value" with the proper type (0) 
+PASS SVGNumber interface: svg.createSVGNumber() must inherit property "value" with the proper type 
 PASS SVGLength interface: existence and properties of interface object 
 PASS SVGLength interface object length 
 PASS SVGLength interface object name 
@@ -74,28 +74,28 @@
 PASS SVGLength interface: attribute value 
 PASS SVGLength interface: attribute valueInSpecifiedUnits 
 PASS SVGLength interface: attribute valueAsString 
-PASS SVGLength interface: operation newValueSpecifiedUnits(unsigned short,float) 
+PASS SVGLength interface: operation newValueSpecifiedUnits(unsigned short, float) 
 PASS SVGLength interface: operation convertToSpecifiedUnits(unsigned short) 
 PASS SVGLength must be primary interface of svg.createSVGLength() 
 PASS Stringification of svg.createSVGLength() 
-PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_UNKNOWN" with the proper type (0) 
-PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_NUMBER" with the proper type (1) 
-PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PERCENTAGE" with the proper type (2) 
-PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_EMS" with the proper type (3) 
-PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_EXS" with the proper type (4) 
-PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PX" with the proper type (5) 
-PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_CM" with the proper type (6) 
-PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_MM" with the proper type (7) 
-PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_IN" with the proper type (8) 
-PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PT" with the proper type (9) 
-PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PC" with the proper type (10) 
-PASS SVGLength interface: svg.createSVGLength() must inherit property "unitType" with the proper type (11) 
-PASS SVGLength interface: svg.createSVGLength() must inherit property "value" with the proper type (12) 
-PASS SVGLength interface: svg.createSVGLength() must inherit property "valueInSpecifiedUnits" with the proper type (13) 
-PASS SVGLength interface: svg.createSVGLength() must inherit property "valueAsString" with the proper type (14) 
-PASS SVGLength interface: svg.createSVGLength() must inherit property "newValueSpecifiedUnits" with the proper type (15) 
-PASS SVGLength interface: calling newValueSpecifiedUnits(unsigned short,float) on svg.createSVGLength() with too few arguments must throw TypeError 
-PASS SVGLength interface: svg.createSVGLength() must inherit property "convertToSpecifiedUnits" with the proper type (16) 
+PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_UNKNOWN" with the proper type 
+PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_NUMBER" with the proper type 
+PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PERCENTAGE" with the proper type 
+PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_EMS" with the proper type 
+PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_EXS" with the proper type 
+PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PX" with the proper type 
+PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_CM" with the proper type 
+PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_MM" with the proper type 
+PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_IN" with the proper type 
+PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PT" with the proper type 
+PASS SVGLength interface: svg.createSVGLength() must inherit property "SVG_LENGTHTYPE_PC" with the proper type 
+PASS SVGLength interface: svg.createSVGLength() must inherit property "unitType" with the proper type 
+PASS SVGLength interface: svg.createSVGLength() must inherit property "value" with the proper type 
+PASS SVGLength interface: svg.createSVGLength() must inherit property "valueInSpecifiedUnits" with the proper type 
+PASS SVGLength interface: svg.createSVGLength() must inherit property "valueAsString" with the proper type 
+PASS SVGLength interface: svg.createSVGLength() must inherit property "newValueSpecifiedUnits(unsigned short, float)" with the proper type 
+PASS SVGLength interface: calling newValueSpecifiedUnits(unsigned short, float) on svg.createSVGLength() with too few arguments must throw TypeError 
+PASS SVGLength interface: svg.createSVGLength() must inherit property "convertToSpecifiedUnits(unsigned short)" with the proper type 
 PASS SVGLength interface: calling convertToSpecifiedUnits(unsigned short) on svg.createSVGLength() with too few arguments must throw TypeError 
 PASS SVGAngle interface: existence and properties of interface object 
 PASS SVGAngle interface object length 
@@ -116,22 +116,22 @@
 PASS SVGAngle interface: attribute value 
 PASS SVGAngle interface: attribute valueInSpecifiedUnits 
 PASS SVGAngle interface: attribute valueAsString 
-PASS SVGAngle interface: operation newValueSpecifiedUnits(unsigned short,float) 
+PASS SVGAngle interface: operation newValueSpecifiedUnits(unsigned short, float) 
 PASS SVGAngle interface: operation convertToSpecifiedUnits(unsigned short) 
 PASS SVGAngle must be primary interface of svg.createSVGAngle() 
 PASS Stringification of svg.createSVGAngle() 
-PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_UNKNOWN" with the proper type (0) 
-PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_UNSPECIFIED" with the proper type (1) 
-PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_DEG" with the proper type (2) 
-PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_RAD" with the proper type (3) 
-PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_GRAD" with the proper type (4) 
-PASS SVGAngle interface: svg.createSVGAngle() must inherit property "unitType" with the proper type (5) 
-PASS SVGAngle interface: svg.createSVGAngle() must inherit property "value" with the proper type (6) 
-PASS SVGAngle interface: svg.createSVGAngle() must inherit property "valueInSpecifiedUnits" with the proper type (7) 
-PASS SVGAngle interface: svg.createSVGAngle() must inherit property "valueAsString" with the proper type (8) 
-PASS SVGAngle interface: svg.createSVGAngle() must inherit property "newValueSpecifiedUnits" with the proper type (9) 
-PASS SVGAngle interface: calling newValueSpecifiedUnits(unsigned short,float) on svg.createSVGAngle() with too few arguments must throw TypeError 
-PASS SVGAngle interface: svg.createSVGAngle() must inherit property "convertToSpecifiedUnits" with the proper type (10) 
+PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_UNKNOWN" with the proper type 
+PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_UNSPECIFIED" with the proper type 
+PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_DEG" with the proper type 
+PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_RAD" with the proper type 
+PASS SVGAngle interface: svg.createSVGAngle() must inherit property "SVG_ANGLETYPE_GRAD" with the proper type 
+PASS SVGAngle interface: svg.createSVGAngle() must inherit property "unitType" with the proper type 
+PASS SVGAngle interface: svg.createSVGAngle() must inherit property "value" with the proper type 
+PASS SVGAngle interface: svg.createSVGAngle() must inherit property "valueInSpecifiedUnits" with the proper type 
+PASS SVGAngle interface: svg.createSVGAngle() must inherit property "valueAsString" with the proper type 
+PASS SVGAngle interface: svg.createSVGAngle() must inherit property "newValueSpecifiedUnits(unsigned short, float)" with the proper type 
+PASS SVGAngle interface: calling newValueSpecifiedUnits(unsigned short, float) on svg.createSVGAngle() with too few arguments must throw TypeError 
+PASS SVGAngle interface: svg.createSVGAngle() must inherit property "convertToSpecifiedUnits(unsigned short)" with the proper type 
 PASS SVGAngle interface: calling convertToSpecifiedUnits(unsigned short) on svg.createSVGAngle() with too few arguments must throw TypeError 
 PASS SVGNumberList interface: existence and properties of interface object 
 PASS SVGNumberList interface object length 
@@ -143,26 +143,26 @@
 PASS SVGNumberList interface: operation clear() 
 PASS SVGNumberList interface: operation initialize(SVGNumber) 
 PASS SVGNumberList interface: operation getItem(unsigned long) 
-PASS SVGNumberList interface: operation insertItemBefore(SVGNumber,unsigned long) 
-PASS SVGNumberList interface: operation replaceItem(SVGNumber,unsigned long) 
+PASS SVGNumberList interface: operation insertItemBefore(SVGNumber, unsigned long) 
+PASS SVGNumberList interface: operation replaceItem(SVGNumber, unsigned long) 
 PASS SVGNumberList interface: operation removeItem(unsigned long) 
 PASS SVGNumberList interface: operation appendItem(SVGNumber) 
 PASS SVGNumberList must be primary interface of text.rotate.baseVal 
 PASS Stringification of text.rotate.baseVal 
-PASS SVGNumberList interface: text.rotate.baseVal must inherit property "length" with the proper type (0) 
-PASS SVGNumberList interface: text.rotate.baseVal must inherit property "numberOfItems" with the proper type (1) 
-PASS SVGNumberList interface: text.rotate.baseVal must inherit property "clear" with the proper type (2) 
-PASS SVGNumberList interface: text.rotate.baseVal must inherit property "initialize" with the proper type (3) 
+PASS SVGNumberList interface: text.rotate.baseVal must inherit property "length" with the proper type 
+PASS SVGNumberList interface: text.rotate.baseVal must inherit property "numberOfItems" with the proper type 
+PASS SVGNumberList interface: text.rotate.baseVal must inherit property "clear()" with the proper type 
+PASS SVGNumberList interface: text.rotate.baseVal must inherit property "initialize(SVGNumber)" with the proper type 
 PASS SVGNumberList interface: calling initialize(SVGNumber) on text.rotate.baseVal with too few arguments must throw TypeError 
-PASS SVGNumberList interface: text.rotate.baseVal must inherit property "getItem" with the proper type (4) 
+PASS SVGNumberList interface: text.rotate.baseVal must inherit property "getItem(unsigned long)" with the proper type 
 PASS SVGNumberList interface: calling getItem(unsigned long) on text.rotate.baseVal with too few arguments must throw TypeError 
-PASS SVGNumberList interface: text.rotate.baseVal must inherit property "insertItemBefore" with the proper type (5) 
-PASS SVGNumberList interface: calling insertItemBefore(SVGNumber,unsigned long) on text.rotate.baseVal with too few arguments must throw TypeError 
-PASS SVGNumberList interface: text.rotate.baseVal must inherit property "replaceItem" with the proper type (6) 
-PASS SVGNumberList interface: calling replaceItem(SVGNumber,unsigned long) on text.rotate.baseVal with too few arguments must throw TypeError 
-PASS SVGNumberList interface: text.rotate.baseVal must inherit property "removeItem" with the proper type (7) 
+PASS SVGNumberList interface: text.rotate.baseVal must inherit property "insertItemBefore(SVGNumber, unsigned long)" with the proper type 
+PASS SVGNumberList interface: calling insertItemBefore(SVGNumber, unsigned long) on text.rotate.baseVal with too few arguments must throw TypeError 
+PASS SVGNumberList interface: text.rotate.baseVal must inherit property "replaceItem(SVGNumber, unsigned long)" with the proper type 
+PASS SVGNumberList interface: calling replaceItem(SVGNumber, unsigned long) on text.rotate.baseVal with too few arguments must throw TypeError 
+PASS SVGNumberList interface: text.rotate.baseVal must inherit property "removeItem(unsigned long)" with the proper type 
 PASS SVGNumberList interface: calling removeItem(unsigned long) on text.rotate.baseVal with too few arguments must throw TypeError 
-PASS SVGNumberList interface: text.rotate.baseVal must inherit property "appendItem" with the proper type (8) 
+PASS SVGNumberList interface: text.rotate.baseVal must inherit property "appendItem(SVGNumber)" with the proper type 
 PASS SVGNumberList interface: calling appendItem(SVGNumber) on text.rotate.baseVal with too few arguments must throw TypeError 
 PASS SVGLengthList interface: existence and properties of interface object 
 PASS SVGLengthList interface object length 
@@ -174,8 +174,8 @@
 PASS SVGLengthList interface: operation clear() 
 PASS SVGLengthList interface: operation initialize(SVGLength) 
 PASS SVGLengthList interface: operation getItem(unsigned long) 
-PASS SVGLengthList interface: operation insertItemBefore(SVGLength,unsigned long) 
-PASS SVGLengthList interface: operation replaceItem(SVGLength,unsigned long) 
+PASS SVGLengthList interface: operation insertItemBefore(SVGLength, unsigned long) 
+PASS SVGLengthList interface: operation replaceItem(SVGLength, unsigned long) 
 PASS SVGLengthList interface: operation removeItem(unsigned long) 
 PASS SVGLengthList interface: operation appendItem(SVGLength) 
 PASS SVGAnimatedBoolean interface: existence and properties of interface object 
@@ -187,8 +187,8 @@
 PASS SVGAnimatedBoolean interface: attribute animVal 
 PASS SVGAnimatedBoolean must be primary interface of feConvolveMatrix.preserveAlpha 
 PASS Stringification of feConvolveMatrix.preserveAlpha 
-PASS SVGAnimatedBoolean interface: feConvolveMatrix.preserveAlpha must inherit property "baseVal" with the proper type (0) 
-PASS SVGAnimatedBoolean interface: feConvolveMatrix.preserveAlpha must inherit property "animVal" with the proper type (1) 
+PASS SVGAnimatedBoolean interface: feConvolveMatrix.preserveAlpha must inherit property "baseVal" with the proper type 
+PASS SVGAnimatedBoolean interface: feConvolveMatrix.preserveAlpha must inherit property "animVal" with the proper type 
 PASS SVGAnimatedEnumeration interface: existence and properties of interface object 
 PASS SVGAnimatedEnumeration interface object length 
 PASS SVGAnimatedEnumeration interface object name 
@@ -198,8 +198,8 @@
 PASS SVGAnimatedEnumeration interface: attribute animVal 
 PASS SVGAnimatedEnumeration must be primary interface of text.lengthAdjust 
 PASS Stringification of text.lengthAdjust 
-PASS SVGAnimatedEnumeration interface: text.lengthAdjust must inherit property "baseVal" with the proper type (0) 
-PASS SVGAnimatedEnumeration interface: text.lengthAdjust must inherit property "animVal" with the proper type (1) 
+PASS SVGAnimatedEnumeration interface: text.lengthAdjust must inherit property "baseVal" with the proper type 
+PASS SVGAnimatedEnumeration interface: text.lengthAdjust must inherit property "animVal" with the proper type 
 PASS SVGAnimatedInteger interface: existence and properties of interface object 
 PASS SVGAnimatedInteger interface object length 
 PASS SVGAnimatedInteger interface object name 
@@ -209,8 +209,8 @@
 PASS SVGAnimatedInteger interface: attribute animVal 
 PASS SVGAnimatedInteger must be primary interface of feConvolveMatrix.orderX 
 PASS Stringification of feConvolveMatrix.orderX 
-PASS SVGAnimatedInteger interface: feConvolveMatrix.orderX must inherit property "baseVal" with the proper type (0) 
-PASS SVGAnimatedInteger interface: feConvolveMatrix.orderX must inherit property "animVal" with the proper type (1) 
+PASS SVGAnimatedInteger interface: feConvolveMatrix.orderX must inherit property "baseVal" with the proper type 
+PASS SVGAnimatedInteger interface: feConvolveMatrix.orderX must inherit property "animVal" with the proper type 
 PASS SVGAnimatedNumber interface: existence and properties of interface object 
 PASS SVGAnimatedNumber interface object length 
 PASS SVGAnimatedNumber interface object name 
@@ -220,8 +220,8 @@
 PASS SVGAnimatedNumber interface: attribute animVal 
 PASS SVGAnimatedNumber must be primary interface of stop.offset 
 PASS Stringification of stop.offset 
-PASS SVGAnimatedNumber interface: stop.offset must inherit property "baseVal" with the proper type (0) 
-PASS SVGAnimatedNumber interface: stop.offset must inherit property "animVal" with the proper type (1) 
+PASS SVGAnimatedNumber interface: stop.offset must inherit property "baseVal" with the proper type 
+PASS SVGAnimatedNumber interface: stop.offset must inherit property "animVal" with the proper type 
 PASS SVGAnimatedLength interface: existence and properties of interface object 
 PASS SVGAnimatedLength interface object length 
 PASS SVGAnimatedLength interface object name 
@@ -231,8 +231,8 @@
 PASS SVGAnimatedLength interface: attribute animVal 
 PASS SVGAnimatedLength must be primary interface of svg.x 
 PASS Stringification of svg.x 
-PASS SVGAnimatedLength interface: svg.x must inherit property "baseVal" with the proper type (0) 
-PASS SVGAnimatedLength interface: svg.x must inherit property "animVal" with the proper type (1) 
+PASS SVGAnimatedLength interface: svg.x must inherit property "baseVal" with the proper type 
+PASS SVGAnimatedLength interface: svg.x must inherit property "animVal" with the proper type 
 PASS SVGAnimatedAngle interface: existence and properties of interface object 
 PASS SVGAnimatedAngle interface object length 
 PASS SVGAnimatedAngle interface object name 
@@ -242,8 +242,8 @@
 PASS SVGAnimatedAngle interface: attribute animVal 
 PASS SVGAnimatedAngle must be primary interface of marker.orientAngle 
 PASS Stringification of marker.orientAngle 
-PASS SVGAnimatedAngle interface: marker.orientAngle must inherit property "baseVal" with the proper type (0) 
-PASS SVGAnimatedAngle interface: marker.orientAngle must inherit property "animVal" with the proper type (1) 
+PASS SVGAnimatedAngle interface: marker.orientAngle must inherit property "baseVal" with the proper type 
+PASS SVGAnimatedAngle interface: marker.orientAngle must inherit property "animVal" with the proper type 
 PASS SVGAnimatedString interface: existence and properties of interface object 
 PASS SVGAnimatedString interface object length 
 PASS SVGAnimatedString interface object name 
@@ -253,8 +253,8 @@
 PASS SVGAnimatedString interface: attribute animVal 
 PASS SVGAnimatedString must be primary interface of a.target 
 PASS Stringification of a.target 
-PASS SVGAnimatedString interface: a.target must inherit property "baseVal" with the proper type (0) 
-PASS SVGAnimatedString interface: a.target must inherit property "animVal" with the proper type (1) 
+PASS SVGAnimatedString interface: a.target must inherit property "baseVal" with the proper type 
+PASS SVGAnimatedString interface: a.target must inherit property "animVal" with the proper type 
 PASS SVGAnimatedRect interface: existence and properties of interface object 
 PASS SVGAnimatedRect interface object length 
 PASS SVGAnimatedRect interface object name 
@@ -264,8 +264,8 @@
 PASS SVGAnimatedRect interface: attribute animVal 
 PASS SVGAnimatedRect must be primary interface of svg.viewBox 
 PASS Stringification of svg.viewBox 
-FAIL SVGAnimatedRect interface: svg.viewBox must inherit property "baseVal" with the proper type (0) assert_true: instanceof DOMRect expected true got false
-FAIL SVGAnimatedRect interface: svg.viewBox must inherit property "animVal" with the proper type (1) assert_true: instanceof DOMRectReadOnly expected true got false
+FAIL SVGAnimatedRect interface: svg.viewBox must inherit property "baseVal" with the proper type assert_true: instanceof DOMRect expected true got false
+FAIL SVGAnimatedRect interface: svg.viewBox must inherit property "animVal" with the proper type assert_true: instanceof DOMRectReadOnly expected true got false
 PASS SVGAnimatedNumberList interface: existence and properties of interface object 
 PASS SVGAnimatedNumberList interface object length 
 PASS SVGAnimatedNumberList interface object name 
@@ -275,8 +275,8 @@
 PASS SVGAnimatedNumberList interface: attribute animVal 
 PASS SVGAnimatedNumberList must be primary interface of text.rotate 
 PASS Stringification of text.rotate 
-PASS SVGAnimatedNumberList interface: text.rotate must inherit property "baseVal" with the proper type (0) 
-PASS SVGAnimatedNumberList interface: text.rotate must inherit property "animVal" with the proper type (1) 
+PASS SVGAnimatedNumberList interface: text.rotate must inherit property "baseVal" with the proper type 
+PASS SVGAnimatedNumberList interface: text.rotate must inherit property "animVal" with the proper type 
 PASS SVGAnimatedLengthList interface: existence and properties of interface object 
 PASS SVGAnimatedLengthList interface object length 
 PASS SVGAnimatedLengthList interface object name 
@@ -286,8 +286,8 @@
 PASS SVGAnimatedLengthList interface: attribute animVal 
 PASS SVGAnimatedLengthList must be primary interface of text.x 
 PASS Stringification of text.x 
-PASS SVGAnimatedLengthList interface: text.x must inherit property "baseVal" with the proper type (0) 
-PASS SVGAnimatedLengthList interface: text.x must inherit property "animVal" with the proper type (1) 
+PASS SVGAnimatedLengthList interface: text.x must inherit property "baseVal" with the proper type 
+PASS SVGAnimatedLengthList interface: text.x must inherit property "animVal" with the proper type 
 PASS SVGStringList interface: existence and properties of interface object 
 PASS SVGStringList interface object length 
 PASS SVGStringList interface object name 
@@ -298,26 +298,26 @@
 PASS SVGStringList interface: operation clear() 
 PASS SVGStringList interface: operation initialize(DOMString) 
 PASS SVGStringList interface: operation getItem(unsigned long) 
-PASS SVGStringList interface: operation insertItemBefore(DOMString,unsigned long) 
-PASS SVGStringList interface: operation replaceItem(DOMString,unsigned long) 
+PASS SVGStringList interface: operation insertItemBefore(DOMString, unsigned long) 
+PASS SVGStringList interface: operation replaceItem(DOMString, unsigned long) 
 PASS SVGStringList interface: operation removeItem(unsigned long) 
 PASS SVGStringList interface: operation appendItem(DOMString) 
 PASS SVGStringList must be primary interface of a.requiredExtensions 
 PASS Stringification of a.requiredExtensions 
-PASS SVGStringList interface: a.requiredExtensions must inherit property "length" with the proper type (0) 
-PASS SVGStringList interface: a.requiredExtensions must inherit property "numberOfItems" with the proper type (1) 
-PASS SVGStringList interface: a.requiredExtensions must inherit property "clear" with the proper type (2) 
-PASS SVGStringList interface: a.requiredExtensions must inherit property "initialize" with the proper type (3) 
+PASS SVGStringList interface: a.requiredExtensions must inherit property "length" with the proper type 
+PASS SVGStringList interface: a.requiredExtensions must inherit property "numberOfItems" with the proper type 
+PASS SVGStringList interface: a.requiredExtensions must inherit property "clear()" with the proper type 
+PASS SVGStringList interface: a.requiredExtensions must inherit property "initialize(DOMString)" with the proper type 
 PASS SVGStringList interface: calling initialize(DOMString) on a.requiredExtensions with too few arguments must throw TypeError 
-PASS SVGStringList interface: a.requiredExtensions must inherit property "getItem" with the proper type (4) 
+PASS SVGStringList interface: a.requiredExtensions must inherit property "getItem(unsigned long)" with the proper type 
 PASS SVGStringList interface: calling getItem(unsigned long) on a.requiredExtensions with too few arguments must throw TypeError 
-PASS SVGStringList interface: a.requiredExtensions must inherit property "insertItemBefore" with the proper type (5) 
-PASS SVGStringList interface: calling insertItemBefore(DOMString,unsigned long) on a.requiredExtensions with too few arguments must throw TypeError 
-PASS SVGStringList interface: a.requiredExtensions must inherit property "replaceItem" with the proper type (6) 
-PASS SVGStringList interface: calling replaceItem(DOMString,unsigned long) on a.requiredExtensions with too few arguments must throw TypeError 
-PASS SVGStringList interface: a.requiredExtensions must inherit property "removeItem" with the proper type (7) 
+PASS SVGStringList interface: a.requiredExtensions must inherit property "insertItemBefore(DOMString, unsigned long)" with the proper type 
+PASS SVGStringList interface: calling insertItemBefore(DOMString, unsigned long) on a.requiredExtensions with too few arguments must throw TypeError 
+PASS SVGStringList interface: a.requiredExtensions must inherit property "replaceItem(DOMString, unsigned long)" with the proper type 
+PASS SVGStringList interface: calling replaceItem(DOMString, unsigned long) on a.requiredExtensions with too few arguments must throw TypeError 
+PASS SVGStringList interface: a.requiredExtensions must inherit property "removeItem(unsigned long)" with the proper type 
 PASS SVGStringList interface: calling removeItem(unsigned long) on a.requiredExtensions with too few arguments must throw TypeError 
-PASS SVGStringList interface: a.requiredExtensions must inherit property "appendItem" with the proper type (8) 
+PASS SVGStringList interface: a.requiredExtensions must inherit property "appendItem(DOMString)" with the proper type 
 PASS SVGStringList interface: calling appendItem(DOMString) on a.requiredExtensions with too few arguments must throw TypeError 
 PASS SVGUnitTypes interface: existence and properties of interface object 
 PASS SVGUnitTypes interface object length 
@@ -341,10 +341,10 @@
 PASS SVGSVGElement interface: attribute height 
 PASS SVGSVGElement interface: attribute currentScale 
 PASS SVGSVGElement interface: attribute currentTranslate 
-PASS SVGSVGElement interface: operation getIntersectionList(DOMRectReadOnly,SVGElement) 
-PASS SVGSVGElement interface: operation getEnclosureList(DOMRectReadOnly,SVGElement) 
-PASS SVGSVGElement interface: operation checkIntersection(SVGElement,DOMRectReadOnly) 
-PASS SVGSVGElement interface: operation checkEnclosure(SVGElement,DOMRectReadOnly) 
+PASS SVGSVGElement interface: operation getIntersectionList(DOMRectReadOnly, SVGElement) 
+PASS SVGSVGElement interface: operation getEnclosureList(DOMRectReadOnly, SVGElement) 
+PASS SVGSVGElement interface: operation checkIntersection(SVGElement, DOMRectReadOnly) 
+PASS SVGSVGElement interface: operation checkEnclosure(SVGElement, DOMRectReadOnly) 
 PASS SVGSVGElement interface: operation deselectAll() 
 PASS SVGSVGElement interface: operation createSVGNumber() 
 PASS SVGSVGElement interface: operation createSVGLength() 
@@ -369,56 +369,56 @@
 PASS SVGSVGElement interface: attribute zoomAndPan 
 PASS SVGSVGElement must be primary interface of svg 
 PASS Stringification of svg 
-PASS SVGSVGElement interface: svg must inherit property "x" with the proper type (0) 
-PASS SVGSVGElement interface: svg must inherit property "y" with the proper type (1) 
-PASS SVGSVGElement interface: svg must inherit property "width" with the proper type (2) 
-PASS SVGSVGElement interface: svg must inherit property "height" with the proper type (3) 
-PASS SVGSVGElement interface: svg must inherit property "currentScale" with the proper type (4) 
-FAIL SVGSVGElement interface: svg must inherit property "currentTranslate" with the proper type (5) assert_true: instanceof DOMPointReadOnly expected true got false
-PASS SVGSVGElement interface: svg must inherit property "getIntersectionList" with the proper type (6) 
-PASS SVGSVGElement interface: calling getIntersectionList(DOMRectReadOnly,SVGElement) on svg with too few arguments must throw TypeError 
-PASS SVGSVGElement interface: svg must inherit property "getEnclosureList" with the proper type (7) 
-PASS SVGSVGElement interface: calling getEnclosureList(DOMRectReadOnly,SVGElement) on svg with too few arguments must throw TypeError 
-PASS SVGSVGElement interface: svg must inherit property "checkIntersection" with the proper type (8) 
-PASS SVGSVGElement interface: calling checkIntersection(SVGElement,DOMRectReadOnly) on svg with too few arguments must throw TypeError 
-PASS SVGSVGElement interface: svg must inherit property "checkEnclosure" with the proper type (9) 
-PASS SVGSVGElement interface: calling checkEnclosure(SVGElement,DOMRectReadOnly) on svg with too few arguments must throw TypeError 
-PASS SVGSVGElement interface: svg must inherit property "deselectAll" with the proper type (10) 
-PASS SVGSVGElement interface: svg must inherit property "createSVGNumber" with the proper type (11) 
-PASS SVGSVGElement interface: svg must inherit property "createSVGLength" with the proper type (12) 
-PASS SVGSVGElement interface: svg must inherit property "createSVGAngle" with the proper type (13) 
-PASS SVGSVGElement interface: svg must inherit property "createSVGPoint" with the proper type (14) 
-PASS SVGSVGElement interface: svg must inherit property "createSVGMatrix" with the proper type (15) 
-PASS SVGSVGElement interface: svg must inherit property "createSVGRect" with the proper type (16) 
-PASS SVGSVGElement interface: svg must inherit property "createSVGTransform" with the proper type (17) 
-PASS SVGSVGElement interface: svg must inherit property "createSVGTransformFromMatrix" with the proper type (18) 
+PASS SVGSVGElement interface: svg must inherit property "x" with the proper type 
+PASS SVGSVGElement interface: svg must inherit property "y" with the proper type 
+PASS SVGSVGElement interface: svg must inherit property "width" with the proper type 
+PASS SVGSVGElement interface: svg must inherit property "height" with the proper type 
+PASS SVGSVGElement interface: svg must inherit property "currentScale" with the proper type 
+FAIL SVGSVGElement interface: svg must inherit property "currentTranslate" with the proper type assert_true: instanceof DOMPointReadOnly expected true got false
+PASS SVGSVGElement interface: svg must inherit property "getIntersectionList(DOMRectReadOnly, SVGElement)" with the proper type 
+PASS SVGSVGElement interface: calling getIntersectionList(DOMRectReadOnly, SVGElement) on svg with too few arguments must throw TypeError 
+PASS SVGSVGElement interface: svg must inherit property "getEnclosureList(DOMRectReadOnly, SVGElement)" with the proper type 
+PASS SVGSVGElement interface: calling getEnclosureList(DOMRectReadOnly, SVGElement) on svg with too few arguments must throw TypeError 
+PASS SVGSVGElement interface: svg must inherit property "checkIntersection(SVGElement, DOMRectReadOnly)" with the proper type 
+PASS SVGSVGElement interface: calling checkIntersection(SVGElement, DOMRectReadOnly) on svg with too few arguments must throw TypeError 
+PASS SVGSVGElement interface: svg must inherit property "checkEnclosure(SVGElement, DOMRectReadOnly)" with the proper type 
+PASS SVGSVGElement interface: calling checkEnclosure(SVGElement, DOMRectReadOnly) on svg with too few arguments must throw TypeError 
+PASS SVGSVGElement interface: svg must inherit property "deselectAll()" with the proper type 
+PASS SVGSVGElement interface: svg must inherit property "createSVGNumber()" with the proper type 
+PASS SVGSVGElement interface: svg must inherit property "createSVGLength()" with the proper type 
+PASS SVGSVGElement interface: svg must inherit property "createSVGAngle()" with the proper type 
+PASS SVGSVGElement interface: svg must inherit property "createSVGPoint()" with the proper type 
+PASS SVGSVGElement interface: svg must inherit property "createSVGMatrix()" with the proper type 
+PASS SVGSVGElement interface: svg must inherit property "createSVGRect()" with the proper type 
+PASS SVGSVGElement interface: svg must inherit property "createSVGTransform()" with the proper type 
+PASS SVGSVGElement interface: svg must inherit property "createSVGTransformFromMatrix(DOMMatrixReadOnly)" with the proper type 
 PASS SVGSVGElement interface: calling createSVGTransformFromMatrix(DOMMatrixReadOnly) on svg with too few arguments must throw TypeError 
-PASS SVGSVGElement interface: svg must inherit property "suspendRedraw" with the proper type (19) 
+PASS SVGSVGElement interface: svg must inherit property "suspendRedraw(unsigned long)" with the proper type 
 PASS SVGSVGElement interface: calling suspendRedraw(unsigned long) on svg with too few arguments must throw TypeError 
-PASS SVGSVGElement interface: svg must inherit property "unsuspendRedraw" with the proper type (20) 
+PASS SVGSVGElement interface: svg must inherit property "unsuspendRedraw(unsigned long)" with the proper type 
 PASS SVGSVGElement interface: calling unsuspendRedraw(unsigned long) on svg with too few arguments must throw TypeError 
-PASS SVGSVGElement interface: svg must inherit property "unsuspendRedrawAll" with the proper type (21) 
-PASS SVGSVGElement interface: svg must inherit property "forceRedraw" with the proper type (22) 
-PASS SVGSVGElement interface: svg must inherit property "viewBox" with the proper type (23) 
-PASS SVGSVGElement interface: svg must inherit property "preserveAspectRatio" with the proper type (24) 
-PASS SVGSVGElement interface: svg must inherit property "SVG_ZOOMANDPAN_UNKNOWN" with the proper type (25) 
-PASS SVGSVGElement interface: svg must inherit property "SVG_ZOOMANDPAN_DISABLE" with the proper type (26) 
-PASS SVGSVGElement interface: svg must inherit property "SVG_ZOOMANDPAN_MAGNIFY" with the proper type (27) 
-PASS SVGSVGElement interface: svg must inherit property "zoomAndPan" with the proper type (28) 
-PASS SVGGraphicsElement interface: svg must inherit property "transform" with the proper type (0) 
-PASS SVGGraphicsElement interface: svg must inherit property "getBBox" with the proper type (1) 
+PASS SVGSVGElement interface: svg must inherit property "unsuspendRedrawAll()" with the proper type 
+PASS SVGSVGElement interface: svg must inherit property "forceRedraw()" with the proper type 
+PASS SVGSVGElement interface: svg must inherit property "viewBox" with the proper type 
+PASS SVGSVGElement interface: svg must inherit property "preserveAspectRatio" with the proper type 
+PASS SVGSVGElement interface: svg must inherit property "SVG_ZOOMANDPAN_UNKNOWN" with the proper type 
+PASS SVGSVGElement interface: svg must inherit property "SVG_ZOOMANDPAN_DISABLE" with the proper type 
+PASS SVGSVGElement interface: svg must inherit property "SVG_ZOOMANDPAN_MAGNIFY" with the proper type 
+PASS SVGSVGElement interface: svg must inherit property "zoomAndPan" with the proper type 
+PASS SVGGraphicsElement interface: svg must inherit property "transform" with the proper type 
+PASS SVGGraphicsElement interface: svg must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type 
 PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on svg with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: svg must inherit property "getCTM" with the proper type (2) 
-PASS SVGGraphicsElement interface: svg must inherit property "getScreenCTM" with the proper type (3) 
-PASS SVGGraphicsElement interface: svg must inherit property "requiredExtensions" with the proper type (4) 
-PASS SVGGraphicsElement interface: svg must inherit property "systemLanguage" with the proper type (5) 
-PASS SVGElement interface: svg must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: svg must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: svg must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: svg must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: svg must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: svg must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: svg must inherit property "blur" with the proper type (6) 
+PASS SVGGraphicsElement interface: svg must inherit property "getCTM()" with the proper type 
+PASS SVGGraphicsElement interface: svg must inherit property "getScreenCTM()" with the proper type 
+PASS SVGGraphicsElement interface: svg must inherit property "requiredExtensions" with the proper type 
+PASS SVGGraphicsElement interface: svg must inherit property "systemLanguage" with the proper type 
+PASS SVGElement interface: svg must inherit property "className" with the proper type 
+PASS SVGElement interface: svg must inherit property "dataset" with the proper type 
+PASS SVGElement interface: svg must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: svg must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: svg must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: svg must inherit property "focus()" with the proper type 
+PASS SVGElement interface: svg must inherit property "blur()" with the proper type 
 PASS SVGGElement interface: existence and properties of interface object 
 PASS SVGGElement interface object length 
 PASS SVGGElement interface object name 
@@ -426,20 +426,20 @@
 PASS SVGGElement interface: existence and properties of interface prototype object's "constructor" property 
 PASS SVGGElement must be primary interface of g 
 PASS Stringification of g 
-PASS SVGGraphicsElement interface: g must inherit property "transform" with the proper type (0) 
-PASS SVGGraphicsElement interface: g must inherit property "getBBox" with the proper type (1) 
+PASS SVGGraphicsElement interface: g must inherit property "transform" with the proper type 
+PASS SVGGraphicsElement interface: g must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type 
 PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on g with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: g must inherit property "getCTM" with the proper type (2) 
-PASS SVGGraphicsElement interface: g must inherit property "getScreenCTM" with the proper type (3) 
-PASS SVGGraphicsElement interface: g must inherit property "requiredExtensions" with the proper type (4) 
-PASS SVGGraphicsElement interface: g must inherit property "systemLanguage" with the proper type (5) 
-PASS SVGElement interface: g must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: g must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: g must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: g must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: g must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: g must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: g must inherit property "blur" with the proper type (6) 
+PASS SVGGraphicsElement interface: g must inherit property "getCTM()" with the proper type 
+PASS SVGGraphicsElement interface: g must inherit property "getScreenCTM()" with the proper type 
+PASS SVGGraphicsElement interface: g must inherit property "requiredExtensions" with the proper type 
+PASS SVGGraphicsElement interface: g must inherit property "systemLanguage" with the proper type 
+PASS SVGElement interface: g must inherit property "className" with the proper type 
+PASS SVGElement interface: g must inherit property "dataset" with the proper type 
+PASS SVGElement interface: g must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: g must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: g must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: g must inherit property "focus()" with the proper type 
+PASS SVGElement interface: g must inherit property "blur()" with the proper type 
 FAIL SVGUnknownElement interface: existence and properties of interface object assert_own_property: self does not have own property "SVGUnknownElement" expected property "SVGUnknownElement" missing
 FAIL SVGUnknownElement interface object length assert_own_property: self does not have own property "SVGUnknownElement" expected property "SVGUnknownElement" missing
 FAIL SVGUnknownElement interface object name assert_own_property: self does not have own property "SVGUnknownElement" expected property "SVGUnknownElement" missing
@@ -452,20 +452,20 @@
 PASS SVGDefsElement interface: existence and properties of interface prototype object's "constructor" property 
 PASS SVGDefsElement must be primary interface of defs 
 PASS Stringification of defs 
-PASS SVGGraphicsElement interface: defs must inherit property "transform" with the proper type (0) 
-PASS SVGGraphicsElement interface: defs must inherit property "getBBox" with the proper type (1) 
+PASS SVGGraphicsElement interface: defs must inherit property "transform" with the proper type 
+PASS SVGGraphicsElement interface: defs must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type 
 PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on defs with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: defs must inherit property "getCTM" with the proper type (2) 
-PASS SVGGraphicsElement interface: defs must inherit property "getScreenCTM" with the proper type (3) 
-PASS SVGGraphicsElement interface: defs must inherit property "requiredExtensions" with the proper type (4) 
-PASS SVGGraphicsElement interface: defs must inherit property "systemLanguage" with the proper type (5) 
-PASS SVGElement interface: defs must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: defs must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: defs must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: defs must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: defs must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: defs must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: defs must inherit property "blur" with the proper type (6) 
+PASS SVGGraphicsElement interface: defs must inherit property "getCTM()" with the proper type 
+PASS SVGGraphicsElement interface: defs must inherit property "getScreenCTM()" with the proper type 
+PASS SVGGraphicsElement interface: defs must inherit property "requiredExtensions" with the proper type 
+PASS SVGGraphicsElement interface: defs must inherit property "systemLanguage" with the proper type 
+PASS SVGElement interface: defs must inherit property "className" with the proper type 
+PASS SVGElement interface: defs must inherit property "dataset" with the proper type 
+PASS SVGElement interface: defs must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: defs must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: defs must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: defs must inherit property "focus()" with the proper type 
+PASS SVGElement interface: defs must inherit property "blur()" with the proper type 
 PASS SVGDescElement interface: existence and properties of interface object 
 PASS SVGDescElement interface object length 
 PASS SVGDescElement interface object name 
@@ -473,13 +473,13 @@
 PASS SVGDescElement interface: existence and properties of interface prototype object's "constructor" property 
 PASS SVGDescElement must be primary interface of Desc 
 PASS Stringification of Desc 
-PASS SVGElement interface: Desc must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: Desc must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: Desc must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: Desc must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: Desc must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: Desc must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: Desc must inherit property "blur" with the proper type (6) 
+PASS SVGElement interface: Desc must inherit property "className" with the proper type 
+PASS SVGElement interface: Desc must inherit property "dataset" with the proper type 
+PASS SVGElement interface: Desc must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: Desc must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: Desc must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: Desc must inherit property "focus()" with the proper type 
+PASS SVGElement interface: Desc must inherit property "blur()" with the proper type 
 PASS SVGMetadataElement interface: existence and properties of interface object 
 PASS SVGMetadataElement interface object length 
 PASS SVGMetadataElement interface object name 
@@ -487,13 +487,13 @@
 PASS SVGMetadataElement interface: existence and properties of interface prototype object's "constructor" property 
 PASS SVGMetadataElement must be primary interface of metadata 
 PASS Stringification of metadata 
-PASS SVGElement interface: metadata must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: metadata must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: metadata must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: metadata must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: metadata must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: metadata must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: metadata must inherit property "blur" with the proper type (6) 
+PASS SVGElement interface: metadata must inherit property "className" with the proper type 
+PASS SVGElement interface: metadata must inherit property "dataset" with the proper type 
+PASS SVGElement interface: metadata must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: metadata must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: metadata must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: metadata must inherit property "focus()" with the proper type 
+PASS SVGElement interface: metadata must inherit property "blur()" with the proper type 
 PASS SVGTitleElement interface: existence and properties of interface object 
 PASS SVGTitleElement interface object length 
 PASS SVGTitleElement interface object name 
@@ -501,13 +501,13 @@
 PASS SVGTitleElement interface: existence and properties of interface prototype object's "constructor" property 
 PASS SVGTitleElement must be primary interface of title 
 PASS Stringification of title 
-PASS SVGElement interface: title must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: title must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: title must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: title must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: title must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: title must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: title must inherit property "blur" with the proper type (6) 
+PASS SVGElement interface: title must inherit property "className" with the proper type 
+PASS SVGElement interface: title must inherit property "dataset" with the proper type 
+PASS SVGElement interface: title must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: title must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: title must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: title must inherit property "focus()" with the proper type 
+PASS SVGElement interface: title must inherit property "blur()" with the proper type 
 PASS SVGSymbolElement interface: existence and properties of interface object 
 PASS SVGSymbolElement interface object length 
 PASS SVGSymbolElement interface object name 
@@ -517,15 +517,15 @@
 PASS SVGSymbolElement interface: attribute preserveAspectRatio 
 PASS SVGSymbolElement must be primary interface of symbol 
 PASS Stringification of symbol 
-PASS SVGSymbolElement interface: symbol must inherit property "viewBox" with the proper type (0) 
-PASS SVGSymbolElement interface: symbol must inherit property "preserveAspectRatio" with the proper type (1) 
-PASS SVGElement interface: symbol must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: symbol must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: symbol must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: symbol must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: symbol must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: symbol must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: symbol must inherit property "blur" with the proper type (6) 
+PASS SVGSymbolElement interface: symbol must inherit property "viewBox" with the proper type 
+PASS SVGSymbolElement interface: symbol must inherit property "preserveAspectRatio" with the proper type 
+PASS SVGElement interface: symbol must inherit property "className" with the proper type 
+PASS SVGElement interface: symbol must inherit property "dataset" with the proper type 
+PASS SVGElement interface: symbol must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: symbol must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: symbol must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: symbol must inherit property "focus()" with the proper type 
+PASS SVGElement interface: symbol must inherit property "blur()" with the proper type 
 PASS SVGUseElement interface: existence and properties of interface object 
 PASS SVGUseElement interface object length 
 PASS SVGUseElement interface object name 
@@ -538,25 +538,25 @@
 PASS SVGUseElement interface: attribute href 
 PASS SVGUseElement must be primary interface of use 
 PASS Stringification of use 
-PASS SVGUseElement interface: use must inherit property "x" with the proper type (0) 
-PASS SVGUseElement interface: use must inherit property "y" with the proper type (1) 
-PASS SVGUseElement interface: use must inherit property "width" with the proper type (2) 
-PASS SVGUseElement interface: use must inherit property "height" with the proper type (3) 
-PASS SVGUseElement interface: use must inherit property "href" with the proper type (4) 
-PASS SVGGraphicsElement interface: use must inherit property "transform" with the proper type (0) 
-PASS SVGGraphicsElement interface: use must inherit property "getBBox" with the proper type (1) 
+PASS SVGUseElement interface: use must inherit property "x" with the proper type 
+PASS SVGUseElement interface: use must inherit property "y" with the proper type 
+PASS SVGUseElement interface: use must inherit property "width" with the proper type 
+PASS SVGUseElement interface: use must inherit property "height" with the proper type 
+PASS SVGUseElement interface: use must inherit property "href" with the proper type 
+PASS SVGGraphicsElement interface: use must inherit property "transform" with the proper type 
+PASS SVGGraphicsElement interface: use must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type 
 PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on use with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: use must inherit property "getCTM" with the proper type (2) 
-PASS SVGGraphicsElement interface: use must inherit property "getScreenCTM" with the proper type (3) 
-PASS SVGGraphicsElement interface: use must inherit property "requiredExtensions" with the proper type (4) 
-PASS SVGGraphicsElement interface: use must inherit property "systemLanguage" with the proper type (5) 
-PASS SVGElement interface: use must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: use must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: use must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: use must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: use must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: use must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: use must inherit property "blur" with the proper type (6) 
+PASS SVGGraphicsElement interface: use must inherit property "getCTM()" with the proper type 
+PASS SVGGraphicsElement interface: use must inherit property "getScreenCTM()" with the proper type 
+PASS SVGGraphicsElement interface: use must inherit property "requiredExtensions" with the proper type 
+PASS SVGGraphicsElement interface: use must inherit property "systemLanguage" with the proper type 
+PASS SVGElement interface: use must inherit property "className" with the proper type 
+PASS SVGElement interface: use must inherit property "dataset" with the proper type 
+PASS SVGElement interface: use must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: use must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: use must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: use must inherit property "focus()" with the proper type 
+PASS SVGElement interface: use must inherit property "blur()" with the proper type 
 PASS SVGSwitchElement interface: existence and properties of interface object 
 PASS SVGSwitchElement interface object length 
 PASS SVGSwitchElement interface object name 
@@ -564,20 +564,20 @@
 PASS SVGSwitchElement interface: existence and properties of interface prototype object's "constructor" property 
 PASS SVGSwitchElement must be primary interface of Switch 
 PASS Stringification of Switch 
-PASS SVGGraphicsElement interface: Switch must inherit property "transform" with the proper type (0) 
-PASS SVGGraphicsElement interface: Switch must inherit property "getBBox" with the proper type (1) 
+PASS SVGGraphicsElement interface: Switch must inherit property "transform" with the proper type 
+PASS SVGGraphicsElement interface: Switch must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type 
 PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on Switch with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: Switch must inherit property "getCTM" with the proper type (2) 
-PASS SVGGraphicsElement interface: Switch must inherit property "getScreenCTM" with the proper type (3) 
-PASS SVGGraphicsElement interface: Switch must inherit property "requiredExtensions" with the proper type (4) 
-PASS SVGGraphicsElement interface: Switch must inherit property "systemLanguage" with the proper type (5) 
-PASS SVGElement interface: Switch must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: Switch must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: Switch must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: Switch must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: Switch must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: Switch must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: Switch must inherit property "blur" with the proper type (6) 
+PASS SVGGraphicsElement interface: Switch must inherit property "getCTM()" with the proper type 
+PASS SVGGraphicsElement interface: Switch must inherit property "getScreenCTM()" with the proper type 
+PASS SVGGraphicsElement interface: Switch must inherit property "requiredExtensions" with the proper type 
+PASS SVGGraphicsElement interface: Switch must inherit property "systemLanguage" with the proper type 
+PASS SVGElement interface: Switch must inherit property "className" with the proper type 
+PASS SVGElement interface: Switch must inherit property "dataset" with the proper type 
+PASS SVGElement interface: Switch must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: Switch must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: Switch must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: Switch must inherit property "focus()" with the proper type 
+PASS SVGElement interface: Switch must inherit property "blur()" with the proper type 
 PASS SVGStyleElement interface: existence and properties of interface object 
 PASS SVGStyleElement interface object length 
 PASS SVGStyleElement interface object name 
@@ -588,16 +588,16 @@
 PASS SVGStyleElement interface: attribute title 
 PASS SVGStyleElement must be primary interface of style 
 PASS Stringification of style 
-PASS SVGStyleElement interface: style must inherit property "type" with the proper type (0) 
-PASS SVGStyleElement interface: style must inherit property "media" with the proper type (1) 
-PASS SVGStyleElement interface: style must inherit property "title" with the proper type (2) 
-PASS SVGElement interface: style must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: style must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: style must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: style must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: style must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: style must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: style must inherit property "blur" with the proper type (6) 
+PASS SVGStyleElement interface: style must inherit property "type" with the proper type 
+PASS SVGStyleElement interface: style must inherit property "media" with the proper type 
+PASS SVGStyleElement interface: style must inherit property "title" with the proper type 
+PASS SVGElement interface: style must inherit property "className" with the proper type 
+PASS SVGElement interface: style must inherit property "dataset" with the proper type 
+PASS SVGElement interface: style must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: style must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: style must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: style must inherit property "focus()" with the proper type 
+PASS SVGElement interface: style must inherit property "blur()" with the proper type 
 PASS SVGTransform interface: existence and properties of interface object 
 PASS SVGTransform interface object length 
 PASS SVGTransform interface object name 
@@ -621,34 +621,34 @@
 PASS SVGTransform interface: attribute matrix 
 PASS SVGTransform interface: attribute angle 
 PASS SVGTransform interface: operation setMatrix(DOMMatrixReadOnly) 
-PASS SVGTransform interface: operation setTranslate(float,float) 
-PASS SVGTransform interface: operation setScale(float,float) 
-PASS SVGTransform interface: operation setRotate(float,float,float) 
+PASS SVGTransform interface: operation setTranslate(float, float) 
+PASS SVGTransform interface: operation setScale(float, float) 
+PASS SVGTransform interface: operation setRotate(float, float, float) 
 PASS SVGTransform interface: operation setSkewX(float) 
 PASS SVGTransform interface: operation setSkewY(float) 
 PASS SVGTransform must be primary interface of svg.createSVGTransform() 
 PASS Stringification of svg.createSVGTransform() 
-PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_UNKNOWN" with the proper type (0) 
-PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_MATRIX" with the proper type (1) 
-PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_TRANSLATE" with the proper type (2) 
-PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_SCALE" with the proper type (3) 
-PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_ROTATE" with the proper type (4) 
-PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_SKEWX" with the proper type (5) 
-PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_SKEWY" with the proper type (6) 
-PASS SVGTransform interface: svg.createSVGTransform() must inherit property "type" with the proper type (7) 
-FAIL SVGTransform interface: svg.createSVGTransform() must inherit property "matrix" with the proper type (8) assert_true: instanceof DOMMatrix expected true got false
-PASS SVGTransform interface: svg.createSVGTransform() must inherit property "angle" with the proper type (9) 
-PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setMatrix" with the proper type (10) 
+PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_UNKNOWN" with the proper type 
+PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_MATRIX" with the proper type 
+PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_TRANSLATE" with the proper type 
+PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_SCALE" with the proper type 
+PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_ROTATE" with the proper type 
+PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_SKEWX" with the proper type 
+PASS SVGTransform interface: svg.createSVGTransform() must inherit property "SVG_TRANSFORM_SKEWY" with the proper type 
+PASS SVGTransform interface: svg.createSVGTransform() must inherit property "type" with the proper type 
+FAIL SVGTransform interface: svg.createSVGTransform() must inherit property "matrix" with the proper type assert_true: instanceof DOMMatrix expected true got false
+PASS SVGTransform interface: svg.createSVGTransform() must inherit property "angle" with the proper type 
+PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setMatrix(DOMMatrixReadOnly)" with the proper type 
 PASS SVGTransform interface: calling setMatrix(DOMMatrixReadOnly) on svg.createSVGTransform() with too few arguments must throw TypeError 
-PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setTranslate" with the proper type (11) 
-PASS SVGTransform interface: calling setTranslate(float,float) on svg.createSVGTransform() with too few arguments must throw TypeError 
-PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setScale" with the proper type (12) 
-PASS SVGTransform interface: calling setScale(float,float) on svg.createSVGTransform() with too few arguments must throw TypeError 
-PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setRotate" with the proper type (13) 
-PASS SVGTransform interface: calling setRotate(float,float,float) on svg.createSVGTransform() with too few arguments must throw TypeError 
-PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setSkewX" with the proper type (14) 
+PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setTranslate(float, float)" with the proper type 
+PASS SVGTransform interface: calling setTranslate(float, float) on svg.createSVGTransform() with too few arguments must throw TypeError 
+PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setScale(float, float)" with the proper type 
+PASS SVGTransform interface: calling setScale(float, float) on svg.createSVGTransform() with too few arguments must throw TypeError 
+PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setRotate(float, float, float)" with the proper type 
+PASS SVGTransform interface: calling setRotate(float, float, float) on svg.createSVGTransform() with too few arguments must throw TypeError 
+PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setSkewX(float)" with the proper type 
 PASS SVGTransform interface: calling setSkewX(float) on svg.createSVGTransform() with too few arguments must throw TypeError 
-PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setSkewY" with the proper type (15) 
+PASS SVGTransform interface: svg.createSVGTransform() must inherit property "setSkewY(float)" with the proper type 
 PASS SVGTransform interface: calling setSkewY(float) on svg.createSVGTransform() with too few arguments must throw TypeError 
 PASS SVGTransformList interface: existence and properties of interface object 
 PASS SVGTransformList interface object length 
@@ -660,32 +660,32 @@
 PASS SVGTransformList interface: operation clear() 
 PASS SVGTransformList interface: operation initialize(SVGTransform) 
 PASS SVGTransformList interface: operation getItem(unsigned long) 
-PASS SVGTransformList interface: operation insertItemBefore(SVGTransform,unsigned long) 
-PASS SVGTransformList interface: operation replaceItem(SVGTransform,unsigned long) 
+PASS SVGTransformList interface: operation insertItemBefore(SVGTransform, unsigned long) 
+PASS SVGTransformList interface: operation replaceItem(SVGTransform, unsigned long) 
 PASS SVGTransformList interface: operation removeItem(unsigned long) 
 PASS SVGTransformList interface: operation appendItem(SVGTransform) 
 PASS SVGTransformList interface: operation createSVGTransformFromMatrix(DOMMatrixReadOnly) 
 PASS SVGTransformList interface: operation consolidate() 
 PASS SVGTransformList must be primary interface of pattern.patternTransform.baseVal 
 PASS Stringification of pattern.patternTransform.baseVal 
-PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "length" with the proper type (0) 
-PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "numberOfItems" with the proper type (1) 
-PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "clear" with the proper type (2) 
-PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "initialize" with the proper type (3) 
+PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "length" with the proper type 
+PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "numberOfItems" with the proper type 
+PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "clear()" with the proper type 
+PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "initialize(SVGTransform)" with the proper type 
 PASS SVGTransformList interface: calling initialize(SVGTransform) on pattern.patternTransform.baseVal with too few arguments must throw TypeError 
-PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "getItem" with the proper type (4) 
+PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "getItem(unsigned long)" with the proper type 
 PASS SVGTransformList interface: calling getItem(unsigned long) on pattern.patternTransform.baseVal with too few arguments must throw TypeError 
-PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "insertItemBefore" with the proper type (5) 
-PASS SVGTransformList interface: calling insertItemBefore(SVGTransform,unsigned long) on pattern.patternTransform.baseVal with too few arguments must throw TypeError 
-PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "replaceItem" with the proper type (6) 
-PASS SVGTransformList interface: calling replaceItem(SVGTransform,unsigned long) on pattern.patternTransform.baseVal with too few arguments must throw TypeError 
-PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "removeItem" with the proper type (7) 
+PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "insertItemBefore(SVGTransform, unsigned long)" with the proper type 
+PASS SVGTransformList interface: calling insertItemBefore(SVGTransform, unsigned long) on pattern.patternTransform.baseVal with too few arguments must throw TypeError 
+PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "replaceItem(SVGTransform, unsigned long)" with the proper type 
+PASS SVGTransformList interface: calling replaceItem(SVGTransform, unsigned long) on pattern.patternTransform.baseVal with too few arguments must throw TypeError 
+PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "removeItem(unsigned long)" with the proper type 
 PASS SVGTransformList interface: calling removeItem(unsigned long) on pattern.patternTransform.baseVal with too few arguments must throw TypeError 
-PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "appendItem" with the proper type (8) 
+PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "appendItem(SVGTransform)" with the proper type 
 PASS SVGTransformList interface: calling appendItem(SVGTransform) on pattern.patternTransform.baseVal with too few arguments must throw TypeError 
-PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "createSVGTransformFromMatrix" with the proper type (10) 
+PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "createSVGTransformFromMatrix(DOMMatrixReadOnly)" with the proper type 
 PASS SVGTransformList interface: calling createSVGTransformFromMatrix(DOMMatrixReadOnly) on pattern.patternTransform.baseVal with too few arguments must throw TypeError 
-PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "consolidate" with the proper type (11) 
+PASS SVGTransformList interface: pattern.patternTransform.baseVal must inherit property "consolidate()" with the proper type 
 PASS SVGAnimatedTransformList interface: existence and properties of interface object 
 PASS SVGAnimatedTransformList interface object length 
 PASS SVGAnimatedTransformList interface object name 
@@ -695,8 +695,8 @@
 PASS SVGAnimatedTransformList interface: attribute animVal 
 PASS SVGAnimatedTransformList must be primary interface of pattern.patternTransform 
 PASS Stringification of pattern.patternTransform 
-PASS SVGAnimatedTransformList interface: pattern.patternTransform must inherit property "baseVal" with the proper type (0) 
-PASS SVGAnimatedTransformList interface: pattern.patternTransform must inherit property "animVal" with the proper type (1) 
+PASS SVGAnimatedTransformList interface: pattern.patternTransform must inherit property "baseVal" with the proper type 
+PASS SVGAnimatedTransformList interface: pattern.patternTransform must inherit property "animVal" with the proper type 
 PASS SVGPreserveAspectRatio interface: existence and properties of interface object 
 PASS SVGPreserveAspectRatio interface object length 
 PASS SVGPreserveAspectRatio interface object name 
@@ -734,22 +734,22 @@
 PASS SVGPreserveAspectRatio interface: attribute meetOrSlice 
 PASS SVGPreserveAspectRatio must be primary interface of image.preserveAspectRatio.baseVal 
 PASS Stringification of image.preserveAspectRatio.baseVal 
-PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_UNKNOWN" with the proper type (0) 
-PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_NONE" with the proper type (1) 
-PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMINYMIN" with the proper type (2) 
-PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMIDYMIN" with the proper type (3) 
-PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMAXYMIN" with the proper type (4) 
-PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMINYMID" with the proper type (5) 
-PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMIDYMID" with the proper type (6) 
-PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMAXYMID" with the proper type (7) 
-PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMINYMAX" with the proper type (8) 
-PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMIDYMAX" with the proper type (9) 
-PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMAXYMAX" with the proper type (10) 
-PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_MEETORSLICE_UNKNOWN" with the proper type (11) 
-PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_MEETORSLICE_MEET" with the proper type (12) 
-PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_MEETORSLICE_SLICE" with the proper type (13) 
-PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "align" with the proper type (14) 
-PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "meetOrSlice" with the proper type (15) 
+PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_UNKNOWN" with the proper type 
+PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_NONE" with the proper type 
+PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMINYMIN" with the proper type 
+PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMIDYMIN" with the proper type 
+PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMAXYMIN" with the proper type 
+PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMINYMID" with the proper type 
+PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMIDYMID" with the proper type 
+PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMAXYMID" with the proper type 
+PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMINYMAX" with the proper type 
+PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMIDYMAX" with the proper type 
+PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_PRESERVEASPECTRATIO_XMAXYMAX" with the proper type 
+PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_MEETORSLICE_UNKNOWN" with the proper type 
+PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_MEETORSLICE_MEET" with the proper type 
+PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "SVG_MEETORSLICE_SLICE" with the proper type 
+PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "align" with the proper type 
+PASS SVGPreserveAspectRatio interface: image.preserveAspectRatio.baseVal must inherit property "meetOrSlice" with the proper type 
 PASS SVGAnimatedPreserveAspectRatio interface: existence and properties of interface object 
 PASS SVGAnimatedPreserveAspectRatio interface object length 
 PASS SVGAnimatedPreserveAspectRatio interface object name 
@@ -759,8 +759,8 @@
 PASS SVGAnimatedPreserveAspectRatio interface: attribute animVal 
 PASS SVGAnimatedPreserveAspectRatio must be primary interface of image.preserveAspectRatio 
 PASS Stringification of image.preserveAspectRatio 
-PASS SVGAnimatedPreserveAspectRatio interface: image.preserveAspectRatio must inherit property "baseVal" with the proper type (0) 
-PASS SVGAnimatedPreserveAspectRatio interface: image.preserveAspectRatio must inherit property "animVal" with the proper type (1) 
+PASS SVGAnimatedPreserveAspectRatio interface: image.preserveAspectRatio must inherit property "baseVal" with the proper type 
+PASS SVGAnimatedPreserveAspectRatio interface: image.preserveAspectRatio must inherit property "animVal" with the proper type 
 PASS SVGPathElement interface: existence and properties of interface object 
 PASS SVGPathElement interface object length 
 PASS SVGPathElement interface object name 
@@ -768,28 +768,28 @@
 PASS SVGPathElement interface: existence and properties of interface prototype object's "constructor" property 
 PASS SVGPathElement must be primary interface of path 
 PASS Stringification of path 
-PASS SVGGeometryElement interface: path must inherit property "pathLength" with the proper type (0) 
-PASS SVGGeometryElement interface: path must inherit property "isPointInFill" with the proper type (1) 
+PASS SVGGeometryElement interface: path must inherit property "pathLength" with the proper type 
+PASS SVGGeometryElement interface: path must inherit property "isPointInFill(DOMPoint)" with the proper type 
 PASS SVGGeometryElement interface: calling isPointInFill(DOMPoint) on path with too few arguments must throw TypeError 
-PASS SVGGeometryElement interface: path must inherit property "isPointInStroke" with the proper type (2) 
+PASS SVGGeometryElement interface: path must inherit property "isPointInStroke(DOMPoint)" with the proper type 
 PASS SVGGeometryElement interface: calling isPointInStroke(DOMPoint) on path with too few arguments must throw TypeError 
-PASS SVGGeometryElement interface: path must inherit property "getTotalLength" with the proper type (3) 
-PASS SVGGeometryElement interface: path must inherit property "getPointAtLength" with the proper type (4) 
+PASS SVGGeometryElement interface: path must inherit property "getTotalLength()" with the proper type 
+PASS SVGGeometryElement interface: path must inherit property "getPointAtLength(float)" with the proper type 
 PASS SVGGeometryElement interface: calling getPointAtLength(float) on path with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: path must inherit property "transform" with the proper type (0) 
-PASS SVGGraphicsElement interface: path must inherit property "getBBox" with the proper type (1) 
+PASS SVGGraphicsElement interface: path must inherit property "transform" with the proper type 
+PASS SVGGraphicsElement interface: path must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type 
 PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on path with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: path must inherit property "getCTM" with the proper type (2) 
-PASS SVGGraphicsElement interface: path must inherit property "getScreenCTM" with the proper type (3) 
-PASS SVGGraphicsElement interface: path must inherit property "requiredExtensions" with the proper type (4) 
-PASS SVGGraphicsElement interface: path must inherit property "systemLanguage" with the proper type (5) 
-PASS SVGElement interface: path must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: path must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: path must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: path must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: path must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: path must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: path must inherit property "blur" with the proper type (6) 
+PASS SVGGraphicsElement interface: path must inherit property "getCTM()" with the proper type 
+PASS SVGGraphicsElement interface: path must inherit property "getScreenCTM()" with the proper type 
+PASS SVGGraphicsElement interface: path must inherit property "requiredExtensions" with the proper type 
+PASS SVGGraphicsElement interface: path must inherit property "systemLanguage" with the proper type 
+PASS SVGElement interface: path must inherit property "className" with the proper type 
+PASS SVGElement interface: path must inherit property "dataset" with the proper type 
+PASS SVGElement interface: path must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: path must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: path must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: path must inherit property "focus()" with the proper type 
+PASS SVGElement interface: path must inherit property "blur()" with the proper type 
 PASS SVGRectElement interface: existence and properties of interface object 
 PASS SVGRectElement interface object length 
 PASS SVGRectElement interface object name 
@@ -803,34 +803,34 @@
 PASS SVGRectElement interface: attribute ry 
 PASS SVGRectElement must be primary interface of rect 
 PASS Stringification of rect 
-PASS SVGRectElement interface: rect must inherit property "x" with the proper type (0) 
-PASS SVGRectElement interface: rect must inherit property "y" with the proper type (1) 
-PASS SVGRectElement interface: rect must inherit property "width" with the proper type (2) 
-PASS SVGRectElement interface: rect must inherit property "height" with the proper type (3) 
-PASS SVGRectElement interface: rect must inherit property "rx" with the proper type (4) 
-PASS SVGRectElement interface: rect must inherit property "ry" with the proper type (5) 
-PASS SVGGeometryElement interface: rect must inherit property "pathLength" with the proper type (0) 
-PASS SVGGeometryElement interface: rect must inherit property "isPointInFill" with the proper type (1) 
+PASS SVGRectElement interface: rect must inherit property "x" with the proper type 
+PASS SVGRectElement interface: rect must inherit property "y" with the proper type 
+PASS SVGRectElement interface: rect must inherit property "width" with the proper type 
+PASS SVGRectElement interface: rect must inherit property "height" with the proper type 
+PASS SVGRectElement interface: rect must inherit property "rx" with the proper type 
+PASS SVGRectElement interface: rect must inherit property "ry" with the proper type 
+PASS SVGGeometryElement interface: rect must inherit property "pathLength" with the proper type 
+PASS SVGGeometryElement interface: rect must inherit property "isPointInFill(DOMPoint)" with the proper type 
 PASS SVGGeometryElement interface: calling isPointInFill(DOMPoint) on rect with too few arguments must throw TypeError 
-PASS SVGGeometryElement interface: rect must inherit property "isPointInStroke" with the proper type (2) 
+PASS SVGGeometryElement interface: rect must inherit property "isPointInStroke(DOMPoint)" with the proper type 
 PASS SVGGeometryElement interface: calling isPointInStroke(DOMPoint) on rect with too few arguments must throw TypeError 
-PASS SVGGeometryElement interface: rect must inherit property "getTotalLength" with the proper type (3) 
-PASS SVGGeometryElement interface: rect must inherit property "getPointAtLength" with the proper type (4) 
+PASS SVGGeometryElement interface: rect must inherit property "getTotalLength()" with the proper type 
+PASS SVGGeometryElement interface: rect must inherit property "getPointAtLength(float)" with the proper type 
 PASS SVGGeometryElement interface: calling getPointAtLength(float) on rect with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: rect must inherit property "transform" with the proper type (0) 
-PASS SVGGraphicsElement interface: rect must inherit property "getBBox" with the proper type (1) 
+PASS SVGGraphicsElement interface: rect must inherit property "transform" with the proper type 
+PASS SVGGraphicsElement interface: rect must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type 
 PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on rect with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: rect must inherit property "getCTM" with the proper type (2) 
-PASS SVGGraphicsElement interface: rect must inherit property "getScreenCTM" with the proper type (3) 
-PASS SVGGraphicsElement interface: rect must inherit property "requiredExtensions" with the proper type (4) 
-PASS SVGGraphicsElement interface: rect must inherit property "systemLanguage" with the proper type (5) 
-PASS SVGElement interface: rect must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: rect must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: rect must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: rect must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: rect must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: rect must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: rect must inherit property "blur" with the proper type (6) 
+PASS SVGGraphicsElement interface: rect must inherit property "getCTM()" with the proper type 
+PASS SVGGraphicsElement interface: rect must inherit property "getScreenCTM()" with the proper type 
+PASS SVGGraphicsElement interface: rect must inherit property "requiredExtensions" with the proper type 
+PASS SVGGraphicsElement interface: rect must inherit property "systemLanguage" with the proper type 
+PASS SVGElement interface: rect must inherit property "className" with the proper type 
+PASS SVGElement interface: rect must inherit property "dataset" with the proper type 
+PASS SVGElement interface: rect must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: rect must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: rect must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: rect must inherit property "focus()" with the proper type 
+PASS SVGElement interface: rect must inherit property "blur()" with the proper type 
 PASS SVGCircleElement interface: existence and properties of interface object 
 PASS SVGCircleElement interface object length 
 PASS SVGCircleElement interface object name 
@@ -841,31 +841,31 @@
 PASS SVGCircleElement interface: attribute r 
 PASS SVGCircleElement must be primary interface of circle 
 PASS Stringification of circle 
-PASS SVGCircleElement interface: circle must inherit property "cx" with the proper type (0) 
-PASS SVGCircleElement interface: circle must inherit property "cy" with the proper type (1) 
-PASS SVGCircleElement interface: circle must inherit property "r" with the proper type (2) 
-PASS SVGGeometryElement interface: circle must inherit property "pathLength" with the proper type (0) 
-PASS SVGGeometryElement interface: circle must inherit property "isPointInFill" with the proper type (1) 
+PASS SVGCircleElement interface: circle must inherit property "cx" with the proper type 
+PASS SVGCircleElement interface: circle must inherit property "cy" with the proper type 
+PASS SVGCircleElement interface: circle must inherit property "r" with the proper type 
+PASS SVGGeometryElement interface: circle must inherit property "pathLength" with the proper type 
+PASS SVGGeometryElement interface: circle must inherit property "isPointInFill(DOMPoint)" with the proper type 
 PASS SVGGeometryElement interface: calling isPointInFill(DOMPoint) on circle with too few arguments must throw TypeError 
-PASS SVGGeometryElement interface: circle must inherit property "isPointInStroke" with the proper type (2) 
+PASS SVGGeometryElement interface: circle must inherit property "isPointInStroke(DOMPoint)" with the proper type 
 PASS SVGGeometryElement interface: calling isPointInStroke(DOMPoint) on circle with too few arguments must throw TypeError 
-PASS SVGGeometryElement interface: circle must inherit property "getTotalLength" with the proper type (3) 
-PASS SVGGeometryElement interface: circle must inherit property "getPointAtLength" with the proper type (4) 
+PASS SVGGeometryElement interface: circle must inherit property "getTotalLength()" with the proper type 
+PASS SVGGeometryElement interface: circle must inherit property "getPointAtLength(float)" with the proper type 
 PASS SVGGeometryElement interface: calling getPointAtLength(float) on circle with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: circle must inherit property "transform" with the proper type (0) 
-PASS SVGGraphicsElement interface: circle must inherit property "getBBox" with the proper type (1) 
+PASS SVGGraphicsElement interface: circle must inherit property "transform" with the proper type 
+PASS SVGGraphicsElement interface: circle must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type 
 PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on circle with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: circle must inherit property "getCTM" with the proper type (2) 
-PASS SVGGraphicsElement interface: circle must inherit property "getScreenCTM" with the proper type (3) 
-PASS SVGGraphicsElement interface: circle must inherit property "requiredExtensions" with the proper type (4) 
-PASS SVGGraphicsElement interface: circle must inherit property "systemLanguage" with the proper type (5) 
-PASS SVGElement interface: circle must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: circle must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: circle must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: circle must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: circle must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: circle must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: circle must inherit property "blur" with the proper type (6) 
+PASS SVGGraphicsElement interface: circle must inherit property "getCTM()" with the proper type 
+PASS SVGGraphicsElement interface: circle must inherit property "getScreenCTM()" with the proper type 
+PASS SVGGraphicsElement interface: circle must inherit property "requiredExtensions" with the proper type 
+PASS SVGGraphicsElement interface: circle must inherit property "systemLanguage" with the proper type 
+PASS SVGElement interface: circle must inherit property "className" with the proper type 
+PASS SVGElement interface: circle must inherit property "dataset" with the proper type 
+PASS SVGElement interface: circle must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: circle must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: circle must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: circle must inherit property "focus()" with the proper type 
+PASS SVGElement interface: circle must inherit property "blur()" with the proper type 
 PASS SVGEllipseElement interface: existence and properties of interface object 
 PASS SVGEllipseElement interface object length 
 PASS SVGEllipseElement interface object name 
@@ -877,32 +877,32 @@
 PASS SVGEllipseElement interface: attribute ry 
 PASS SVGEllipseElement must be primary interface of ellipse 
 PASS Stringification of ellipse 
-PASS SVGEllipseElement interface: ellipse must inherit property "cx" with the proper type (0) 
-PASS SVGEllipseElement interface: ellipse must inherit property "cy" with the proper type (1) 
-PASS SVGEllipseElement interface: ellipse must inherit property "rx" with the proper type (2) 
-PASS SVGEllipseElement interface: ellipse must inherit property "ry" with the proper type (3) 
-PASS SVGGeometryElement interface: ellipse must inherit property "pathLength" with the proper type (0) 
-PASS SVGGeometryElement interface: ellipse must inherit property "isPointInFill" with the proper type (1) 
+PASS SVGEllipseElement interface: ellipse must inherit property "cx" with the proper type 
+PASS SVGEllipseElement interface: ellipse must inherit property "cy" with the proper type 
+PASS SVGEllipseElement interface: ellipse must inherit property "rx" with the proper type 
+PASS SVGEllipseElement interface: ellipse must inherit property "ry" with the proper type 
+PASS SVGGeometryElement interface: ellipse must inherit property "pathLength" with the proper type 
+PASS SVGGeometryElement interface: ellipse must inherit property "isPointInFill(DOMPoint)" with the proper type 
 PASS SVGGeometryElement interface: calling isPointInFill(DOMPoint) on ellipse with too few arguments must throw TypeError 
-PASS SVGGeometryElement interface: ellipse must inherit property "isPointInStroke" with the proper type (2) 
+PASS SVGGeometryElement interface: ellipse must inherit property "isPointInStroke(DOMPoint)" with the proper type 
 PASS SVGGeometryElement interface: calling isPointInStroke(DOMPoint) on ellipse with too few arguments must throw TypeError 
-PASS SVGGeometryElement interface: ellipse must inherit property "getTotalLength" with the proper type (3) 
-PASS SVGGeometryElement interface: ellipse must inherit property "getPointAtLength" with the proper type (4) 
+PASS SVGGeometryElement interface: ellipse must inherit property "getTotalLength()" with the proper type 
+PASS SVGGeometryElement interface: ellipse must inherit property "getPointAtLength(float)" with the proper type 
 PASS SVGGeometryElement interface: calling getPointAtLength(float) on ellipse with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: ellipse must inherit property "transform" with the proper type (0) 
-PASS SVGGraphicsElement interface: ellipse must inherit property "getBBox" with the proper type (1) 
+PASS SVGGraphicsElement interface: ellipse must inherit property "transform" with the proper type 
+PASS SVGGraphicsElement interface: ellipse must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type 
 PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on ellipse with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: ellipse must inherit property "getCTM" with the proper type (2) 
-PASS SVGGraphicsElement interface: ellipse must inherit property "getScreenCTM" with the proper type (3) 
-PASS SVGGraphicsElement interface: ellipse must inherit property "requiredExtensions" with the proper type (4) 
-PASS SVGGraphicsElement interface: ellipse must inherit property "systemLanguage" with the proper type (5) 
-PASS SVGElement interface: ellipse must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: ellipse must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: ellipse must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: ellipse must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: ellipse must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: ellipse must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: ellipse must inherit property "blur" with the proper type (6) 
+PASS SVGGraphicsElement interface: ellipse must inherit property "getCTM()" with the proper type 
+PASS SVGGraphicsElement interface: ellipse must inherit property "getScreenCTM()" with the proper type 
+PASS SVGGraphicsElement interface: ellipse must inherit property "requiredExtensions" with the proper type 
+PASS SVGGraphicsElement interface: ellipse must inherit property "systemLanguage" with the proper type 
+PASS SVGElement interface: ellipse must inherit property "className" with the proper type 
+PASS SVGElement interface: ellipse must inherit property "dataset" with the proper type 
+PASS SVGElement interface: ellipse must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: ellipse must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: ellipse must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: ellipse must inherit property "focus()" with the proper type 
+PASS SVGElement interface: ellipse must inherit property "blur()" with the proper type 
 PASS SVGLineElement interface: existence and properties of interface object 
 PASS SVGLineElement interface object length 
 PASS SVGLineElement interface object name 
@@ -914,32 +914,32 @@
 PASS SVGLineElement interface: attribute y2 
 PASS SVGLineElement must be primary interface of line 
 PASS Stringification of line 
-PASS SVGLineElement interface: line must inherit property "x1" with the proper type (0) 
-PASS SVGLineElement interface: line must inherit property "y1" with the proper type (1) 
-PASS SVGLineElement interface: line must inherit property "x2" with the proper type (2) 
-PASS SVGLineElement interface: line must inherit property "y2" with the proper type (3) 
-PASS SVGGeometryElement interface: line must inherit property "pathLength" with the proper type (0) 
-PASS SVGGeometryElement interface: line must inherit property "isPointInFill" with the proper type (1) 
+PASS SVGLineElement interface: line must inherit property "x1" with the proper type 
+PASS SVGLineElement interface: line must inherit property "y1" with the proper type 
+PASS SVGLineElement interface: line must inherit property "x2" with the proper type 
+PASS SVGLineElement interface: line must inherit property "y2" with the proper type 
+PASS SVGGeometryElement interface: line must inherit property "pathLength" with the proper type 
+PASS SVGGeometryElement interface: line must inherit property "isPointInFill(DOMPoint)" with the proper type 
 PASS SVGGeometryElement interface: calling isPointInFill(DOMPoint) on line with too few arguments must throw TypeError 
-PASS SVGGeometryElement interface: line must inherit property "isPointInStroke" with the proper type (2) 
+PASS SVGGeometryElement interface: line must inherit property "isPointInStroke(DOMPoint)" with the proper type 
 PASS SVGGeometryElement interface: calling isPointInStroke(DOMPoint) on line with too few arguments must throw TypeError 
-PASS SVGGeometryElement interface: line must inherit property "getTotalLength" with the proper type (3) 
-PASS SVGGeometryElement interface: line must inherit property "getPointAtLength" with the proper type (4) 
+PASS SVGGeometryElement interface: line must inherit property "getTotalLength()" with the proper type 
+PASS SVGGeometryElement interface: line must inherit property "getPointAtLength(float)" with the proper type 
 PASS SVGGeometryElement interface: calling getPointAtLength(float) on line with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: line must inherit property "transform" with the proper type (0) 
-PASS SVGGraphicsElement interface: line must inherit property "getBBox" with the proper type (1) 
+PASS SVGGraphicsElement interface: line must inherit property "transform" with the proper type 
+PASS SVGGraphicsElement interface: line must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type 
 PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on line with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: line must inherit property "getCTM" with the proper type (2) 
-PASS SVGGraphicsElement interface: line must inherit property "getScreenCTM" with the proper type (3) 
-PASS SVGGraphicsElement interface: line must inherit property "requiredExtensions" with the proper type (4) 
-PASS SVGGraphicsElement interface: line must inherit property "systemLanguage" with the proper type (5) 
-PASS SVGElement interface: line must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: line must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: line must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: line must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: line must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: line must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: line must inherit property "blur" with the proper type (6) 
+PASS SVGGraphicsElement interface: line must inherit property "getCTM()" with the proper type 
+PASS SVGGraphicsElement interface: line must inherit property "getScreenCTM()" with the proper type 
+PASS SVGGraphicsElement interface: line must inherit property "requiredExtensions" with the proper type 
+PASS SVGGraphicsElement interface: line must inherit property "systemLanguage" with the proper type 
+PASS SVGElement interface: line must inherit property "className" with the proper type 
+PASS SVGElement interface: line must inherit property "dataset" with the proper type 
+PASS SVGElement interface: line must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: line must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: line must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: line must inherit property "focus()" with the proper type 
+PASS SVGElement interface: line must inherit property "blur()" with the proper type 
 PASS SVGPointList interface: existence and properties of interface object 
 PASS SVGPointList interface object length 
 PASS SVGPointList interface object name 
@@ -950,26 +950,26 @@
 PASS SVGPointList interface: operation clear() 
 PASS SVGPointList interface: operation initialize(DOMPoint) 
 PASS SVGPointList interface: operation getItem(unsigned long) 
-PASS SVGPointList interface: operation insertItemBefore(DOMPoint,unsigned long) 
-PASS SVGPointList interface: operation replaceItem(DOMPoint,unsigned long) 
+PASS SVGPointList interface: operation insertItemBefore(DOMPoint, unsigned long) 
+PASS SVGPointList interface: operation replaceItem(DOMPoint, unsigned long) 
 PASS SVGPointList interface: operation removeItem(unsigned long) 
 PASS SVGPointList interface: operation appendItem(DOMPoint) 
 PASS SVGPointList must be primary interface of polygon.points 
 PASS Stringification of polygon.points 
-PASS SVGPointList interface: polygon.points must inherit property "length" with the proper type (0) 
-PASS SVGPointList interface: polygon.points must inherit property "numberOfItems" with the proper type (1) 
-PASS SVGPointList interface: polygon.points must inherit property "clear" with the proper type (2) 
-PASS SVGPointList interface: polygon.points must inherit property "initialize" with the proper type (3) 
+PASS SVGPointList interface: polygon.points must inherit property "length" with the proper type 
+PASS SVGPointList interface: polygon.points must inherit property "numberOfItems" with the proper type 
+PASS SVGPointList interface: polygon.points must inherit property "clear()" with the proper type 
+PASS SVGPointList interface: polygon.points must inherit property "initialize(DOMPoint)" with the proper type 
 PASS SVGPointList interface: calling initialize(DOMPoint) on polygon.points with too few arguments must throw TypeError 
-PASS SVGPointList interface: polygon.points must inherit property "getItem" with the proper type (4) 
+PASS SVGPointList interface: polygon.points must inherit property "getItem(unsigned long)" with the proper type 
 PASS SVGPointList interface: calling getItem(unsigned long) on polygon.points with too few arguments must throw TypeError 
-PASS SVGPointList interface: polygon.points must inherit property "insertItemBefore" with the proper type (5) 
-PASS SVGPointList interface: calling insertItemBefore(DOMPoint,unsigned long) on polygon.points with too few arguments must throw TypeError 
-PASS SVGPointList interface: polygon.points must inherit property "replaceItem" with the proper type (6) 
-PASS SVGPointList interface: calling replaceItem(DOMPoint,unsigned long) on polygon.points with too few arguments must throw TypeError 
-PASS SVGPointList interface: polygon.points must inherit property "removeItem" with the proper type (7) 
+PASS SVGPointList interface: polygon.points must inherit property "insertItemBefore(DOMPoint, unsigned long)" with the proper type 
+PASS SVGPointList interface: calling insertItemBefore(DOMPoint, unsigned long) on polygon.points with too few arguments must throw TypeError 
+PASS SVGPointList interface: polygon.points must inherit property "replaceItem(DOMPoint, unsigned long)" with the proper type 
+PASS SVGPointList interface: calling replaceItem(DOMPoint, unsigned long) on polygon.points with too few arguments must throw TypeError 
+PASS SVGPointList interface: polygon.points must inherit property "removeItem(unsigned long)" with the proper type 
 PASS SVGPointList interface: calling removeItem(unsigned long) on polygon.points with too few arguments must throw TypeError 
-PASS SVGPointList interface: polygon.points must inherit property "appendItem" with the proper type (8) 
+PASS SVGPointList interface: polygon.points must inherit property "appendItem(DOMPoint)" with the proper type 
 PASS SVGPointList interface: calling appendItem(DOMPoint) on polygon.points with too few arguments must throw TypeError 
 PASS SVGPolylineElement interface: existence and properties of interface object 
 PASS SVGPolylineElement interface object length 
@@ -980,30 +980,30 @@
 PASS SVGPolylineElement interface: attribute animatedPoints 
 PASS SVGPolylineElement must be primary interface of polyline 
 PASS Stringification of polyline 
-PASS SVGPolylineElement interface: polyline must inherit property "points" with the proper type (0) 
-PASS SVGPolylineElement interface: polyline must inherit property "animatedPoints" with the proper type (1) 
-PASS SVGGeometryElement interface: polyline must inherit property "pathLength" with the proper type (0) 
-PASS SVGGeometryElement interface: polyline must inherit property "isPointInFill" with the proper type (1) 
+PASS SVGPolylineElement interface: polyline must inherit property "points" with the proper type 
+PASS SVGPolylineElement interface: polyline must inherit property "animatedPoints" with the proper type 
+PASS SVGGeometryElement interface: polyline must inherit property "pathLength" with the proper type 
+PASS SVGGeometryElement interface: polyline must inherit property "isPointInFill(DOMPoint)" with the proper type 
 PASS SVGGeometryElement interface: calling isPointInFill(DOMPoint) on polyline with too few arguments must throw TypeError 
-PASS SVGGeometryElement interface: polyline must inherit property "isPointInStroke" with the proper type (2) 
+PASS SVGGeometryElement interface: polyline must inherit property "isPointInStroke(DOMPoint)" with the proper type 
 PASS SVGGeometryElement interface: calling isPointInStroke(DOMPoint) on polyline with too few arguments must throw TypeError 
-PASS SVGGeometryElement interface: polyline must inherit property "getTotalLength" with the proper type (3) 
-PASS SVGGeometryElement interface: polyline must inherit property "getPointAtLength" with the proper type (4) 
+PASS SVGGeometryElement interface: polyline must inherit property "getTotalLength()" with the proper type 
+PASS SVGGeometryElement interface: polyline must inherit property "getPointAtLength(float)" with the proper type 
 PASS SVGGeometryElement interface: calling getPointAtLength(float) on polyline with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: polyline must inherit property "transform" with the proper type (0) 
-PASS SVGGraphicsElement interface: polyline must inherit property "getBBox" with the proper type (1) 
+PASS SVGGraphicsElement interface: polyline must inherit property "transform" with the proper type 
+PASS SVGGraphicsElement interface: polyline must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type 
 PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on polyline with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: polyline must inherit property "getCTM" with the proper type (2) 
-PASS SVGGraphicsElement interface: polyline must inherit property "getScreenCTM" with the proper type (3) 
-PASS SVGGraphicsElement interface: polyline must inherit property "requiredExtensions" with the proper type (4) 
-PASS SVGGraphicsElement interface: polyline must inherit property "systemLanguage" with the proper type (5) 
-PASS SVGElement interface: polyline must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: polyline must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: polyline must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: polyline must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: polyline must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: polyline must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: polyline must inherit property "blur" with the proper type (6) 
+PASS SVGGraphicsElement interface: polyline must inherit property "getCTM()" with the proper type 
+PASS SVGGraphicsElement interface: polyline must inherit property "getScreenCTM()" with the proper type 
+PASS SVGGraphicsElement interface: polyline must inherit property "requiredExtensions" with the proper type 
+PASS SVGGraphicsElement interface: polyline must inherit property "systemLanguage" with the proper type 
+PASS SVGElement interface: polyline must inherit property "className" with the proper type 
+PASS SVGElement interface: polyline must inherit property "dataset" with the proper type 
+PASS SVGElement interface: polyline must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: polyline must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: polyline must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: polyline must inherit property "focus()" with the proper type 
+PASS SVGElement interface: polyline must inherit property "blur()" with the proper type 
 PASS SVGPolygonElement interface: existence and properties of interface object 
 PASS SVGPolygonElement interface object length 
 PASS SVGPolygonElement interface object name 
@@ -1013,30 +1013,30 @@
 PASS SVGPolygonElement interface: attribute animatedPoints 
 PASS SVGPolygonElement must be primary interface of polygon 
 PASS Stringification of polygon 
-PASS SVGPolygonElement interface: polygon must inherit property "points" with the proper type (0) 
-PASS SVGPolygonElement interface: polygon must inherit property "animatedPoints" with the proper type (1) 
-PASS SVGGeometryElement interface: polygon must inherit property "pathLength" with the proper type (0) 
-PASS SVGGeometryElement interface: polygon must inherit property "isPointInFill" with the proper type (1) 
+PASS SVGPolygonElement interface: polygon must inherit property "points" with the proper type 
+PASS SVGPolygonElement interface: polygon must inherit property "animatedPoints" with the proper type 
+PASS SVGGeometryElement interface: polygon must inherit property "pathLength" with the proper type 
+PASS SVGGeometryElement interface: polygon must inherit property "isPointInFill(DOMPoint)" with the proper type 
 PASS SVGGeometryElement interface: calling isPointInFill(DOMPoint) on polygon with too few arguments must throw TypeError 
-PASS SVGGeometryElement interface: polygon must inherit property "isPointInStroke" with the proper type (2) 
+PASS SVGGeometryElement interface: polygon must inherit property "isPointInStroke(DOMPoint)" with the proper type 
 PASS SVGGeometryElement interface: calling isPointInStroke(DOMPoint) on polygon with too few arguments must throw TypeError 
-PASS SVGGeometryElement interface: polygon must inherit property "getTotalLength" with the proper type (3) 
-PASS SVGGeometryElement interface: polygon must inherit property "getPointAtLength" with the proper type (4) 
+PASS SVGGeometryElement interface: polygon must inherit property "getTotalLength()" with the proper type 
+PASS SVGGeometryElement interface: polygon must inherit property "getPointAtLength(float)" with the proper type 
 PASS SVGGeometryElement interface: calling getPointAtLength(float) on polygon with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: polygon must inherit property "transform" with the proper type (0) 
-PASS SVGGraphicsElement interface: polygon must inherit property "getBBox" with the proper type (1) 
+PASS SVGGraphicsElement interface: polygon must inherit property "transform" with the proper type 
+PASS SVGGraphicsElement interface: polygon must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type 
 PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on polygon with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: polygon must inherit property "getCTM" with the proper type (2) 
-PASS SVGGraphicsElement interface: polygon must inherit property "getScreenCTM" with the proper type (3) 
-PASS SVGGraphicsElement interface: polygon must inherit property "requiredExtensions" with the proper type (4) 
-PASS SVGGraphicsElement interface: polygon must inherit property "systemLanguage" with the proper type (5) 
-PASS SVGElement interface: polygon must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: polygon must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: polygon must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: polygon must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: polygon must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: polygon must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: polygon must inherit property "blur" with the proper type (6) 
+PASS SVGGraphicsElement interface: polygon must inherit property "getCTM()" with the proper type 
+PASS SVGGraphicsElement interface: polygon must inherit property "getScreenCTM()" with the proper type 
+PASS SVGGraphicsElement interface: polygon must inherit property "requiredExtensions" with the proper type 
+PASS SVGGraphicsElement interface: polygon must inherit property "systemLanguage" with the proper type 
+PASS SVGElement interface: polygon must inherit property "className" with the proper type 
+PASS SVGElement interface: polygon must inherit property "dataset" with the proper type 
+PASS SVGElement interface: polygon must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: polygon must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: polygon must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: polygon must inherit property "focus()" with the proper type 
+PASS SVGElement interface: polygon must inherit property "blur()" with the proper type 
 PASS SVGTextContentElement interface: existence and properties of interface object 
 PASS SVGTextContentElement interface object length 
 PASS SVGTextContentElement interface object name 
@@ -1052,50 +1052,50 @@
 PASS SVGTextContentElement interface: attribute lengthAdjust 
 PASS SVGTextContentElement interface: operation getNumberOfChars() 
 PASS SVGTextContentElement interface: operation getComputedTextLength() 
-PASS SVGTextContentElement interface: operation getSubStringLength(unsigned long,unsigned long) 
+PASS SVGTextContentElement interface: operation getSubStringLength(unsigned long, unsigned long) 
 PASS SVGTextContentElement interface: operation getStartPositionOfChar(unsigned long) 
 PASS SVGTextContentElement interface: operation getEndPositionOfChar(unsigned long) 
 PASS SVGTextContentElement interface: operation getExtentOfChar(unsigned long) 
 PASS SVGTextContentElement interface: operation getRotationOfChar(unsigned long) 
 PASS SVGTextContentElement interface: operation getCharNumAtPosition(DOMPoint) 
-PASS SVGTextContentElement interface: operation selectSubString(unsigned long,unsigned long) 
+PASS SVGTextContentElement interface: operation selectSubString(unsigned long, unsigned long) 
 FAIL SVGTextContentElement must be primary interface of textContent assert_equals: textContent's prototype is not SVGTextContentElement.prototype expected object "[object SVGTextContentElement]" but got object "[object SVGElement]"
 FAIL Stringification of textContent assert_equals: class string of textContent expected "[object SVGTextContentElement]" but got "[object SVGElement]"
-FAIL SVGTextContentElement interface: textContent must inherit property "LENGTHADJUST_UNKNOWN" with the proper type (0) assert_inherits: property "LENGTHADJUST_UNKNOWN" not found in prototype chain
-FAIL SVGTextContentElement interface: textContent must inherit property "LENGTHADJUST_SPACING" with the proper type (1) assert_inherits: property "LENGTHADJUST_SPACING" not found in prototype chain
-FAIL SVGTextContentElement interface: textContent must inherit property "LENGTHADJUST_SPACINGANDGLYPHS" with the proper type (2) assert_inherits: property "LENGTHADJUST_SPACINGANDGLYPHS" not found in prototype chain
-FAIL SVGTextContentElement interface: textContent must inherit property "textLength" with the proper type (3) assert_inherits: property "textLength" not found in prototype chain
-FAIL SVGTextContentElement interface: textContent must inherit property "lengthAdjust" with the proper type (4) assert_inherits: property "lengthAdjust" not found in prototype chain
-FAIL SVGTextContentElement interface: textContent must inherit property "getNumberOfChars" with the proper type (5) assert_inherits: property "getNumberOfChars" not found in prototype chain
-FAIL SVGTextContentElement interface: textContent must inherit property "getComputedTextLength" with the proper type (6) assert_inherits: property "getComputedTextLength" not found in prototype chain
-FAIL SVGTextContentElement interface: textContent must inherit property "getSubStringLength" with the proper type (7) assert_inherits: property "getSubStringLength" not found in prototype chain
-FAIL SVGTextContentElement interface: calling getSubStringLength(unsigned long,unsigned long) on textContent with too few arguments must throw TypeError assert_inherits: property "getSubStringLength" not found in prototype chain
-FAIL SVGTextContentElement interface: textContent must inherit property "getStartPositionOfChar" with the proper type (8) assert_inherits: property "getStartPositionOfChar" not found in prototype chain
+FAIL SVGTextContentElement interface: textContent must inherit property "LENGTHADJUST_UNKNOWN" with the proper type assert_inherits: property "LENGTHADJUST_UNKNOWN" not found in prototype chain
+FAIL SVGTextContentElement interface: textContent must inherit property "LENGTHADJUST_SPACING" with the proper type assert_inherits: property "LENGTHADJUST_SPACING" not found in prototype chain
+FAIL SVGTextContentElement interface: textContent must inherit property "LENGTHADJUST_SPACINGANDGLYPHS" with the proper type assert_inherits: property "LENGTHADJUST_SPACINGANDGLYPHS" not found in prototype chain
+FAIL SVGTextContentElement interface: textContent must inherit property "textLength" with the proper type assert_inherits: property "textLength" not found in prototype chain
+FAIL SVGTextContentElement interface: textContent must inherit property "lengthAdjust" with the proper type assert_inherits: property "lengthAdjust" not found in prototype chain
+FAIL SVGTextContentElement interface: textContent must inherit property "getNumberOfChars()" with the proper type assert_inherits: property "getNumberOfChars" not found in prototype chain
+FAIL SVGTextContentElement interface: textContent must inherit property "getComputedTextLength()" with the proper type assert_inherits: property "getComputedTextLength" not found in prototype chain
+FAIL SVGTextContentElement interface: textContent must inherit property "getSubStringLength(unsigned long, unsigned long)" with the proper type assert_inherits: property "getSubStringLength" not found in prototype chain
+FAIL SVGTextContentElement interface: calling getSubStringLength(unsigned long, unsigned long) on textContent with too few arguments must throw TypeError assert_inherits: property "getSubStringLength" not found in prototype chain
+FAIL SVGTextContentElement interface: textContent must inherit property "getStartPositionOfChar(unsigned long)" with the proper type assert_inherits: property "getStartPositionOfChar" not found in prototype chain
 FAIL SVGTextContentElement interface: calling getStartPositionOfChar(unsigned long) on textContent with too few arguments must throw TypeError assert_inherits: property "getStartPositionOfChar" not found in prototype chain
-FAIL SVGTextContentElement interface: textContent must inherit property "getEndPositionOfChar" with the proper type (9) assert_inherits: property "getEndPositionOfChar" not found in prototype chain
+FAIL SVGTextContentElement interface: textContent must inherit property "getEndPositionOfChar(unsigned long)" with the proper type assert_inherits: property "getEndPositionOfChar" not found in prototype chain
 FAIL SVGTextContentElement interface: calling getEndPositionOfChar(unsigned long) on textContent with too few arguments must throw TypeError assert_inherits: property "getEndPositionOfChar" not found in prototype chain
-FAIL SVGTextContentElement interface: textContent must inherit property "getExtentOfChar" with the proper type (10) assert_inherits: property "getExtentOfChar" not found in prototype chain
+FAIL SVGTextContentElement interface: textContent must inherit property "getExtentOfChar(unsigned long)" with the proper type assert_inherits: property "getExtentOfChar" not found in prototype chain
 FAIL SVGTextContentElement interface: calling getExtentOfChar(unsigned long) on textContent with too few arguments must throw TypeError assert_inherits: property "getExtentOfChar" not found in prototype chain
-FAIL SVGTextContentElement interface: textContent must inherit property "getRotationOfChar" with the proper type (11) assert_inherits: property "getRotationOfChar" not found in prototype chain
+FAIL SVGTextContentElement interface: textContent must inherit property "getRotationOfChar(unsigned long)" with the proper type assert_inherits: property "getRotationOfChar" not found in prototype chain
 FAIL SVGTextContentElement interface: calling getRotationOfChar(unsigned long) on textContent with too few arguments must throw TypeError assert_inherits: property "getRotationOfChar" not found in prototype chain
-FAIL SVGTextContentElement interface: textContent must inherit property "getCharNumAtPosition" with the proper type (12) assert_inherits: property "getCharNumAtPosition" not found in prototype chain
+FAIL SVGTextContentElement interface: textContent must inherit property "getCharNumAtPosition(DOMPoint)" with the proper type assert_inherits: property "getCharNumAtPosition" not found in prototype chain
 FAIL SVGTextContentElement interface: calling getCharNumAtPosition(DOMPoint) on textContent with too few arguments must throw TypeError assert_inherits: property "getCharNumAtPosition" not found in prototype chain
-FAIL SVGTextContentElement interface: textContent must inherit property "selectSubString" with the proper type (13) assert_inherits: property "selectSubString" not found in prototype chain
-FAIL SVGTextContentElement interface: calling selectSubString(unsigned long,unsigned long) on textContent with too few arguments must throw TypeError assert_inherits: property "selectSubString" not found in prototype chain
-FAIL SVGGraphicsElement interface: textContent must inherit property "transform" with the proper type (0) assert_inherits: property "transform" not found in prototype chain
-FAIL SVGGraphicsElement interface: textContent must inherit property "getBBox" with the proper type (1) assert_inherits: property "getBBox" not found in prototype chain
+FAIL SVGTextContentElement interface: textContent must inherit property "selectSubString(unsigned long, unsigned long)" with the proper type assert_inherits: property "selectSubString" not found in prototype chain
+FAIL SVGTextContentElement interface: calling selectSubString(unsigned long, unsigned long) on textContent with too few arguments must throw TypeError assert_inherits: property "selectSubString" not found in prototype chain
+FAIL SVGGraphicsElement interface: textContent must inherit property "transform" with the proper type assert_inherits: property "transform" not found in prototype chain
+FAIL SVGGraphicsElement interface: textContent must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type assert_inherits: property "getBBox" not found in prototype chain
 FAIL SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on textContent with too few arguments must throw TypeError assert_inherits: property "getBBox" not found in prototype chain
-FAIL SVGGraphicsElement interface: textContent must inherit property "getCTM" with the proper type (2) assert_inherits: property "getCTM" not found in prototype chain
-FAIL SVGGraphicsElement interface: textContent must inherit property "getScreenCTM" with the proper type (3) assert_inherits: property "getScreenCTM" not found in prototype chain
-FAIL SVGGraphicsElement interface: textContent must inherit property "requiredExtensions" with the proper type (4) assert_inherits: property "requiredExtensions" not found in prototype chain
-FAIL SVGGraphicsElement interface: textContent must inherit property "systemLanguage" with the proper type (5) assert_inherits: property "systemLanguage" not found in prototype chain
-PASS SVGElement interface: textContent must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: textContent must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: textContent must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: textContent must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: textContent must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: textContent must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: textContent must inherit property "blur" with the proper type (6) 
+FAIL SVGGraphicsElement interface: textContent must inherit property "getCTM()" with the proper type assert_inherits: property "getCTM" not found in prototype chain
+FAIL SVGGraphicsElement interface: textContent must inherit property "getScreenCTM()" with the proper type assert_inherits: property "getScreenCTM" not found in prototype chain
+FAIL SVGGraphicsElement interface: textContent must inherit property "requiredExtensions" with the proper type assert_inherits: property "requiredExtensions" not found in prototype chain
+FAIL SVGGraphicsElement interface: textContent must inherit property "systemLanguage" with the proper type assert_inherits: property "systemLanguage" not found in prototype chain
+PASS SVGElement interface: textContent must inherit property "className" with the proper type 
+PASS SVGElement interface: textContent must inherit property "dataset" with the proper type 
+PASS SVGElement interface: textContent must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: textContent must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: textContent must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: textContent must inherit property "focus()" with the proper type 
+PASS SVGElement interface: textContent must inherit property "blur()" with the proper type 
 PASS SVGTextPositioningElement interface: existence and properties of interface object 
 PASS SVGTextPositioningElement interface object length 
 PASS SVGTextPositioningElement interface object name 
@@ -1113,46 +1113,46 @@
 PASS SVGTextElement interface: existence and properties of interface prototype object's "constructor" property 
 PASS SVGTextElement must be primary interface of text 
 PASS Stringification of text 
-PASS SVGTextPositioningElement interface: text must inherit property "x" with the proper type (0) 
-PASS SVGTextPositioningElement interface: text must inherit property "y" with the proper type (1) 
-PASS SVGTextPositioningElement interface: text must inherit property "dx" with the proper type (2) 
-PASS SVGTextPositioningElement interface: text must inherit property "dy" with the proper type (3) 
-PASS SVGTextPositioningElement interface: text must inherit property "rotate" with the proper type (4) 
-PASS SVGTextContentElement interface: text must inherit property "LENGTHADJUST_UNKNOWN" with the proper type (0) 
-PASS SVGTextContentElement interface: text must inherit property "LENGTHADJUST_SPACING" with the proper type (1) 
-PASS SVGTextContentElement interface: text must inherit property "LENGTHADJUST_SPACINGANDGLYPHS" with the proper type (2) 
-PASS SVGTextContentElement interface: text must inherit property "textLength" with the proper type (3) 
-PASS SVGTextContentElement interface: text must inherit property "lengthAdjust" with the proper type (4) 
-PASS SVGTextContentElement interface: text must inherit property "getNumberOfChars" with the proper type (5) 
-PASS SVGTextContentElement interface: text must inherit property "getComputedTextLength" with the proper type (6) 
-PASS SVGTextContentElement interface: text must inherit property "getSubStringLength" with the proper type (7) 
-PASS SVGTextContentElement interface: calling getSubStringLength(unsigned long,unsigned long) on text with too few arguments must throw TypeError 
-PASS SVGTextContentElement interface: text must inherit property "getStartPositionOfChar" with the proper type (8) 
+PASS SVGTextPositioningElement interface: text must inherit property "x" with the proper type 
+PASS SVGTextPositioningElement interface: text must inherit property "y" with the proper type 
+PASS SVGTextPositioningElement interface: text must inherit property "dx" with the proper type 
+PASS SVGTextPositioningElement interface: text must inherit property "dy" with the proper type 
+PASS SVGTextPositioningElement interface: text must inherit property "rotate" with the proper type 
+PASS SVGTextContentElement interface: text must inherit property "LENGTHADJUST_UNKNOWN" with the proper type 
+PASS SVGTextContentElement interface: text must inherit property "LENGTHADJUST_SPACING" with the proper type 
+PASS SVGTextContentElement interface: text must inherit property "LENGTHADJUST_SPACINGANDGLYPHS" with the proper type 
+PASS SVGTextContentElement interface: text must inherit property "textLength" with the proper type 
+PASS SVGTextContentElement interface: text must inherit property "lengthAdjust" with the proper type 
+PASS SVGTextContentElement interface: text must inherit property "getNumberOfChars()" with the proper type 
+PASS SVGTextContentElement interface: text must inherit property "getComputedTextLength()" with the proper type 
+PASS SVGTextContentElement interface: text must inherit property "getSubStringLength(unsigned long, unsigned long)" with the proper type 
+PASS SVGTextContentElement interface: calling getSubStringLength(unsigned long, unsigned long) on text with too few arguments must throw TypeError 
+PASS SVGTextContentElement interface: text must inherit property "getStartPositionOfChar(unsigned long)" with the proper type 
 PASS SVGTextContentElement interface: calling getStartPositionOfChar(unsigned long) on text with too few arguments must throw TypeError 
-PASS SVGTextContentElement interface: text must inherit property "getEndPositionOfChar" with the proper type (9) 
+PASS SVGTextContentElement interface: text must inherit property "getEndPositionOfChar(unsigned long)" with the proper type 
 PASS SVGTextContentElement interface: calling getEndPositionOfChar(unsigned long) on text with too few arguments must throw TypeError 
-PASS SVGTextContentElement interface: text must inherit property "getExtentOfChar" with the proper type (10) 
+PASS SVGTextContentElement interface: text must inherit property "getExtentOfChar(unsigned long)" with the proper type 
 PASS SVGTextContentElement interface: calling getExtentOfChar(unsigned long) on text with too few arguments must throw TypeError 
-PASS SVGTextContentElement interface: text must inherit property "getRotationOfChar" with the proper type (11) 
+PASS SVGTextContentElement interface: text must inherit property "getRotationOfChar(unsigned long)" with the proper type 
 PASS SVGTextContentElement interface: calling getRotationOfChar(unsigned long) on text with too few arguments must throw TypeError 
-PASS SVGTextContentElement interface: text must inherit property "getCharNumAtPosition" with the proper type (12) 
+PASS SVGTextContentElement interface: text must inherit property "getCharNumAtPosition(DOMPoint)" with the proper type 
 PASS SVGTextContentElement interface: calling getCharNumAtPosition(DOMPoint) on text with too few arguments must throw TypeError 
-PASS SVGTextContentElement interface: text must inherit property "selectSubString" with the proper type (13) 
-PASS SVGTextContentElement interface: calling selectSubString(unsigned long,unsigned long) on text with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: text must inherit property "transform" with the proper type (0) 
-PASS SVGGraphicsElement interface: text must inherit property "getBBox" with the proper type (1) 
+PASS SVGTextContentElement interface: text must inherit property "selectSubString(unsigned long, unsigned long)" with the proper type 
+PASS SVGTextContentElement interface: calling selectSubString(unsigned long, unsigned long) on text with too few arguments must throw TypeError 
+PASS SVGGraphicsElement interface: text must inherit property "transform" with the proper type 
+PASS SVGGraphicsElement interface: text must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type 
 PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on text with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: text must inherit property "getCTM" with the proper type (2) 
-PASS SVGGraphicsElement interface: text must inherit property "getScreenCTM" with the proper type (3) 
-PASS SVGGraphicsElement interface: text must inherit property "requiredExtensions" with the proper type (4) 
-PASS SVGGraphicsElement interface: text must inherit property "systemLanguage" with the proper type (5) 
-PASS SVGElement interface: text must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: text must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: text must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: text must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: text must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: text must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: text must inherit property "blur" with the proper type (6) 
+PASS SVGGraphicsElement interface: text must inherit property "getCTM()" with the proper type 
+PASS SVGGraphicsElement interface: text must inherit property "getScreenCTM()" with the proper type 
+PASS SVGGraphicsElement interface: text must inherit property "requiredExtensions" with the proper type 
+PASS SVGGraphicsElement interface: text must inherit property "systemLanguage" with the proper type 
+PASS SVGElement interface: text must inherit property "className" with the proper type 
+PASS SVGElement interface: text must inherit property "dataset" with the proper type 
+PASS SVGElement interface: text must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: text must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: text must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: text must inherit property "focus()" with the proper type 
+PASS SVGElement interface: text must inherit property "blur()" with the proper type 
 PASS SVGTSpanElement interface: existence and properties of interface object 
 PASS SVGTSpanElement interface object length 
 PASS SVGTSpanElement interface object name 
@@ -1160,46 +1160,46 @@
 PASS SVGTSpanElement interface: existence and properties of interface prototype object's "constructor" property 
 PASS SVGTSpanElement must be primary interface of tspan 
 PASS Stringification of tspan 
-PASS SVGTextPositioningElement interface: tspan must inherit property "x" with the proper type (0) 
-PASS SVGTextPositioningElement interface: tspan must inherit property "y" with the proper type (1) 
-PASS SVGTextPositioningElement interface: tspan must inherit property "dx" with the proper type (2) 
-PASS SVGTextPositioningElement interface: tspan must inherit property "dy" with the proper type (3) 
-PASS SVGTextPositioningElement interface: tspan must inherit property "rotate" with the proper type (4) 
-PASS SVGTextContentElement interface: tspan must inherit property "LENGTHADJUST_UNKNOWN" with the proper type (0) 
-PASS SVGTextContentElement interface: tspan must inherit property "LENGTHADJUST_SPACING" with the proper type (1) 
-PASS SVGTextContentElement interface: tspan must inherit property "LENGTHADJUST_SPACINGANDGLYPHS" with the proper type (2) 
-PASS SVGTextContentElement interface: tspan must inherit property "textLength" with the proper type (3) 
-PASS SVGTextContentElement interface: tspan must inherit property "lengthAdjust" with the proper type (4) 
-PASS SVGTextContentElement interface: tspan must inherit property "getNumberOfChars" with the proper type (5) 
-PASS SVGTextContentElement interface: tspan must inherit property "getComputedTextLength" with the proper type (6) 
-PASS SVGTextContentElement interface: tspan must inherit property "getSubStringLength" with the proper type (7) 
-PASS SVGTextContentElement interface: calling getSubStringLength(unsigned long,unsigned long) on tspan with too few arguments must throw TypeError 
-PASS SVGTextContentElement interface: tspan must inherit property "getStartPositionOfChar" with the proper type (8) 
+PASS SVGTextPositioningElement interface: tspan must inherit property "x" with the proper type 
+PASS SVGTextPositioningElement interface: tspan must inherit property "y" with the proper type 
+PASS SVGTextPositioningElement interface: tspan must inherit property "dx" with the proper type 
+PASS SVGTextPositioningElement interface: tspan must inherit property "dy" with the proper type 
+PASS SVGTextPositioningElement interface: tspan must inherit property "rotate" with the proper type 
+PASS SVGTextContentElement interface: tspan must inherit property "LENGTHADJUST_UNKNOWN" with the proper type 
+PASS SVGTextContentElement interface: tspan must inherit property "LENGTHADJUST_SPACING" with the proper type 
+PASS SVGTextContentElement interface: tspan must inherit property "LENGTHADJUST_SPACINGANDGLYPHS" with the proper type 
+PASS SVGTextContentElement interface: tspan must inherit property "textLength" with the proper type 
+PASS SVGTextContentElement interface: tspan must inherit property "lengthAdjust" with the proper type 
+PASS SVGTextContentElement interface: tspan must inherit property "getNumberOfChars()" with the proper type 
+PASS SVGTextContentElement interface: tspan must inherit property "getComputedTextLength()" with the proper type 
+PASS SVGTextContentElement interface: tspan must inherit property "getSubStringLength(unsigned long, unsigned long)" with the proper type 
+PASS SVGTextContentElement interface: calling getSubStringLength(unsigned long, unsigned long) on tspan with too few arguments must throw TypeError 
+PASS SVGTextContentElement interface: tspan must inherit property "getStartPositionOfChar(unsigned long)" with the proper type 
 PASS SVGTextContentElement interface: calling getStartPositionOfChar(unsigned long) on tspan with too few arguments must throw TypeError 
-PASS SVGTextContentElement interface: tspan must inherit property "getEndPositionOfChar" with the proper type (9) 
+PASS SVGTextContentElement interface: tspan must inherit property "getEndPositionOfChar(unsigned long)" with the proper type 
 PASS SVGTextContentElement interface: calling getEndPositionOfChar(unsigned long) on tspan with too few arguments must throw TypeError 
-PASS SVGTextContentElement interface: tspan must inherit property "getExtentOfChar" with the proper type (10) 
+PASS SVGTextContentElement interface: tspan must inherit property "getExtentOfChar(unsigned long)" with the proper type 
 PASS SVGTextContentElement interface: calling getExtentOfChar(unsigned long) on tspan with too few arguments must throw TypeError 
-PASS SVGTextContentElement interface: tspan must inherit property "getRotationOfChar" with the proper type (11) 
+PASS SVGTextContentElement interface: tspan must inherit property "getRotationOfChar(unsigned long)" with the proper type 
 PASS SVGTextContentElement interface: calling getRotationOfChar(unsigned long) on tspan with too few arguments must throw TypeError 
-PASS SVGTextContentElement interface: tspan must inherit property "getCharNumAtPosition" with the proper type (12) 
+PASS SVGTextContentElement interface: tspan must inherit property "getCharNumAtPosition(DOMPoint)" with the proper type 
 PASS SVGTextContentElement interface: calling getCharNumAtPosition(DOMPoint) on tspan with too few arguments must throw TypeError 
-PASS SVGTextContentElement interface: tspan must inherit property "selectSubString" with the proper type (13) 
-PASS SVGTextContentElement interface: calling selectSubString(unsigned long,unsigned long) on tspan with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: tspan must inherit property "transform" with the proper type (0) 
-PASS SVGGraphicsElement interface: tspan must inherit property "getBBox" with the proper type (1) 
+PASS SVGTextContentElement interface: tspan must inherit property "selectSubString(unsigned long, unsigned long)" with the proper type 
+PASS SVGTextContentElement interface: calling selectSubString(unsigned long, unsigned long) on tspan with too few arguments must throw TypeError 
+PASS SVGGraphicsElement interface: tspan must inherit property "transform" with the proper type 
+PASS SVGGraphicsElement interface: tspan must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type 
 PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on tspan with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: tspan must inherit property "getCTM" with the proper type (2) 
-PASS SVGGraphicsElement interface: tspan must inherit property "getScreenCTM" with the proper type (3) 
-PASS SVGGraphicsElement interface: tspan must inherit property "requiredExtensions" with the proper type (4) 
-PASS SVGGraphicsElement interface: tspan must inherit property "systemLanguage" with the proper type (5) 
-PASS SVGElement interface: tspan must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: tspan must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: tspan must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: tspan must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: tspan must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: tspan must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: tspan must inherit property "blur" with the proper type (6) 
+PASS SVGGraphicsElement interface: tspan must inherit property "getCTM()" with the proper type 
+PASS SVGGraphicsElement interface: tspan must inherit property "getScreenCTM()" with the proper type 
+PASS SVGGraphicsElement interface: tspan must inherit property "requiredExtensions" with the proper type 
+PASS SVGGraphicsElement interface: tspan must inherit property "systemLanguage" with the proper type 
+PASS SVGElement interface: tspan must inherit property "className" with the proper type 
+PASS SVGElement interface: tspan must inherit property "dataset" with the proper type 
+PASS SVGElement interface: tspan must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: tspan must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: tspan must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: tspan must inherit property "focus()" with the proper type 
+PASS SVGElement interface: tspan must inherit property "blur()" with the proper type 
 PASS SVGTextPathElement interface: existence and properties of interface object 
 PASS SVGTextPathElement interface object length 
 PASS SVGTextPathElement interface object name 
@@ -1223,51 +1223,51 @@
 PASS SVGTextPathElement interface: attribute href 
 PASS SVGTextPathElement must be primary interface of textPath 
 PASS Stringification of textPath 
-PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_METHODTYPE_UNKNOWN" with the proper type (0) 
-PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_METHODTYPE_ALIGN" with the proper type (1) 
-PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_METHODTYPE_STRETCH" with the proper type (2) 
-PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_SPACINGTYPE_UNKNOWN" with the proper type (3) 
-PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_SPACINGTYPE_AUTO" with the proper type (4) 
-PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_SPACINGTYPE_EXACT" with the proper type (5) 
-PASS SVGTextPathElement interface: textPath must inherit property "startOffset" with the proper type (6) 
-PASS SVGTextPathElement interface: textPath must inherit property "method" with the proper type (7) 
-PASS SVGTextPathElement interface: textPath must inherit property "spacing" with the proper type (8) 
-PASS SVGTextPathElement interface: textPath must inherit property "href" with the proper type (9) 
-PASS SVGTextContentElement interface: textPath must inherit property "LENGTHADJUST_UNKNOWN" with the proper type (0) 
-PASS SVGTextContentElement interface: textPath must inherit property "LENGTHADJUST_SPACING" with the proper type (1) 
-PASS SVGTextContentElement interface: textPath must inherit property "LENGTHADJUST_SPACINGANDGLYPHS" with the proper type (2) 
-PASS SVGTextContentElement interface: textPath must inherit property "textLength" with the proper type (3) 
-PASS SVGTextContentElement interface: textPath must inherit property "lengthAdjust" with the proper type (4) 
-PASS SVGTextContentElement interface: textPath must inherit property "getNumberOfChars" with the proper type (5) 
-PASS SVGTextContentElement interface: textPath must inherit property "getComputedTextLength" with the proper type (6) 
-PASS SVGTextContentElement interface: textPath must inherit property "getSubStringLength" with the proper type (7) 
-PASS SVGTextContentElement interface: calling getSubStringLength(unsigned long,unsigned long) on textPath with too few arguments must throw TypeError 
-PASS SVGTextContentElement interface: textPath must inherit property "getStartPositionOfChar" with the proper type (8) 
+PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_METHODTYPE_UNKNOWN" with the proper type 
+PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_METHODTYPE_ALIGN" with the proper type 
+PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_METHODTYPE_STRETCH" with the proper type 
+PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_SPACINGTYPE_UNKNOWN" with the proper type 
+PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_SPACINGTYPE_AUTO" with the proper type 
+PASS SVGTextPathElement interface: textPath must inherit property "TEXTPATH_SPACINGTYPE_EXACT" with the proper type 
+PASS SVGTextPathElement interface: textPath must inherit property "startOffset" with the proper type 
+PASS SVGTextPathElement interface: textPath must inherit property "method" with the proper type 
+PASS SVGTextPathElement interface: textPath must inherit property "spacing" with the proper type 
+PASS SVGTextPathElement interface: textPath must inherit property "href" with the proper type 
+PASS SVGTextContentElement interface: textPath must inherit property "LENGTHADJUST_UNKNOWN" with the proper type 
+PASS SVGTextContentElement interface: textPath must inherit property "LENGTHADJUST_SPACING" with the proper type 
+PASS SVGTextContentElement interface: textPath must inherit property "LENGTHADJUST_SPACINGANDGLYPHS" with the proper type 
+PASS SVGTextContentElement interface: textPath must inherit property "textLength" with the proper type 
+PASS SVGTextContentElement interface: textPath must inherit property "lengthAdjust" with the proper type 
+PASS SVGTextContentElement interface: textPath must inherit property "getNumberOfChars()" with the proper type 
+PASS SVGTextContentElement interface: textPath must inherit property "getComputedTextLength()" with the proper type 
+PASS SVGTextContentElement interface: textPath must inherit property "getSubStringLength(unsigned long, unsigned long)" with the proper type 
+PASS SVGTextContentElement interface: calling getSubStringLength(unsigned long, unsigned long) on textPath with too few arguments must throw TypeError 
+PASS SVGTextContentElement interface: textPath must inherit property "getStartPositionOfChar(unsigned long)" with the proper type 
 PASS SVGTextContentElement interface: calling getStartPositionOfChar(unsigned long) on textPath with too few arguments must throw TypeError 
-PASS SVGTextContentElement interface: textPath must inherit property "getEndPositionOfChar" with the proper type (9) 
+PASS SVGTextContentElement interface: textPath must inherit property "getEndPositionOfChar(unsigned long)" with the proper type 
 PASS SVGTextContentElement interface: calling getEndPositionOfChar(unsigned long) on textPath with too few arguments must throw TypeError 
-PASS SVGTextContentElement interface: textPath must inherit property "getExtentOfChar" with the proper type (10) 
+PASS SVGTextContentElement interface: textPath must inherit property "getExtentOfChar(unsigned long)" with the proper type 
 PASS SVGTextContentElement interface: calling getExtentOfChar(unsigned long) on textPath with too few arguments must throw TypeError 
-PASS SVGTextContentElement interface: textPath must inherit property "getRotationOfChar" with the proper type (11) 
+PASS SVGTextContentElement interface: textPath must inherit property "getRotationOfChar(unsigned long)" with the proper type 
 PASS SVGTextContentElement interface: calling getRotationOfChar(unsigned long) on textPath with too few arguments must throw TypeError 
-PASS SVGTextContentElement interface: textPath must inherit property "getCharNumAtPosition" with the proper type (12) 
+PASS SVGTextContentElement interface: textPath must inherit property "getCharNumAtPosition(DOMPoint)" with the proper type 
 PASS SVGTextContentElement interface: calling getCharNumAtPosition(DOMPoint) on textPath with too few arguments must throw TypeError 
-PASS SVGTextContentElement interface: textPath must inherit property "selectSubString" with the proper type (13) 
-PASS SVGTextContentElement interface: calling selectSubString(unsigned long,unsigned long) on textPath with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: textPath must inherit property "transform" with the proper type (0) 
-PASS SVGGraphicsElement interface: textPath must inherit property "getBBox" with the proper type (1) 
+PASS SVGTextContentElement interface: textPath must inherit property "selectSubString(unsigned long, unsigned long)" with the proper type 
+PASS SVGTextContentElement interface: calling selectSubString(unsigned long, unsigned long) on textPath with too few arguments must throw TypeError 
+PASS SVGGraphicsElement interface: textPath must inherit property "transform" with the proper type 
+PASS SVGGraphicsElement interface: textPath must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type 
 PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on textPath with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: textPath must inherit property "getCTM" with the proper type (2) 
-PASS SVGGraphicsElement interface: textPath must inherit property "getScreenCTM" with the proper type (3) 
-PASS SVGGraphicsElement interface: textPath must inherit property "requiredExtensions" with the proper type (4) 
-PASS SVGGraphicsElement interface: textPath must inherit property "systemLanguage" with the proper type (5) 
-PASS SVGElement interface: textPath must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: textPath must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: textPath must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: textPath must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: textPath must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: textPath must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: textPath must inherit property "blur" with the proper type (6) 
+PASS SVGGraphicsElement interface: textPath must inherit property "getCTM()" with the proper type 
+PASS SVGGraphicsElement interface: textPath must inherit property "getScreenCTM()" with the proper type 
+PASS SVGGraphicsElement interface: textPath must inherit property "requiredExtensions" with the proper type 
+PASS SVGGraphicsElement interface: textPath must inherit property "systemLanguage" with the proper type 
+PASS SVGElement interface: textPath must inherit property "className" with the proper type 
+PASS SVGElement interface: textPath must inherit property "dataset" with the proper type 
+PASS SVGElement interface: textPath must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: textPath must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: textPath must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: textPath must inherit property "focus()" with the proper type 
+PASS SVGElement interface: textPath must inherit property "blur()" with the proper type 
 PASS SVGImageElement interface: existence and properties of interface object 
 PASS SVGImageElement interface object length 
 PASS SVGImageElement interface object name 
@@ -1282,27 +1282,27 @@
 PASS SVGImageElement interface: attribute href 
 PASS SVGImageElement must be primary interface of image 
 PASS Stringification of image 
-PASS SVGImageElement interface: image must inherit property "x" with the proper type (0) 
-PASS SVGImageElement interface: image must inherit property "y" with the proper type (1) 
-PASS SVGImageElement interface: image must inherit property "width" with the proper type (2) 
-PASS SVGImageElement interface: image must inherit property "height" with the proper type (3) 
-PASS SVGImageElement interface: image must inherit property "preserveAspectRatio" with the proper type (4) 
-FAIL SVGImageElement interface: image must inherit property "crossOrigin" with the proper type (5) assert_inherits: property "crossOrigin" not found in prototype chain
-PASS SVGImageElement interface: image must inherit property "href" with the proper type (6) 
-PASS SVGGraphicsElement interface: image must inherit property "transform" with the proper type (0) 
-PASS SVGGraphicsElement interface: image must inherit property "getBBox" with the proper type (1) 
+PASS SVGImageElement interface: image must inherit property "x" with the proper type 
+PASS SVGImageElement interface: image must inherit property "y" with the proper type 
+PASS SVGImageElement interface: image must inherit property "width" with the proper type 
+PASS SVGImageElement interface: image must inherit property "height" with the proper type 
+PASS SVGImageElement interface: image must inherit property "preserveAspectRatio" with the proper type 
+FAIL SVGImageElement interface: image must inherit property "crossOrigin" with the proper type assert_inherits: property "crossOrigin" not found in prototype chain
+PASS SVGImageElement interface: image must inherit property "href" with the proper type 
+PASS SVGGraphicsElement interface: image must inherit property "transform" with the proper type 
+PASS SVGGraphicsElement interface: image must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type 
 PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on image with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: image must inherit property "getCTM" with the proper type (2) 
-PASS SVGGraphicsElement interface: image must inherit property "getScreenCTM" with the proper type (3) 
-PASS SVGGraphicsElement interface: image must inherit property "requiredExtensions" with the proper type (4) 
-PASS SVGGraphicsElement interface: image must inherit property "systemLanguage" with the proper type (5) 
-PASS SVGElement interface: image must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: image must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: image must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: image must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: image must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: image must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: image must inherit property "blur" with the proper type (6) 
+PASS SVGGraphicsElement interface: image must inherit property "getCTM()" with the proper type 
+PASS SVGGraphicsElement interface: image must inherit property "getScreenCTM()" with the proper type 
+PASS SVGGraphicsElement interface: image must inherit property "requiredExtensions" with the proper type 
+PASS SVGGraphicsElement interface: image must inherit property "systemLanguage" with the proper type 
+PASS SVGElement interface: image must inherit property "className" with the proper type 
+PASS SVGElement interface: image must inherit property "dataset" with the proper type 
+PASS SVGElement interface: image must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: image must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: image must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: image must inherit property "focus()" with the proper type 
+PASS SVGElement interface: image must inherit property "blur()" with the proper type 
 PASS SVGForeignObjectElement interface: existence and properties of interface object 
 PASS SVGForeignObjectElement interface object length 
 PASS SVGForeignObjectElement interface object name 
@@ -1314,24 +1314,24 @@
 PASS SVGForeignObjectElement interface: attribute height 
 PASS SVGForeignObjectElement must be primary interface of foreignObject 
 PASS Stringification of foreignObject 
-PASS SVGForeignObjectElement interface: foreignObject must inherit property "x" with the proper type (0) 
-PASS SVGForeignObjectElement interface: foreignObject must inherit property "y" with the proper type (1) 
-PASS SVGForeignObjectElement interface: foreignObject must inherit property "width" with the proper type (2) 
-PASS SVGForeignObjectElement interface: foreignObject must inherit property "height" with the proper type (3) 
-PASS SVGGraphicsElement interface: foreignObject must inherit property "transform" with the proper type (0) 
-PASS SVGGraphicsElement interface: foreignObject must inherit property "getBBox" with the proper type (1) 
+PASS SVGForeignObjectElement interface: foreignObject must inherit property "x" with the proper type 
+PASS SVGForeignObjectElement interface: foreignObject must inherit property "y" with the proper type 
+PASS SVGForeignObjectElement interface: foreignObject must inherit property "width" with the proper type 
+PASS SVGForeignObjectElement interface: foreignObject must inherit property "height" with the proper type 
+PASS SVGGraphicsElement interface: foreignObject must inherit property "transform" with the proper type 
+PASS SVGGraphicsElement interface: foreignObject must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type 
 PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on foreignObject with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: foreignObject must inherit property "getCTM" with the proper type (2) 
-PASS SVGGraphicsElement interface: foreignObject must inherit property "getScreenCTM" with the proper type (3) 
-PASS SVGGraphicsElement interface: foreignObject must inherit property "requiredExtensions" with the proper type (4) 
-PASS SVGGraphicsElement interface: foreignObject must inherit property "systemLanguage" with the proper type (5) 
-PASS SVGElement interface: foreignObject must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: foreignObject must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: foreignObject must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: foreignObject must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: foreignObject must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: foreignObject must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: foreignObject must inherit property "blur" with the proper type (6) 
+PASS SVGGraphicsElement interface: foreignObject must inherit property "getCTM()" with the proper type 
+PASS SVGGraphicsElement interface: foreignObject must inherit property "getScreenCTM()" with the proper type 
+PASS SVGGraphicsElement interface: foreignObject must inherit property "requiredExtensions" with the proper type 
+PASS SVGGraphicsElement interface: foreignObject must inherit property "systemLanguage" with the proper type 
+PASS SVGElement interface: foreignObject must inherit property "className" with the proper type 
+PASS SVGElement interface: foreignObject must inherit property "dataset" with the proper type 
+PASS SVGElement interface: foreignObject must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: foreignObject must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: foreignObject must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: foreignObject must inherit property "focus()" with the proper type 
+PASS SVGElement interface: foreignObject must inherit property "blur()" with the proper type 
 PASS SVGMarkerElement interface: existence and properties of interface object 
 PASS SVGMarkerElement interface object length 
 PASS SVGMarkerElement interface object name 
@@ -1363,32 +1363,32 @@
 PASS SVGMarkerElement interface: attribute preserveAspectRatio 
 PASS SVGMarkerElement must be primary interface of marker 
 PASS Stringification of marker 
-PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKERUNITS_UNKNOWN" with the proper type (0) 
-PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKERUNITS_USERSPACEONUSE" with the proper type (1) 
-PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKERUNITS_STROKEWIDTH" with the proper type (2) 
-PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKER_ORIENT_UNKNOWN" with the proper type (3) 
-PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKER_ORIENT_AUTO" with the proper type (4) 
-PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKER_ORIENT_ANGLE" with the proper type (5) 
-PASS SVGMarkerElement interface: marker must inherit property "refX" with the proper type (6) 
-PASS SVGMarkerElement interface: marker must inherit property "refY" with the proper type (7) 
-PASS SVGMarkerElement interface: marker must inherit property "markerUnits" with the proper type (8) 
-PASS SVGMarkerElement interface: marker must inherit property "markerWidth" with the proper type (9) 
-PASS SVGMarkerElement interface: marker must inherit property "markerHeight" with the proper type (10) 
-PASS SVGMarkerElement interface: marker must inherit property "orientType" with the proper type (11) 
-PASS SVGMarkerElement interface: marker must inherit property "orientAngle" with the proper type (12) 
-FAIL SVGMarkerElement interface: marker must inherit property "orient" with the proper type (13) assert_inherits: property "orient" not found in prototype chain
-PASS SVGMarkerElement interface: marker must inherit property "setOrientToAuto" with the proper type (14) 
-PASS SVGMarkerElement interface: marker must inherit property "setOrientToAngle" with the proper type (15) 
+PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKERUNITS_UNKNOWN" with the proper type 
+PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKERUNITS_USERSPACEONUSE" with the proper type 
+PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKERUNITS_STROKEWIDTH" with the proper type 
+PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKER_ORIENT_UNKNOWN" with the proper type 
+PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKER_ORIENT_AUTO" with the proper type 
+PASS SVGMarkerElement interface: marker must inherit property "SVG_MARKER_ORIENT_ANGLE" with the proper type 
+PASS SVGMarkerElement interface: marker must inherit property "refX" with the proper type 
+PASS SVGMarkerElement interface: marker must inherit property "refY" with the proper type 
+PASS SVGMarkerElement interface: marker must inherit property "markerUnits" with the proper type 
+PASS SVGMarkerElement interface: marker must inherit property "markerWidth" with the proper type 
+PASS SVGMarkerElement interface: marker must inherit property "markerHeight" with the proper type 
+PASS SVGMarkerElement interface: marker must inherit property "orientType" with the proper type 
+PASS SVGMarkerElement interface: marker must inherit property "orientAngle" with the proper type 
+FAIL SVGMarkerElement interface: marker must inherit property "orient" with the proper type assert_inherits: property "orient" not found in prototype chain
+PASS SVGMarkerElement interface: marker must inherit property "setOrientToAuto()" with the proper type 
+PASS SVGMarkerElement interface: marker must inherit property "setOrientToAngle(SVGAngle)" with the proper type 
 PASS SVGMarkerElement interface: calling setOrientToAngle(SVGAngle) on marker with too few arguments must throw TypeError 
-PASS SVGMarkerElement interface: marker must inherit property "viewBox" with the proper type (16) 
-PASS SVGMarkerElement interface: marker must inherit property "preserveAspectRatio" with the proper type (17) 
-PASS SVGElement interface: marker must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: marker must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: marker must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: marker must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: marker must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: marker must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: marker must inherit property "blur" with the proper type (6) 
+PASS SVGMarkerElement interface: marker must inherit property "viewBox" with the proper type 
+PASS SVGMarkerElement interface: marker must inherit property "preserveAspectRatio" with the proper type 
+PASS SVGElement interface: marker must inherit property "className" with the proper type 
+PASS SVGElement interface: marker must inherit property "dataset" with the proper type 
+PASS SVGElement interface: marker must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: marker must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: marker must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: marker must inherit property "focus()" with the proper type 
+PASS SVGElement interface: marker must inherit property "blur()" with the proper type 
 FAIL SVGSolidcolorElement interface: existence and properties of interface object assert_own_property: self does not have own property "SVGSolidcolorElement" expected property "SVGSolidcolorElement" missing
 FAIL SVGSolidcolorElement interface object length assert_own_property: self does not have own property "SVGSolidcolorElement" expected property "SVGSolidcolorElement" missing
 FAIL SVGSolidcolorElement interface object name assert_own_property: self does not have own property "SVGSolidcolorElement" expected property "SVGSolidcolorElement" missing
@@ -1422,25 +1422,25 @@
 PASS SVGLinearGradientElement interface: attribute y2 
 PASS SVGLinearGradientElement must be primary interface of linearGradient 
 PASS Stringification of linearGradient 
-PASS SVGLinearGradientElement interface: linearGradient must inherit property "x1" with the proper type (0) 
-PASS SVGLinearGradientElement interface: linearGradient must inherit property "y1" with the proper type (1) 
-PASS SVGLinearGradientElement interface: linearGradient must inherit property "x2" with the proper type (2) 
-PASS SVGLinearGradientElement interface: linearGradient must inherit property "y2" with the proper type (3) 
-PASS SVGGradientElement interface: linearGradient must inherit property "SVG_SPREADMETHOD_UNKNOWN" with the proper type (0) 
-PASS SVGGradientElement interface: linearGradient must inherit property "SVG_SPREADMETHOD_PAD" with the proper type (1) 
-PASS SVGGradientElement interface: linearGradient must inherit property "SVG_SPREADMETHOD_REFLECT" with the proper type (2) 
-PASS SVGGradientElement interface: linearGradient must inherit property "SVG_SPREADMETHOD_REPEAT" with the proper type (3) 
-PASS SVGGradientElement interface: linearGradient must inherit property "gradientUnits" with the proper type (4) 
-PASS SVGGradientElement interface: linearGradient must inherit property "gradientTransform" with the proper type (5) 
-PASS SVGGradientElement interface: linearGradient must inherit property "spreadMethod" with the proper type (6) 
-PASS SVGGradientElement interface: linearGradient must inherit property "href" with the proper type (7) 
-PASS SVGElement interface: linearGradient must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: linearGradient must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: linearGradient must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: linearGradient must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: linearGradient must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: linearGradient must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: linearGradient must inherit property "blur" with the proper type (6) 
+PASS SVGLinearGradientElement interface: linearGradient must inherit property "x1" with the proper type 
+PASS SVGLinearGradientElement interface: linearGradient must inherit property "y1" with the proper type 
+PASS SVGLinearGradientElement interface: linearGradient must inherit property "x2" with the proper type 
+PASS SVGLinearGradientElement interface: linearGradient must inherit property "y2" with the proper type 
+PASS SVGGradientElement interface: linearGradient must inherit property "SVG_SPREADMETHOD_UNKNOWN" with the proper type 
+PASS SVGGradientElement interface: linearGradient must inherit property "SVG_SPREADMETHOD_PAD" with the proper type 
+PASS SVGGradientElement interface: linearGradient must inherit property "SVG_SPREADMETHOD_REFLECT" with the proper type 
+PASS SVGGradientElement interface: linearGradient must inherit property "SVG_SPREADMETHOD_REPEAT" with the proper type 
+PASS SVGGradientElement interface: linearGradient must inherit property "gradientUnits" with the proper type 
+PASS SVGGradientElement interface: linearGradient must inherit property "gradientTransform" with the proper type 
+PASS SVGGradientElement interface: linearGradient must inherit property "spreadMethod" with the proper type 
+PASS SVGGradientElement interface: linearGradient must inherit property "href" with the proper type 
+PASS SVGElement interface: linearGradient must inherit property "className" with the proper type 
+PASS SVGElement interface: linearGradient must inherit property "dataset" with the proper type 
+PASS SVGElement interface: linearGradient must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: linearGradient must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: linearGradient must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: linearGradient must inherit property "focus()" with the proper type 
+PASS SVGElement interface: linearGradient must inherit property "blur()" with the proper type 
 PASS SVGRadialGradientElement interface: existence and properties of interface object 
 PASS SVGRadialGradientElement interface object length 
 PASS SVGRadialGradientElement interface object name 
@@ -1454,27 +1454,27 @@
 PASS SVGRadialGradientElement interface: attribute fr 
 PASS SVGRadialGradientElement must be primary interface of radialGradient 
 PASS Stringification of radialGradient 
-PASS SVGRadialGradientElement interface: radialGradient must inherit property "cx" with the proper type (0) 
-PASS SVGRadialGradientElement interface: radialGradient must inherit property "cy" with the proper type (1) 
-PASS SVGRadialGradientElement interface: radialGradient must inherit property "r" with the proper type (2) 
-PASS SVGRadialGradientElement interface: radialGradient must inherit property "fx" with the proper type (3) 
-PASS SVGRadialGradientElement interface: radialGradient must inherit property "fy" with the proper type (4) 
-PASS SVGRadialGradientElement interface: radialGradient must inherit property "fr" with the proper type (5) 
-PASS SVGGradientElement interface: radialGradient must inherit property "SVG_SPREADMETHOD_UNKNOWN" with the proper type (0) 
-PASS SVGGradientElement interface: radialGradient must inherit property "SVG_SPREADMETHOD_PAD" with the proper type (1) 
-PASS SVGGradientElement interface: radialGradient must inherit property "SVG_SPREADMETHOD_REFLECT" with the proper type (2) 
-PASS SVGGradientElement interface: radialGradient must inherit property "SVG_SPREADMETHOD_REPEAT" with the proper type (3) 
-PASS SVGGradientElement interface: radialGradient must inherit property "gradientUnits" with the proper type (4) 
-PASS SVGGradientElement interface: radialGradient must inherit property "gradientTransform" with the proper type (5) 
-PASS SVGGradientElement interface: radialGradient must inherit property "spreadMethod" with the proper type (6) 
-PASS SVGGradientElement interface: radialGradient must inherit property "href" with the proper type (7) 
-PASS SVGElement interface: radialGradient must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: radialGradient must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: radialGradient must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: radialGradient must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: radialGradient must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: radialGradient must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: radialGradient must inherit property "blur" with the proper type (6) 
+PASS SVGRadialGradientElement interface: radialGradient must inherit property "cx" with the proper type 
+PASS SVGRadialGradientElement interface: radialGradient must inherit property "cy" with the proper type 
+PASS SVGRadialGradientElement interface: radialGradient must inherit property "r" with the proper type 
+PASS SVGRadialGradientElement interface: radialGradient must inherit property "fx" with the proper type 
+PASS SVGRadialGradientElement interface: radialGradient must inherit property "fy" with the proper type 
+PASS SVGRadialGradientElement interface: radialGradient must inherit property "fr" with the proper type 
+PASS SVGGradientElement interface: radialGradient must inherit property "SVG_SPREADMETHOD_UNKNOWN" with the proper type 
+PASS SVGGradientElement interface: radialGradient must inherit property "SVG_SPREADMETHOD_PAD" with the proper type 
+PASS SVGGradientElement interface: radialGradient must inherit property "SVG_SPREADMETHOD_REFLECT" with the proper type 
+PASS SVGGradientElement interface: radialGradient must inherit property "SVG_SPREADMETHOD_REPEAT" with the proper type 
+PASS SVGGradientElement interface: radialGradient must inherit property "gradientUnits" with the proper type 
+PASS SVGGradientElement interface: radialGradient must inherit property "gradientTransform" with the proper type 
+PASS SVGGradientElement interface: radialGradient must inherit property "spreadMethod" with the proper type 
+PASS SVGGradientElement interface: radialGradient must inherit property "href" with the proper type 
+PASS SVGElement interface: radialGradient must inherit property "className" with the proper type 
+PASS SVGElement interface: radialGradient must inherit property "dataset" with the proper type 
+PASS SVGElement interface: radialGradient must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: radialGradient must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: radialGradient must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: radialGradient must inherit property "focus()" with the proper type 
+PASS SVGElement interface: radialGradient must inherit property "blur()" with the proper type 
 FAIL SVGMeshElement interface: existence and properties of interface object assert_own_property: self does not have own property "SVGMeshElement" expected property "SVGMeshElement" missing
 FAIL SVGMeshElement interface object length assert_own_property: self does not have own property "SVGMeshElement" expected property "SVGMeshElement" missing
 FAIL SVGMeshElement interface object name assert_own_property: self does not have own property "SVGMeshElement" expected property "SVGMeshElement" missing
@@ -1498,14 +1498,14 @@
 PASS SVGStopElement interface: attribute offset 
 PASS SVGStopElement must be primary interface of stop 
 PASS Stringification of stop 
-PASS SVGStopElement interface: stop must inherit property "offset" with the proper type (0) 
-PASS SVGElement interface: stop must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: stop must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: stop must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: stop must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: stop must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: stop must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: stop must inherit property "blur" with the proper type (6) 
+PASS SVGStopElement interface: stop must inherit property "offset" with the proper type 
+PASS SVGElement interface: stop must inherit property "className" with the proper type 
+PASS SVGElement interface: stop must inherit property "dataset" with the proper type 
+PASS SVGElement interface: stop must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: stop must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: stop must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: stop must inherit property "focus()" with the proper type 
+PASS SVGElement interface: stop must inherit property "blur()" with the proper type 
 PASS SVGPatternElement interface: existence and properties of interface object 
 PASS SVGPatternElement interface object length 
 PASS SVGPatternElement interface object name 
@@ -1523,23 +1523,23 @@
 PASS SVGPatternElement interface: attribute href 
 PASS SVGPatternElement must be primary interface of pattern 
 PASS Stringification of pattern 
-PASS SVGPatternElement interface: pattern must inherit property "patternUnits" with the proper type (0) 
-PASS SVGPatternElement interface: pattern must inherit property "patternContentUnits" with the proper type (1) 
-PASS SVGPatternElement interface: pattern must inherit property "patternTransform" with the proper type (2) 
-PASS SVGPatternElement interface: pattern must inherit property "x" with the proper type (3) 
-PASS SVGPatternElement interface: pattern must inherit property "y" with the proper type (4) 
-PASS SVGPatternElement interface: pattern must inherit property "width" with the proper type (5) 
-PASS SVGPatternElement interface: pattern must inherit property "height" with the proper type (6) 
-PASS SVGPatternElement interface: pattern must inherit property "viewBox" with the proper type (7) 
-PASS SVGPatternElement interface: pattern must inherit property "preserveAspectRatio" with the proper type (8) 
-PASS SVGPatternElement interface: pattern must inherit property "href" with the proper type (9) 
-PASS SVGElement interface: pattern must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: pattern must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: pattern must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: pattern must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: pattern must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: pattern must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: pattern must inherit property "blur" with the proper type (6) 
+PASS SVGPatternElement interface: pattern must inherit property "patternUnits" with the proper type 
+PASS SVGPatternElement interface: pattern must inherit property "patternContentUnits" with the proper type 
+PASS SVGPatternElement interface: pattern must inherit property "patternTransform" with the proper type 
+PASS SVGPatternElement interface: pattern must inherit property "x" with the proper type 
+PASS SVGPatternElement interface: pattern must inherit property "y" with the proper type 
+PASS SVGPatternElement interface: pattern must inherit property "width" with the proper type 
+PASS SVGPatternElement interface: pattern must inherit property "height" with the proper type 
+PASS SVGPatternElement interface: pattern must inherit property "viewBox" with the proper type 
+PASS SVGPatternElement interface: pattern must inherit property "preserveAspectRatio" with the proper type 
+PASS SVGPatternElement interface: pattern must inherit property "href" with the proper type 
+PASS SVGElement interface: pattern must inherit property "className" with the proper type 
+PASS SVGElement interface: pattern must inherit property "dataset" with the proper type 
+PASS SVGElement interface: pattern must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: pattern must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: pattern must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: pattern must inherit property "focus()" with the proper type 
+PASS SVGElement interface: pattern must inherit property "blur()" with the proper type 
 FAIL SVGHatchElement interface: existence and properties of interface object assert_own_property: self does not have own property "SVGHatchElement" expected property "SVGHatchElement" missing
 FAIL SVGHatchElement interface object length assert_own_property: self does not have own property "SVGHatchElement" expected property "SVGHatchElement" missing
 FAIL SVGHatchElement interface object name assert_own_property: self does not have own property "SVGHatchElement" expected property "SVGHatchElement" missing
@@ -1560,16 +1560,16 @@
 FAIL SVGCursorElement interface: attribute href assert_own_property: self does not have own property "SVGCursorElement" expected property "SVGCursorElement" missing
 FAIL SVGCursorElement must be primary interface of cursor assert_own_property: self does not have own property "SVGCursorElement" expected property "SVGCursorElement" missing
 FAIL Stringification of cursor assert_equals: class string of cursor expected "[object SVGCursorElement]" but got "[object SVGElement]"
-FAIL SVGCursorElement interface: cursor must inherit property "x" with the proper type (0) assert_inherits: property "x" not found in prototype chain
-FAIL SVGCursorElement interface: cursor must inherit property "y" with the proper type (1) assert_inherits: property "y" not found in prototype chain
-FAIL SVGCursorElement interface: cursor must inherit property "href" with the proper type (2) assert_inherits: property "href" not found in prototype chain
-PASS SVGElement interface: cursor must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: cursor must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: cursor must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: cursor must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: cursor must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: cursor must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: cursor must inherit property "blur" with the proper type (6) 
+FAIL SVGCursorElement interface: cursor must inherit property "x" with the proper type assert_inherits: property "x" not found in prototype chain
+FAIL SVGCursorElement interface: cursor must inherit property "y" with the proper type assert_inherits: property "y" not found in prototype chain
+FAIL SVGCursorElement interface: cursor must inherit property "href" with the proper type assert_inherits: property "href" not found in prototype chain
+PASS SVGElement interface: cursor must inherit property "className" with the proper type 
+PASS SVGElement interface: cursor must inherit property "dataset" with the proper type 
+PASS SVGElement interface: cursor must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: cursor must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: cursor must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: cursor must inherit property "focus()" with the proper type 
+PASS SVGElement interface: cursor must inherit property "blur()" with the proper type 
 PASS SVGScriptElement interface: existence and properties of interface object 
 PASS SVGScriptElement interface object length 
 PASS SVGScriptElement interface object name 
@@ -1580,16 +1580,16 @@
 PASS SVGScriptElement interface: attribute href 
 PASS SVGScriptElement must be primary interface of script 
 PASS Stringification of script 
-PASS SVGScriptElement interface: script must inherit property "type" with the proper type (0) 
-FAIL SVGScriptElement interface: script must inherit property "crossOrigin" with the proper type (1) assert_inherits: property "crossOrigin" not found in prototype chain
-PASS SVGScriptElement interface: script must inherit property "href" with the proper type (2) 
-PASS SVGElement interface: script must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: script must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: script must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: script must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: script must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: script must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: script must inherit property "blur" with the proper type (6) 
+PASS SVGScriptElement interface: script must inherit property "type" with the proper type 
+FAIL SVGScriptElement interface: script must inherit property "crossOrigin" with the proper type assert_inherits: property "crossOrigin" not found in prototype chain
+PASS SVGScriptElement interface: script must inherit property "href" with the proper type 
+PASS SVGElement interface: script must inherit property "className" with the proper type 
+PASS SVGElement interface: script must inherit property "dataset" with the proper type 
+PASS SVGElement interface: script must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: script must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: script must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: script must inherit property "focus()" with the proper type 
+PASS SVGElement interface: script must inherit property "blur()" with the proper type 
 PASS SVGAElement interface: existence and properties of interface object 
 PASS SVGAElement interface object length 
 PASS SVGAElement interface object name 
@@ -1599,22 +1599,22 @@
 PASS SVGAElement interface: attribute href 
 PASS SVGAElement must be primary interface of a 
 PASS Stringification of a 
-PASS SVGAElement interface: a must inherit property "target" with the proper type (0) 
-PASS SVGAElement interface: a must inherit property "href" with the proper type (1) 
-PASS SVGGraphicsElement interface: a must inherit property "transform" with the proper type (0) 
-PASS SVGGraphicsElement interface: a must inherit property "getBBox" with the proper type (1) 
+PASS SVGAElement interface: a must inherit property "target" with the proper type 
+PASS SVGAElement interface: a must inherit property "href" with the proper type 
+PASS SVGGraphicsElement interface: a must inherit property "transform" with the proper type 
+PASS SVGGraphicsElement interface: a must inherit property "getBBox(SVGBoundingBoxOptions)" with the proper type 
 PASS SVGGraphicsElement interface: calling getBBox(SVGBoundingBoxOptions) on a with too few arguments must throw TypeError 
-PASS SVGGraphicsElement interface: a must inherit property "getCTM" with the proper type (2) 
-PASS SVGGraphicsElement interface: a must inherit property "getScreenCTM" with the proper type (3) 
-PASS SVGGraphicsElement interface: a must inherit property "requiredExtensions" with the proper type (4) 
-PASS SVGGraphicsElement interface: a must inherit property "systemLanguage" with the proper type (5) 
-PASS SVGElement interface: a must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: a must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: a must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: a must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: a must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: a must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: a must inherit property "blur" with the proper type (6) 
+PASS SVGGraphicsElement interface: a must inherit property "getCTM()" with the proper type 
+PASS SVGGraphicsElement interface: a must inherit property "getScreenCTM()" with the proper type 
+PASS SVGGraphicsElement interface: a must inherit property "requiredExtensions" with the proper type 
+PASS SVGGraphicsElement interface: a must inherit property "systemLanguage" with the proper type 
+PASS SVGElement interface: a must inherit property "className" with the proper type 
+PASS SVGElement interface: a must inherit property "dataset" with the proper type 
+PASS SVGElement interface: a must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: a must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: a must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: a must inherit property "focus()" with the proper type 
+PASS SVGElement interface: a must inherit property "blur()" with the proper type 
 PASS SVGViewElement interface: existence and properties of interface object 
 PASS SVGViewElement interface object length 
 PASS SVGViewElement interface object name 
@@ -1631,19 +1631,19 @@
 PASS SVGViewElement interface: attribute zoomAndPan 
 PASS SVGViewElement must be primary interface of view 
 PASS Stringification of view 
-PASS SVGViewElement interface: view must inherit property "viewBox" with the proper type (0) 
-PASS SVGViewElement interface: view must inherit property "preserveAspectRatio" with the proper type (1) 
-PASS SVGViewElement interface: view must inherit property "SVG_ZOOMANDPAN_UNKNOWN" with the proper type (2) 
-PASS SVGViewElement interface: view must inherit property "SVG_ZOOMANDPAN_DISABLE" with the proper type (3) 
-PASS SVGViewElement interface: view must inherit property "SVG_ZOOMANDPAN_MAGNIFY" with the proper type (4) 
-PASS SVGViewElement interface: view must inherit property "zoomAndPan" with the proper type (5) 
-PASS SVGElement interface: view must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: view must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: view must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: view must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: view must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: view must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: view must inherit property "blur" with the proper type (6) 
+PASS SVGViewElement interface: view must inherit property "viewBox" with the proper type 
+PASS SVGViewElement interface: view must inherit property "preserveAspectRatio" with the proper type 
+PASS SVGViewElement interface: view must inherit property "SVG_ZOOMANDPAN_UNKNOWN" with the proper type 
+PASS SVGViewElement interface: view must inherit property "SVG_ZOOMANDPAN_DISABLE" with the proper type 
+PASS SVGViewElement interface: view must inherit property "SVG_ZOOMANDPAN_MAGNIFY" with the proper type 
+PASS SVGViewElement interface: view must inherit property "zoomAndPan" with the proper type 
+PASS SVGElement interface: view must inherit property "className" with the proper type 
+PASS SVGElement interface: view must inherit property "dataset" with the proper type 
+PASS SVGElement interface: view must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: view must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: view must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: view must inherit property "focus()" with the proper type 
+PASS SVGElement interface: view must inherit property "blur()" with the proper type 
 PASS SVGFilterElement interface: existence and properties of interface object 
 PASS SVGFilterElement interface object length 
 PASS SVGFilterElement interface object name 
@@ -1658,20 +1658,20 @@
 PASS SVGFilterElement interface: attribute href 
 PASS SVGFilterElement must be primary interface of filter 
 PASS Stringification of filter 
-PASS SVGFilterElement interface: filter must inherit property "filterUnits" with the proper type (0) 
-PASS SVGFilterElement interface: filter must inherit property "primitiveUnits" with the proper type (1) 
-PASS SVGFilterElement interface: filter must inherit property "x" with the proper type (2) 
-PASS SVGFilterElement interface: filter must inherit property "y" with the proper type (3) 
-PASS SVGFilterElement interface: filter must inherit property "width" with the proper type (4) 
-PASS SVGFilterElement interface: filter must inherit property "height" with the proper type (5) 
-PASS SVGFilterElement interface: filter must inherit property "href" with the proper type (6) 
-PASS SVGElement interface: filter must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: filter must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: filter must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: filter must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: filter must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: filter must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: filter must inherit property "blur" with the proper type (6) 
+PASS SVGFilterElement interface: filter must inherit property "filterUnits" with the proper type 
+PASS SVGFilterElement interface: filter must inherit property "primitiveUnits" with the proper type 
+PASS SVGFilterElement interface: filter must inherit property "x" with the proper type 
+PASS SVGFilterElement interface: filter must inherit property "y" with the proper type 
+PASS SVGFilterElement interface: filter must inherit property "width" with the proper type 
+PASS SVGFilterElement interface: filter must inherit property "height" with the proper type 
+PASS SVGFilterElement interface: filter must inherit property "href" with the proper type 
+PASS SVGElement interface: filter must inherit property "className" with the proper type 
+PASS SVGElement interface: filter must inherit property "dataset" with the proper type 
+PASS SVGElement interface: filter must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: filter must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: filter must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: filter must inherit property "focus()" with the proper type 
+PASS SVGElement interface: filter must inherit property "blur()" with the proper type 
 PASS SVGFEBlendElement interface: existence and properties of interface object 
 PASS SVGFEBlendElement interface object length 
 PASS SVGFEBlendElement interface object name 
@@ -1699,27 +1699,27 @@
 PASS SVGFEBlendElement interface: attribute result 
 PASS SVGFEBlendElement must be primary interface of feBlend 
 PASS Stringification of feBlend 
-PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_UNKNOWN" with the proper type (0) 
-PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_NORMAL" with the proper type (1) 
-PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_MULTIPLY" with the proper type (2) 
-PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_SCREEN" with the proper type (3) 
-PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_DARKEN" with the proper type (4) 
-PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_LIGHTEN" with the proper type (5) 
-PASS SVGFEBlendElement interface: feBlend must inherit property "in1" with the proper type (6) 
-PASS SVGFEBlendElement interface: feBlend must inherit property "in2" with the proper type (7) 
-PASS SVGFEBlendElement interface: feBlend must inherit property "mode" with the proper type (8) 
-PASS SVGFEBlendElement interface: feBlend must inherit property "x" with the proper type (9) 
-PASS SVGFEBlendElement interface: feBlend must inherit property "y" with the proper type (10) 
-PASS SVGFEBlendElement interface: feBlend must inherit property "width" with the proper type (11) 
-PASS SVGFEBlendElement interface: feBlend must inherit property "height" with the proper type (12) 
-PASS SVGFEBlendElement interface: feBlend must inherit property "result" with the proper type (13) 
-PASS SVGElement interface: feBlend must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feBlend must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feBlend must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feBlend must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feBlend must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feBlend must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feBlend must inherit property "blur" with the proper type (6) 
+PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_UNKNOWN" with the proper type 
+PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_NORMAL" with the proper type 
+PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_MULTIPLY" with the proper type 
+PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_SCREEN" with the proper type 
+PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_DARKEN" with the proper type 
+PASS SVGFEBlendElement interface: feBlend must inherit property "SVG_FEBLEND_MODE_LIGHTEN" with the proper type 
+PASS SVGFEBlendElement interface: feBlend must inherit property "in1" with the proper type 
+PASS SVGFEBlendElement interface: feBlend must inherit property "in2" with the proper type 
+PASS SVGFEBlendElement interface: feBlend must inherit property "mode" with the proper type 
+PASS SVGFEBlendElement interface: feBlend must inherit property "x" with the proper type 
+PASS SVGFEBlendElement interface: feBlend must inherit property "y" with the proper type 
+PASS SVGFEBlendElement interface: feBlend must inherit property "width" with the proper type 
+PASS SVGFEBlendElement interface: feBlend must inherit property "height" with the proper type 
+PASS SVGFEBlendElement interface: feBlend must inherit property "result" with the proper type 
+PASS SVGElement interface: feBlend must inherit property "className" with the proper type 
+PASS SVGElement interface: feBlend must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feBlend must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feBlend must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feBlend must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feBlend must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feBlend must inherit property "blur()" with the proper type 
 PASS SVGFEColorMatrixElement interface: existence and properties of interface object 
 PASS SVGFEColorMatrixElement interface object length 
 PASS SVGFEColorMatrixElement interface object name 
@@ -1745,26 +1745,26 @@
 PASS SVGFEColorMatrixElement interface: attribute result 
 PASS SVGFEColorMatrixElement must be primary interface of feColorMatrix 
 PASS Stringification of feColorMatrix 
-PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_UNKNOWN" with the proper type (0) 
-PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_MATRIX" with the proper type (1) 
-PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_SATURATE" with the proper type (2) 
-PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_HUEROTATE" with the proper type (3) 
-PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA" with the proper type (4) 
-PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "in1" with the proper type (5) 
-PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "type" with the proper type (6) 
-PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "values" with the proper type (7) 
-PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "x" with the proper type (8) 
-PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "y" with the proper type (9) 
-PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "width" with the proper type (10) 
-PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "height" with the proper type (11) 
-PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "result" with the proper type (12) 
-PASS SVGElement interface: feColorMatrix must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feColorMatrix must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feColorMatrix must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feColorMatrix must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feColorMatrix must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feColorMatrix must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feColorMatrix must inherit property "blur" with the proper type (6) 
+PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_UNKNOWN" with the proper type 
+PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_MATRIX" with the proper type 
+PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_SATURATE" with the proper type 
+PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_HUEROTATE" with the proper type 
+PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA" with the proper type 
+PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "in1" with the proper type 
+PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "type" with the proper type 
+PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "values" with the proper type 
+PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "x" with the proper type 
+PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "y" with the proper type 
+PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "width" with the proper type 
+PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "height" with the proper type 
+PASS SVGFEColorMatrixElement interface: feColorMatrix must inherit property "result" with the proper type 
+PASS SVGElement interface: feColorMatrix must inherit property "className" with the proper type 
+PASS SVGElement interface: feColorMatrix must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feColorMatrix must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feColorMatrix must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feColorMatrix must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feColorMatrix must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feColorMatrix must inherit property "blur()" with the proper type 
 PASS SVGFEComponentTransferElement interface: existence and properties of interface object 
 PASS SVGFEComponentTransferElement interface object length 
 PASS SVGFEComponentTransferElement interface object name 
@@ -1778,19 +1778,19 @@
 PASS SVGFEComponentTransferElement interface: attribute result 
 PASS SVGFEComponentTransferElement must be primary interface of feComponentTransfer 
 PASS Stringification of feComponentTransfer 
-PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "in1" with the proper type (0) 
-PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "x" with the proper type (1) 
-PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "y" with the proper type (2) 
-PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "width" with the proper type (3) 
-PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "height" with the proper type (4) 
-PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "result" with the proper type (5) 
-PASS SVGElement interface: feComponentTransfer must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feComponentTransfer must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feComponentTransfer must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feComponentTransfer must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feComponentTransfer must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feComponentTransfer must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feComponentTransfer must inherit property "blur" with the proper type (6) 
+PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "in1" with the proper type 
+PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "x" with the proper type 
+PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "y" with the proper type 
+PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "width" with the proper type 
+PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "height" with the proper type 
+PASS SVGFEComponentTransferElement interface: feComponentTransfer must inherit property "result" with the proper type 
+PASS SVGElement interface: feComponentTransfer must inherit property "className" with the proper type 
+PASS SVGElement interface: feComponentTransfer must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feComponentTransfer must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feComponentTransfer must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feComponentTransfer must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feComponentTransfer must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feComponentTransfer must inherit property "blur()" with the proper type 
 PASS SVGComponentTransferFunctionElement interface: existence and properties of interface object 
 PASS SVGComponentTransferFunctionElement interface object length 
 PASS SVGComponentTransferFunctionElement interface object name 
@@ -1822,26 +1822,26 @@
 PASS SVGFEFuncRElement interface: existence and properties of interface prototype object's "constructor" property 
 PASS SVGFEFuncRElement must be primary interface of feFuncR 
 PASS Stringification of feFuncR 
-PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN" with the proper type (0) 
-PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY" with the proper type (1) 
-PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_TABLE" with the proper type (2) 
-PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE" with the proper type (3) 
-PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR" with the proper type (4) 
-PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA" with the proper type (5) 
-PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "type" with the proper type (6) 
-PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "tableValues" with the proper type (7) 
-PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "slope" with the proper type (8) 
-PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "intercept" with the proper type (9) 
-PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "amplitude" with the proper type (10) 
-PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "exponent" with the proper type (11) 
-PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "offset" with the proper type (12) 
-PASS SVGElement interface: feFuncR must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feFuncR must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feFuncR must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feFuncR must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feFuncR must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feFuncR must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feFuncR must inherit property "blur" with the proper type (6) 
+PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_TABLE" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "type" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "tableValues" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "slope" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "intercept" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "amplitude" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "exponent" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncR must inherit property "offset" with the proper type 
+PASS SVGElement interface: feFuncR must inherit property "className" with the proper type 
+PASS SVGElement interface: feFuncR must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feFuncR must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feFuncR must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feFuncR must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feFuncR must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feFuncR must inherit property "blur()" with the proper type 
 PASS SVGFEFuncGElement interface: existence and properties of interface object 
 PASS SVGFEFuncGElement interface object length 
 PASS SVGFEFuncGElement interface object name 
@@ -1849,26 +1849,26 @@
 PASS SVGFEFuncGElement interface: existence and properties of interface prototype object's "constructor" property 
 PASS SVGFEFuncGElement must be primary interface of feFuncG 
 PASS Stringification of feFuncG 
-PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN" with the proper type (0) 
-PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY" with the proper type (1) 
-PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_TABLE" with the proper type (2) 
-PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE" with the proper type (3) 
-PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR" with the proper type (4) 
-PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA" with the proper type (5) 
-PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "type" with the proper type (6) 
-PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "tableValues" with the proper type (7) 
-PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "slope" with the proper type (8) 
-PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "intercept" with the proper type (9) 
-PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "amplitude" with the proper type (10) 
-PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "exponent" with the proper type (11) 
-PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "offset" with the proper type (12) 
-PASS SVGElement interface: feFuncG must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feFuncG must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feFuncG must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feFuncG must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feFuncG must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feFuncG must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feFuncG must inherit property "blur" with the proper type (6) 
+PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_TABLE" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "type" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "tableValues" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "slope" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "intercept" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "amplitude" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "exponent" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncG must inherit property "offset" with the proper type 
+PASS SVGElement interface: feFuncG must inherit property "className" with the proper type 
+PASS SVGElement interface: feFuncG must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feFuncG must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feFuncG must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feFuncG must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feFuncG must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feFuncG must inherit property "blur()" with the proper type 
 PASS SVGFEFuncBElement interface: existence and properties of interface object 
 PASS SVGFEFuncBElement interface object length 
 PASS SVGFEFuncBElement interface object name 
@@ -1876,26 +1876,26 @@
 PASS SVGFEFuncBElement interface: existence and properties of interface prototype object's "constructor" property 
 PASS SVGFEFuncBElement must be primary interface of feFuncB 
 PASS Stringification of feFuncB 
-PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN" with the proper type (0) 
-PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY" with the proper type (1) 
-PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_TABLE" with the proper type (2) 
-PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE" with the proper type (3) 
-PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR" with the proper type (4) 
-PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA" with the proper type (5) 
-PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "type" with the proper type (6) 
-PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "tableValues" with the proper type (7) 
-PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "slope" with the proper type (8) 
-PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "intercept" with the proper type (9) 
-PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "amplitude" with the proper type (10) 
-PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "exponent" with the proper type (11) 
-PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "offset" with the proper type (12) 
-PASS SVGElement interface: feFuncB must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feFuncB must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feFuncB must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feFuncB must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feFuncB must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feFuncB must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feFuncB must inherit property "blur" with the proper type (6) 
+PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_TABLE" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "type" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "tableValues" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "slope" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "intercept" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "amplitude" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "exponent" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncB must inherit property "offset" with the proper type 
+PASS SVGElement interface: feFuncB must inherit property "className" with the proper type 
+PASS SVGElement interface: feFuncB must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feFuncB must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feFuncB must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feFuncB must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feFuncB must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feFuncB must inherit property "blur()" with the proper type 
 PASS SVGFEFuncAElement interface: existence and properties of interface object 
 PASS SVGFEFuncAElement interface object length 
 PASS SVGFEFuncAElement interface object name 
@@ -1903,26 +1903,26 @@
 PASS SVGFEFuncAElement interface: existence and properties of interface prototype object's "constructor" property 
 PASS SVGFEFuncAElement must be primary interface of feFuncA 
 PASS Stringification of feFuncA 
-PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN" with the proper type (0) 
-PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY" with the proper type (1) 
-PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_TABLE" with the proper type (2) 
-PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE" with the proper type (3) 
-PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR" with the proper type (4) 
-PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA" with the proper type (5) 
-PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "type" with the proper type (6) 
-PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "tableValues" with the proper type (7) 
-PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "slope" with the proper type (8) 
-PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "intercept" with the proper type (9) 
-PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "amplitude" with the proper type (10) 
-PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "exponent" with the proper type (11) 
-PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "offset" with the proper type (12) 
-PASS SVGElement interface: feFuncA must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feFuncA must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feFuncA must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feFuncA must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feFuncA must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feFuncA must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feFuncA must inherit property "blur" with the proper type (6) 
+PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_TABLE" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "type" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "tableValues" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "slope" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "intercept" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "amplitude" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "exponent" with the proper type 
+PASS SVGComponentTransferFunctionElement interface: feFuncA must inherit property "offset" with the proper type 
+PASS SVGElement interface: feFuncA must inherit property "className" with the proper type 
+PASS SVGElement interface: feFuncA must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feFuncA must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feFuncA must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feFuncA must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feFuncA must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feFuncA must inherit property "blur()" with the proper type 
 PASS SVGFECompositeElement interface: existence and properties of interface object 
 PASS SVGFECompositeElement interface object length 
 PASS SVGFECompositeElement interface object name 
@@ -1956,32 +1956,32 @@
 PASS SVGFECompositeElement interface: attribute result 
 PASS SVGFECompositeElement must be primary interface of feComposite 
 PASS Stringification of feComposite 
-PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_UNKNOWN" with the proper type (0) 
-PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_OVER" with the proper type (1) 
-PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_IN" with the proper type (2) 
-PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_OUT" with the proper type (3) 
-PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_ATOP" with the proper type (4) 
-PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_XOR" with the proper type (5) 
-PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_ARITHMETIC" with the proper type (6) 
-PASS SVGFECompositeElement interface: feComposite must inherit property "in1" with the proper type (7) 
-PASS SVGFECompositeElement interface: feComposite must inherit property "in2" with the proper type (8) 
-PASS SVGFECompositeElement interface: feComposite must inherit property "operator" with the proper type (9) 
-PASS SVGFECompositeElement interface: feComposite must inherit property "k1" with the proper type (10) 
-PASS SVGFECompositeElement interface: feComposite must inherit property "k2" with the proper type (11) 
-PASS SVGFECompositeElement interface: feComposite must inherit property "k3" with the proper type (12) 
-PASS SVGFECompositeElement interface: feComposite must inherit property "k4" with the proper type (13) 
-PASS SVGFECompositeElement interface: feComposite must inherit property "x" with the proper type (14) 
-PASS SVGFECompositeElement interface: feComposite must inherit property "y" with the proper type (15) 
-PASS SVGFECompositeElement interface: feComposite must inherit property "width" with the proper type (16) 
-PASS SVGFECompositeElement interface: feComposite must inherit property "height" with the proper type (17) 
-PASS SVGFECompositeElement interface: feComposite must inherit property "result" with the proper type (18) 
-PASS SVGElement interface: feComposite must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feComposite must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feComposite must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feComposite must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feComposite must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feComposite must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feComposite must inherit property "blur" with the proper type (6) 
+PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_UNKNOWN" with the proper type 
+PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_OVER" with the proper type 
+PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_IN" with the proper type 
+PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_OUT" with the proper type 
+PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_ATOP" with the proper type 
+PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_XOR" with the proper type 
+PASS SVGFECompositeElement interface: feComposite must inherit property "SVG_FECOMPOSITE_OPERATOR_ARITHMETIC" with the proper type 
+PASS SVGFECompositeElement interface: feComposite must inherit property "in1" with the proper type 
+PASS SVGFECompositeElement interface: feComposite must inherit property "in2" with the proper type 
+PASS SVGFECompositeElement interface: feComposite must inherit property "operator" with the proper type 
+PASS SVGFECompositeElement interface: feComposite must inherit property "k1" with the proper type 
+PASS SVGFECompositeElement interface: feComposite must inherit property "k2" with the proper type 
+PASS SVGFECompositeElement interface: feComposite must inherit property "k3" with the proper type 
+PASS SVGFECompositeElement interface: feComposite must inherit property "k4" with the proper type 
+PASS SVGFECompositeElement interface: feComposite must inherit property "x" with the proper type 
+PASS SVGFECompositeElement interface: feComposite must inherit property "y" with the proper type 
+PASS SVGFECompositeElement interface: feComposite must inherit property "width" with the proper type 
+PASS SVGFECompositeElement interface: feComposite must inherit property "height" with the proper type 
+PASS SVGFECompositeElement interface: feComposite must inherit property "result" with the proper type 
+PASS SVGElement interface: feComposite must inherit property "className" with the proper type 
+PASS SVGElement interface: feComposite must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feComposite must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feComposite must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feComposite must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feComposite must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feComposite must inherit property "blur()" with the proper type 
 PASS SVGFEConvolveMatrixElement interface: existence and properties of interface object 
 PASS SVGFEConvolveMatrixElement interface object length 
 PASS SVGFEConvolveMatrixElement interface object name 
@@ -2013,33 +2013,33 @@
 PASS SVGFEConvolveMatrixElement interface: attribute result 
 PASS SVGFEConvolveMatrixElement must be primary interface of feConvolveMatrix 
 PASS Stringification of feConvolveMatrix 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "SVG_EDGEMODE_UNKNOWN" with the proper type (0) 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "SVG_EDGEMODE_DUPLICATE" with the proper type (1) 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "SVG_EDGEMODE_WRAP" with the proper type (2) 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "SVG_EDGEMODE_NONE" with the proper type (3) 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "in1" with the proper type (4) 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "orderX" with the proper type (5) 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "orderY" with the proper type (6) 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "kernelMatrix" with the proper type (7) 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "divisor" with the proper type (8) 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "bias" with the proper type (9) 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "targetX" with the proper type (10) 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "targetY" with the proper type (11) 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "edgeMode" with the proper type (12) 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "kernelUnitLengthX" with the proper type (13) 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "kernelUnitLengthY" with the proper type (14) 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "x" with the proper type (15) 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "y" with the proper type (16) 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "width" with the proper type (17) 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "height" with the proper type (18) 
-PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "result" with the proper type (19) 
-PASS SVGElement interface: feConvolveMatrix must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feConvolveMatrix must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feConvolveMatrix must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feConvolveMatrix must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feConvolveMatrix must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feConvolveMatrix must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feConvolveMatrix must inherit property "blur" with the proper type (6) 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "SVG_EDGEMODE_UNKNOWN" with the proper type 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "SVG_EDGEMODE_DUPLICATE" with the proper type 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "SVG_EDGEMODE_WRAP" with the proper type 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "SVG_EDGEMODE_NONE" with the proper type 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "in1" with the proper type 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "orderX" with the proper type 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "orderY" with the proper type 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "kernelMatrix" with the proper type 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "divisor" with the proper type 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "bias" with the proper type 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "targetX" with the proper type 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "targetY" with the proper type 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "edgeMode" with the proper type 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "kernelUnitLengthX" with the proper type 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "kernelUnitLengthY" with the proper type 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "x" with the proper type 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "y" with the proper type 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "width" with the proper type 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "height" with the proper type 
+PASS SVGFEConvolveMatrixElement interface: feConvolveMatrix must inherit property "result" with the proper type 
+PASS SVGElement interface: feConvolveMatrix must inherit property "className" with the proper type 
+PASS SVGElement interface: feConvolveMatrix must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feConvolveMatrix must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feConvolveMatrix must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feConvolveMatrix must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feConvolveMatrix must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feConvolveMatrix must inherit property "blur()" with the proper type 
 PASS SVGFEDiffuseLightingElement interface: existence and properties of interface object 
 PASS SVGFEDiffuseLightingElement interface object length 
 PASS SVGFEDiffuseLightingElement interface object name 
@@ -2057,23 +2057,23 @@
 PASS SVGFEDiffuseLightingElement interface: attribute result 
 PASS SVGFEDiffuseLightingElement must be primary interface of feDiffuseLighting 
 PASS Stringification of feDiffuseLighting 
-PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "in1" with the proper type (0) 
-PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "surfaceScale" with the proper type (1) 
-PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "diffuseConstant" with the proper type (2) 
-PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "kernelUnitLengthX" with the proper type (3) 
-PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "kernelUnitLengthY" with the proper type (4) 
-PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "x" with the proper type (5) 
-PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "y" with the proper type (6) 
-PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "width" with the proper type (7) 
-PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "height" with the proper type (8) 
-PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "result" with the proper type (9) 
-PASS SVGElement interface: feDiffuseLighting must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feDiffuseLighting must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feDiffuseLighting must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feDiffuseLighting must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feDiffuseLighting must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feDiffuseLighting must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feDiffuseLighting must inherit property "blur" with the proper type (6) 
+PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "in1" with the proper type 
+PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "surfaceScale" with the proper type 
+PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "diffuseConstant" with the proper type 
+PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "kernelUnitLengthX" with the proper type 
+PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "kernelUnitLengthY" with the proper type 
+PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "x" with the proper type 
+PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "y" with the proper type 
+PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "width" with the proper type 
+PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "height" with the proper type 
+PASS SVGFEDiffuseLightingElement interface: feDiffuseLighting must inherit property "result" with the proper type 
+PASS SVGElement interface: feDiffuseLighting must inherit property "className" with the proper type 
+PASS SVGElement interface: feDiffuseLighting must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feDiffuseLighting must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feDiffuseLighting must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feDiffuseLighting must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feDiffuseLighting must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feDiffuseLighting must inherit property "blur()" with the proper type 
 PASS SVGFEDistantLightElement interface: existence and properties of interface object 
 PASS SVGFEDistantLightElement interface object length 
 PASS SVGFEDistantLightElement interface object name 
@@ -2091,16 +2091,16 @@
 PASS SVGFEPointLightElement interface: attribute z 
 PASS SVGFEPointLightElement must be primary interface of fePointLight 
 PASS Stringification of fePointLight 
-PASS SVGFEPointLightElement interface: fePointLight must inherit property "x" with the proper type (0) 
-PASS SVGFEPointLightElement interface: fePointLight must inherit property "y" with the proper type (1) 
-PASS SVGFEPointLightElement interface: fePointLight must inherit property "z" with the proper type (2) 
-PASS SVGElement interface: fePointLight must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: fePointLight must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: fePointLight must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: fePointLight must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: fePointLight must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: fePointLight must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: fePointLight must inherit property "blur" with the proper type (6) 
+PASS SVGFEPointLightElement interface: fePointLight must inherit property "x" with the proper type 
+PASS SVGFEPointLightElement interface: fePointLight must inherit property "y" with the proper type 
+PASS SVGFEPointLightElement interface: fePointLight must inherit property "z" with the proper type 
+PASS SVGElement interface: fePointLight must inherit property "className" with the proper type 
+PASS SVGElement interface: fePointLight must inherit property "dataset" with the proper type 
+PASS SVGElement interface: fePointLight must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: fePointLight must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: fePointLight must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: fePointLight must inherit property "focus()" with the proper type 
+PASS SVGElement interface: fePointLight must inherit property "blur()" with the proper type 
 PASS SVGFESpotLightElement interface: existence and properties of interface object 
 PASS SVGFESpotLightElement interface object length 
 PASS SVGFESpotLightElement interface object name 
@@ -2116,21 +2116,21 @@
 PASS SVGFESpotLightElement interface: attribute limitingConeAngle 
 PASS SVGFESpotLightElement must be primary interface of feSpotLight 
 PASS Stringification of feSpotLight 
-PASS SVGFESpotLightElement interface: feSpotLight must inherit property "x" with the proper type (0) 
-PASS SVGFESpotLightElement interface: feSpotLight must inherit property "y" with the proper type (1) 
-PASS SVGFESpotLightElement interface: feSpotLight must inherit property "z" with the proper type (2) 
-PASS SVGFESpotLightElement interface: feSpotLight must inherit property "pointsAtX" with the proper type (3) 
-PASS SVGFESpotLightElement interface: feSpotLight must inherit property "pointsAtY" with the proper type (4) 
-PASS SVGFESpotLightElement interface: feSpotLight must inherit property "pointsAtZ" with the proper type (5) 
-PASS SVGFESpotLightElement interface: feSpotLight must inherit property "specularExponent" with the proper type (6) 
-PASS SVGFESpotLightElement interface: feSpotLight must inherit property "limitingConeAngle" with the proper type (7) 
-PASS SVGElement interface: feSpotLight must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feSpotLight must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feSpotLight must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feSpotLight must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feSpotLight must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feSpotLight must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feSpotLight must inherit property "blur" with the proper type (6) 
+PASS SVGFESpotLightElement interface: feSpotLight must inherit property "x" with the proper type 
+PASS SVGFESpotLightElement interface: feSpotLight must inherit property "y" with the proper type 
+PASS SVGFESpotLightElement interface: feSpotLight must inherit property "z" with the proper type 
+PASS SVGFESpotLightElement interface: feSpotLight must inherit property "pointsAtX" with the proper type 
+PASS SVGFESpotLightElement interface: feSpotLight must inherit property "pointsAtY" with the proper type 
+PASS SVGFESpotLightElement interface: feSpotLight must inherit property "pointsAtZ" with the proper type 
+PASS SVGFESpotLightElement interface: feSpotLight must inherit property "specularExponent" with the proper type 
+PASS SVGFESpotLightElement interface: feSpotLight must inherit property "limitingConeAngle" with the proper type 
+PASS SVGElement interface: feSpotLight must inherit property "className" with the proper type 
+PASS SVGElement interface: feSpotLight must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feSpotLight must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feSpotLight must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feSpotLight must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feSpotLight must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feSpotLight must inherit property "blur()" with the proper type 
 PASS SVGFEDisplacementMapElement interface: existence and properties of interface object 
 PASS SVGFEDisplacementMapElement interface object length 
 PASS SVGFEDisplacementMapElement interface object name 
@@ -2158,28 +2158,28 @@
 PASS SVGFEDisplacementMapElement interface: attribute result 
 PASS SVGFEDisplacementMapElement must be primary interface of feDisplacementMap 
 PASS Stringification of feDisplacementMap 
-PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_UNKNOWN" with the proper type (0) 
-PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_R" with the proper type (1) 
-PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_G" with the proper type (2) 
-PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_B" with the proper type (3) 
-PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_A" with the proper type (4) 
-PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "in1" with the proper type (5) 
-PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "in2" with the proper type (6) 
-PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "scale" with the proper type (7) 
-PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "xChannelSelector" with the proper type (8) 
-PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "yChannelSelector" with the proper type (9) 
-PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "x" with the proper type (10) 
-PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "y" with the proper type (11) 
-PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "width" with the proper type (12) 
-PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "height" with the proper type (13) 
-PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "result" with the proper type (14) 
-PASS SVGElement interface: feDisplacementMap must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feDisplacementMap must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feDisplacementMap must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feDisplacementMap must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feDisplacementMap must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feDisplacementMap must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feDisplacementMap must inherit property "blur" with the proper type (6) 
+PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_UNKNOWN" with the proper type 
+PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_R" with the proper type 
+PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_G" with the proper type 
+PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_B" with the proper type 
+PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "SVG_CHANNEL_A" with the proper type 
+PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "in1" with the proper type 
+PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "in2" with the proper type 
+PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "scale" with the proper type 
+PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "xChannelSelector" with the proper type 
+PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "yChannelSelector" with the proper type 
+PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "x" with the proper type 
+PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "y" with the proper type 
+PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "width" with the proper type 
+PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "height" with the proper type 
+PASS SVGFEDisplacementMapElement interface: feDisplacementMap must inherit property "result" with the proper type 
+PASS SVGElement interface: feDisplacementMap must inherit property "className" with the proper type 
+PASS SVGElement interface: feDisplacementMap must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feDisplacementMap must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feDisplacementMap must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feDisplacementMap must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feDisplacementMap must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feDisplacementMap must inherit property "blur()" with the proper type 
 PASS SVGFEDropShadowElement interface: existence and properties of interface object 
 PASS SVGFEDropShadowElement interface object length 
 PASS SVGFEDropShadowElement interface object name 
@@ -2190,7 +2190,7 @@
 PASS SVGFEDropShadowElement interface: attribute dy 
 PASS SVGFEDropShadowElement interface: attribute stdDeviationX 
 PASS SVGFEDropShadowElement interface: attribute stdDeviationY 
-PASS SVGFEDropShadowElement interface: operation setStdDeviation(float,float) 
+PASS SVGFEDropShadowElement interface: operation setStdDeviation(float, float) 
 PASS SVGFEDropShadowElement interface: attribute x 
 PASS SVGFEDropShadowElement interface: attribute y 
 PASS SVGFEDropShadowElement interface: attribute width 
@@ -2198,25 +2198,25 @@
 PASS SVGFEDropShadowElement interface: attribute result 
 PASS SVGFEDropShadowElement must be primary interface of feDropShadow 
 PASS Stringification of feDropShadow 
-PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "in1" with the proper type (0) 
-PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "dx" with the proper type (1) 
-PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "dy" with the proper type (2) 
-PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "stdDeviationX" with the proper type (3) 
-PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "stdDeviationY" with the proper type (4) 
-PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "setStdDeviation" with the proper type (5) 
-PASS SVGFEDropShadowElement interface: calling setStdDeviation(float,float) on feDropShadow with too few arguments must throw TypeError 
-PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "x" with the proper type (6) 
-PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "y" with the proper type (7) 
-PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "width" with the proper type (8) 
-PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "height" with the proper type (9) 
-PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "result" with the proper type (10) 
-PASS SVGElement interface: feDropShadow must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feDropShadow must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feDropShadow must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feDropShadow must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feDropShadow must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feDropShadow must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feDropShadow must inherit property "blur" with the proper type (6) 
+PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "in1" with the proper type 
+PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "dx" with the proper type 
+PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "dy" with the proper type 
+PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "stdDeviationX" with the proper type 
+PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "stdDeviationY" with the proper type 
+PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "setStdDeviation(float, float)" with the proper type 
+PASS SVGFEDropShadowElement interface: calling setStdDeviation(float, float) on feDropShadow with too few arguments must throw TypeError 
+PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "x" with the proper type 
+PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "y" with the proper type 
+PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "width" with the proper type 
+PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "height" with the proper type 
+PASS SVGFEDropShadowElement interface: feDropShadow must inherit property "result" with the proper type 
+PASS SVGElement interface: feDropShadow must inherit property "className" with the proper type 
+PASS SVGElement interface: feDropShadow must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feDropShadow must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feDropShadow must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feDropShadow must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feDropShadow must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feDropShadow must inherit property "blur()" with the proper type 
 PASS SVGFEFloodElement interface: existence and properties of interface object 
 PASS SVGFEFloodElement interface object length 
 PASS SVGFEFloodElement interface object name 
@@ -2229,18 +2229,18 @@
 PASS SVGFEFloodElement interface: attribute result 
 PASS SVGFEFloodElement must be primary interface of feFlood 
 PASS Stringification of feFlood 
-PASS SVGFEFloodElement interface: feFlood must inherit property "x" with the proper type (0) 
-PASS SVGFEFloodElement interface: feFlood must inherit property "y" with the proper type (1) 
-PASS SVGFEFloodElement interface: feFlood must inherit property "width" with the proper type (2) 
-PASS SVGFEFloodElement interface: feFlood must inherit property "height" with the proper type (3) 
-PASS SVGFEFloodElement interface: feFlood must inherit property "result" with the proper type (4) 
-PASS SVGElement interface: feFlood must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feFlood must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feFlood must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feFlood must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feFlood must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feFlood must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feFlood must inherit property "blur" with the proper type (6) 
+PASS SVGFEFloodElement interface: feFlood must inherit property "x" with the proper type 
+PASS SVGFEFloodElement interface: feFlood must inherit property "y" with the proper type 
+PASS SVGFEFloodElement interface: feFlood must inherit property "width" with the proper type 
+PASS SVGFEFloodElement interface: feFlood must inherit property "height" with the proper type 
+PASS SVGFEFloodElement interface: feFlood must inherit property "result" with the proper type 
+PASS SVGElement interface: feFlood must inherit property "className" with the proper type 
+PASS SVGElement interface: feFlood must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feFlood must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feFlood must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feFlood must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feFlood must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feFlood must inherit property "blur()" with the proper type 
 PASS SVGFEGaussianBlurElement interface: existence and properties of interface object 
 PASS SVGFEGaussianBlurElement interface object length 
 PASS SVGFEGaussianBlurElement interface object name 
@@ -2258,7 +2258,7 @@
 PASS SVGFEGaussianBlurElement interface: attribute stdDeviationX 
 PASS SVGFEGaussianBlurElement interface: attribute stdDeviationY 
 FAIL SVGFEGaussianBlurElement interface: attribute edgeMode assert_true: The prototype object must have a property "edgeMode" expected true got false
-PASS SVGFEGaussianBlurElement interface: operation setStdDeviation(float,float) 
+PASS SVGFEGaussianBlurElement interface: operation setStdDeviation(float, float) 
 PASS SVGFEGaussianBlurElement interface: attribute x 
 PASS SVGFEGaussianBlurElement interface: attribute y 
 PASS SVGFEGaussianBlurElement interface: attribute width 
@@ -2266,28 +2266,28 @@
 PASS SVGFEGaussianBlurElement interface: attribute result 
 PASS SVGFEGaussianBlurElement must be primary interface of feGaussianBlur 
 PASS Stringification of feGaussianBlur 
-FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "SVG_EDGEMODE_UNKNOWN" with the proper type (0) assert_inherits: property "SVG_EDGEMODE_UNKNOWN" not found in prototype chain
-FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "SVG_EDGEMODE_DUPLICATE" with the proper type (1) assert_inherits: property "SVG_EDGEMODE_DUPLICATE" not found in prototype chain
-FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "SVG_EDGEMODE_WRAP" with the proper type (2) assert_inherits: property "SVG_EDGEMODE_WRAP" not found in prototype chain
-FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "SVG_EDGEMODE_NONE" with the proper type (3) assert_inherits: property "SVG_EDGEMODE_NONE" not found in prototype chain
-PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "in1" with the proper type (4) 
-PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "stdDeviationX" with the proper type (5) 
-PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "stdDeviationY" with the proper type (6) 
-FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "edgeMode" with the proper type (7) assert_inherits: property "edgeMode" not found in prototype chain
-PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "setStdDeviation" with the proper type (8) 
-PASS SVGFEGaussianBlurElement interface: calling setStdDeviation(float,float) on feGaussianBlur with too few arguments must throw TypeError 
-PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "x" with the proper type (9) 
-PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "y" with the proper type (10) 
-PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "width" with the proper type (11) 
-PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "height" with the proper type (12) 
-PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "result" with the proper type (13) 
-PASS SVGElement interface: feGaussianBlur must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feGaussianBlur must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feGaussianBlur must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feGaussianBlur must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feGaussianBlur must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feGaussianBlur must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feGaussianBlur must inherit property "blur" with the proper type (6) 
+FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "SVG_EDGEMODE_UNKNOWN" with the proper type assert_inherits: property "SVG_EDGEMODE_UNKNOWN" not found in prototype chain
+FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "SVG_EDGEMODE_DUPLICATE" with the proper type assert_inherits: property "SVG_EDGEMODE_DUPLICATE" not found in prototype chain
+FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "SVG_EDGEMODE_WRAP" with the proper type assert_inherits: property "SVG_EDGEMODE_WRAP" not found in prototype chain
+FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "SVG_EDGEMODE_NONE" with the proper type assert_inherits: property "SVG_EDGEMODE_NONE" not found in prototype chain
+PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "in1" with the proper type 
+PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "stdDeviationX" with the proper type 
+PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "stdDeviationY" with the proper type 
+FAIL SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "edgeMode" with the proper type assert_inherits: property "edgeMode" not found in prototype chain
+PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "setStdDeviation(float, float)" with the proper type 
+PASS SVGFEGaussianBlurElement interface: calling setStdDeviation(float, float) on feGaussianBlur with too few arguments must throw TypeError 
+PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "x" with the proper type 
+PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "y" with the proper type 
+PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "width" with the proper type 
+PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "height" with the proper type 
+PASS SVGFEGaussianBlurElement interface: feGaussianBlur must inherit property "result" with the proper type 
+PASS SVGElement interface: feGaussianBlur must inherit property "className" with the proper type 
+PASS SVGElement interface: feGaussianBlur must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feGaussianBlur must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feGaussianBlur must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feGaussianBlur must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feGaussianBlur must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feGaussianBlur must inherit property "blur()" with the proper type 
 PASS SVGFEImageElement interface: existence and properties of interface object 
 PASS SVGFEImageElement interface object length 
 PASS SVGFEImageElement interface object name 
@@ -2303,21 +2303,21 @@
 PASS SVGFEImageElement interface: attribute href 
 PASS SVGFEImageElement must be primary interface of feImage 
 PASS Stringification of feImage 
-PASS SVGFEImageElement interface: feImage must inherit property "preserveAspectRatio" with the proper type (0) 
-FAIL SVGFEImageElement interface: feImage must inherit property "crossOrigin" with the proper type (1) assert_inherits: property "crossOrigin" not found in prototype chain
-PASS SVGFEImageElement interface: feImage must inherit property "x" with the proper type (2) 
-PASS SVGFEImageElement interface: feImage must inherit property "y" with the proper type (3) 
-PASS SVGFEImageElement interface: feImage must inherit property "width" with the proper type (4) 
-PASS SVGFEImageElement interface: feImage must inherit property "height" with the proper type (5) 
-PASS SVGFEImageElement interface: feImage must inherit property "result" with the proper type (6) 
-PASS SVGFEImageElement interface: feImage must inherit property "href" with the proper type (7) 
-PASS SVGElement interface: feImage must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feImage must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feImage must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feImage must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feImage must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feImage must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feImage must inherit property "blur" with the proper type (6) 
+PASS SVGFEImageElement interface: feImage must inherit property "preserveAspectRatio" with the proper type 
+FAIL SVGFEImageElement interface: feImage must inherit property "crossOrigin" with the proper type assert_inherits: property "crossOrigin" not found in prototype chain
+PASS SVGFEImageElement interface: feImage must inherit property "x" with the proper type 
+PASS SVGFEImageElement interface: feImage must inherit property "y" with the proper type 
+PASS SVGFEImageElement interface: feImage must inherit property "width" with the proper type 
+PASS SVGFEImageElement interface: feImage must inherit property "height" with the proper type 
+PASS SVGFEImageElement interface: feImage must inherit property "result" with the proper type 
+PASS SVGFEImageElement interface: feImage must inherit property "href" with the proper type 
+PASS SVGElement interface: feImage must inherit property "className" with the proper type 
+PASS SVGElement interface: feImage must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feImage must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feImage must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feImage must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feImage must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feImage must inherit property "blur()" with the proper type 
 PASS SVGFEMergeElement interface: existence and properties of interface object 
 PASS SVGFEMergeElement interface object length 
 PASS SVGFEMergeElement interface object name 
@@ -2330,18 +2330,18 @@
 PASS SVGFEMergeElement interface: attribute result 
 PASS SVGFEMergeElement must be primary interface of feMerge 
 PASS Stringification of feMerge 
-PASS SVGFEMergeElement interface: feMerge must inherit property "x" with the proper type (0) 
-PASS SVGFEMergeElement interface: feMerge must inherit property "y" with the proper type (1) 
-PASS SVGFEMergeElement interface: feMerge must inherit property "width" with the proper type (2) 
-PASS SVGFEMergeElement interface: feMerge must inherit property "height" with the proper type (3) 
-PASS SVGFEMergeElement interface: feMerge must inherit property "result" with the proper type (4) 
-PASS SVGElement interface: feMerge must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feMerge must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feMerge must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feMerge must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feMerge must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feMerge must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feMerge must inherit property "blur" with the proper type (6) 
+PASS SVGFEMergeElement interface: feMerge must inherit property "x" with the proper type 
+PASS SVGFEMergeElement interface: feMerge must inherit property "y" with the proper type 
+PASS SVGFEMergeElement interface: feMerge must inherit property "width" with the proper type 
+PASS SVGFEMergeElement interface: feMerge must inherit property "height" with the proper type 
+PASS SVGFEMergeElement interface: feMerge must inherit property "result" with the proper type 
+PASS SVGElement interface: feMerge must inherit property "className" with the proper type 
+PASS SVGElement interface: feMerge must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feMerge must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feMerge must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feMerge must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feMerge must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feMerge must inherit property "blur()" with the proper type 
 PASS SVGFEMergeNodeElement interface: existence and properties of interface object 
 PASS SVGFEMergeNodeElement interface object length 
 PASS SVGFEMergeNodeElement interface object name 
@@ -2350,14 +2350,14 @@
 PASS SVGFEMergeNodeElement interface: attribute in1 
 PASS SVGFEMergeNodeElement must be primary interface of feMergeNode 
 PASS Stringification of feMergeNode 
-PASS SVGFEMergeNodeElement interface: feMergeNode must inherit property "in1" with the proper type (0) 
-PASS SVGElement interface: feMergeNode must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feMergeNode must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feMergeNode must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feMergeNode must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feMergeNode must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feMergeNode must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feMergeNode must inherit property "blur" with the proper type (6) 
+PASS SVGFEMergeNodeElement interface: feMergeNode must inherit property "in1" with the proper type 
+PASS SVGElement interface: feMergeNode must inherit property "className" with the proper type 
+PASS SVGElement interface: feMergeNode must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feMergeNode must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feMergeNode must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feMergeNode must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feMergeNode must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feMergeNode must inherit property "blur()" with the proper type 
 PASS SVGFEMorphologyElement interface: existence and properties of interface object 
 PASS SVGFEMorphologyElement interface object length 
 PASS SVGFEMorphologyElement interface object name 
@@ -2380,25 +2380,25 @@
 PASS SVGFEMorphologyElement interface: attribute result 
 PASS SVGFEMorphologyElement must be primary interface of feMorphology 
 PASS Stringification of feMorphology 
-PASS SVGFEMorphologyElement interface: feMorphology must inherit property "SVG_MORPHOLOGY_OPERATOR_UNKNOWN" with the proper type (0) 
-PASS SVGFEMorphologyElement interface: feMorphology must inherit property "SVG_MORPHOLOGY_OPERATOR_ERODE" with the proper type (1) 
-PASS SVGFEMorphologyElement interface: feMorphology must inherit property "SVG_MORPHOLOGY_OPERATOR_DILATE" with the proper type (2) 
-PASS SVGFEMorphologyElement interface: feMorphology must inherit property "in1" with the proper type (3) 
-PASS SVGFEMorphologyElement interface: feMorphology must inherit property "operator" with the proper type (4) 
-PASS SVGFEMorphologyElement interface: feMorphology must inherit property "radiusX" with the proper type (5) 
-PASS SVGFEMorphologyElement interface: feMorphology must inherit property "radiusY" with the proper type (6) 
-PASS SVGFEMorphologyElement interface: feMorphology must inherit property "x" with the proper type (7) 
-PASS SVGFEMorphologyElement interface: feMorphology must inherit property "y" with the proper type (8) 
-PASS SVGFEMorphologyElement interface: feMorphology must inherit property "width" with the proper type (9) 
-PASS SVGFEMorphologyElement interface: feMorphology must inherit property "height" with the proper type (10) 
-PASS SVGFEMorphologyElement interface: feMorphology must inherit property "result" with the proper type (11) 
-PASS SVGElement interface: feMorphology must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feMorphology must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feMorphology must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feMorphology must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feMorphology must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feMorphology must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feMorphology must inherit property "blur" with the proper type (6) 
+PASS SVGFEMorphologyElement interface: feMorphology must inherit property "SVG_MORPHOLOGY_OPERATOR_UNKNOWN" with the proper type 
+PASS SVGFEMorphologyElement interface: feMorphology must inherit property "SVG_MORPHOLOGY_OPERATOR_ERODE" with the proper type 
+PASS SVGFEMorphologyElement interface: feMorphology must inherit property "SVG_MORPHOLOGY_OPERATOR_DILATE" with the proper type 
+PASS SVGFEMorphologyElement interface: feMorphology must inherit property "in1" with the proper type 
+PASS SVGFEMorphologyElement interface: feMorphology must inherit property "operator" with the proper type 
+PASS SVGFEMorphologyElement interface: feMorphology must inherit property "radiusX" with the proper type 
+PASS SVGFEMorphologyElement interface: feMorphology must inherit property "radiusY" with the proper type 
+PASS SVGFEMorphologyElement interface: feMorphology must inherit property "x" with the proper type 
+PASS SVGFEMorphologyElement interface: feMorphology must inherit property "y" with the proper type 
+PASS SVGFEMorphologyElement interface: feMorphology must inherit property "width" with the proper type 
+PASS SVGFEMorphologyElement interface: feMorphology must inherit property "height" with the proper type 
+PASS SVGFEMorphologyElement interface: feMorphology must inherit property "result" with the proper type 
+PASS SVGElement interface: feMorphology must inherit property "className" with the proper type 
+PASS SVGElement interface: feMorphology must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feMorphology must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feMorphology must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feMorphology must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feMorphology must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feMorphology must inherit property "blur()" with the proper type 
 PASS SVGFEOffsetElement interface: existence and properties of interface object 
 PASS SVGFEOffsetElement interface object length 
 PASS SVGFEOffsetElement interface object name 
@@ -2430,24 +2430,24 @@
 PASS SVGFESpecularLightingElement interface: attribute result 
 PASS SVGFESpecularLightingElement must be primary interface of feSpecularLighting 
 PASS Stringification of feSpecularLighting 
-PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "in1" with the proper type (0) 
-PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "surfaceScale" with the proper type (1) 
-PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "specularConstant" with the proper type (2) 
-PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "specularExponent" with the proper type (3) 
-PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "kernelUnitLengthX" with the proper type (4) 
-PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "kernelUnitLengthY" with the proper type (5) 
-PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "x" with the proper type (6) 
-PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "y" with the proper type (7) 
-PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "width" with the proper type (8) 
-PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "height" with the proper type (9) 
-PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "result" with the proper type (10) 
-PASS SVGElement interface: feSpecularLighting must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feSpecularLighting must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feSpecularLighting must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feSpecularLighting must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feSpecularLighting must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feSpecularLighting must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feSpecularLighting must inherit property "blur" with the proper type (6) 
+PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "in1" with the proper type 
+PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "surfaceScale" with the proper type 
+PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "specularConstant" with the proper type 
+PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "specularExponent" with the proper type 
+PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "kernelUnitLengthX" with the proper type 
+PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "kernelUnitLengthY" with the proper type 
+PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "x" with the proper type 
+PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "y" with the proper type 
+PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "width" with the proper type 
+PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "height" with the proper type 
+PASS SVGFESpecularLightingElement interface: feSpecularLighting must inherit property "result" with the proper type 
+PASS SVGElement interface: feSpecularLighting must inherit property "className" with the proper type 
+PASS SVGElement interface: feSpecularLighting must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feSpecularLighting must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feSpecularLighting must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feSpecularLighting must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feSpecularLighting must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feSpecularLighting must inherit property "blur()" with the proper type 
 PASS SVGFETileElement interface: existence and properties of interface object 
 PASS SVGFETileElement interface object length 
 PASS SVGFETileElement interface object name 
@@ -2461,19 +2461,19 @@
 PASS SVGFETileElement interface: attribute result 
 PASS SVGFETileElement must be primary interface of feTile 
 PASS Stringification of feTile 
-PASS SVGFETileElement interface: feTile must inherit property "in1" with the proper type (0) 
-PASS SVGFETileElement interface: feTile must inherit property "x" with the proper type (1) 
-PASS SVGFETileElement interface: feTile must inherit property "y" with the proper type (2) 
-PASS SVGFETileElement interface: feTile must inherit property "width" with the proper type (3) 
-PASS SVGFETileElement interface: feTile must inherit property "height" with the proper type (4) 
-PASS SVGFETileElement interface: feTile must inherit property "result" with the proper type (5) 
-PASS SVGElement interface: feTile must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feTile must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feTile must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feTile must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feTile must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feTile must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feTile must inherit property "blur" with the proper type (6) 
+PASS SVGFETileElement interface: feTile must inherit property "in1" with the proper type 
+PASS SVGFETileElement interface: feTile must inherit property "x" with the proper type 
+PASS SVGFETileElement interface: feTile must inherit property "y" with the proper type 
+PASS SVGFETileElement interface: feTile must inherit property "width" with the proper type 
+PASS SVGFETileElement interface: feTile must inherit property "height" with the proper type 
+PASS SVGFETileElement interface: feTile must inherit property "result" with the proper type 
+PASS SVGElement interface: feTile must inherit property "className" with the proper type 
+PASS SVGElement interface: feTile must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feTile must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feTile must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feTile must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feTile must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feTile must inherit property "blur()" with the proper type 
 PASS SVGFETurbulenceElement interface: existence and properties of interface object 
 PASS SVGFETurbulenceElement interface object length 
 PASS SVGFETurbulenceElement interface object name 
@@ -2504,29 +2504,29 @@
 PASS SVGFETurbulenceElement interface: attribute result 
 PASS SVGFETurbulenceElement must be primary interface of feTurbulence 
 PASS Stringification of feTurbulence 
-PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_TURBULENCE_TYPE_UNKNOWN" with the proper type (0) 
-PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_TURBULENCE_TYPE_FRACTALNOISE" with the proper type (1) 
-PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_TURBULENCE_TYPE_TURBULENCE" with the proper type (2) 
-PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_STITCHTYPE_UNKNOWN" with the proper type (3) 
-PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_STITCHTYPE_STITCH" with the proper type (4) 
-PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_STITCHTYPE_NOSTITCH" with the proper type (5) 
-PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "baseFrequencyX" with the proper type (6) 
-PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "baseFrequencyY" with the proper type (7) 
-PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "numOctaves" with the proper type (8) 
-PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "seed" with the proper type (9) 
-PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "stitchTiles" with the proper type (10) 
-PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "type" with the proper type (11) 
-PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "x" with the proper type (12) 
-PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "y" with the proper type (13) 
-PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "width" with the proper type (14) 
-PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "height" with the proper type (15) 
-PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "result" with the proper type (16) 
-PASS SVGElement interface: feTurbulence must inherit property "className" with the proper type (0) 
-PASS SVGElement interface: feTurbulence must inherit property "dataset" with the proper type (1) 
-PASS SVGElement interface: feTurbulence must inherit property "ownerSVGElement" with the proper type (2) 
-PASS SVGElement interface: feTurbulence must inherit property "viewportElement" with the proper type (3) 
-PASS SVGElement interface: feTurbulence must inherit property "tabIndex" with the proper type (4) 
-PASS SVGElement interface: feTurbulence must inherit property "focus" with the proper type (5) 
-PASS SVGElement interface: feTurbulence must inherit property "blur" with the proper type (6) 
+PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_TURBULENCE_TYPE_UNKNOWN" with the proper type 
+PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_TURBULENCE_TYPE_FRACTALNOISE" with the proper type 
+PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_TURBULENCE_TYPE_TURBULENCE" with the proper type 
+PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_STITCHTYPE_UNKNOWN" with the proper type 
+PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_STITCHTYPE_STITCH" with the proper type 
+PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "SVG_STITCHTYPE_NOSTITCH" with the proper type 
+PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "baseFrequencyX" with the proper type 
+PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "baseFrequencyY" with the proper type 
+PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "numOctaves" with the proper type 
+PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "seed" with the proper type 
+PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "stitchTiles" with the proper type 
+PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "type" with the proper type 
+PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "x" with the proper type 
+PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "y" with the proper type 
+PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "width" with the proper type 
+PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "height" with the proper type 
+PASS SVGFETurbulenceElement interface: feTurbulence must inherit property "result" with the proper type 
+PASS SVGElement interface: feTurbulence must inherit property "className" with the proper type 
+PASS SVGElement interface: feTurbulence must inherit property "dataset" with the proper type 
+PASS SVGElement interface: feTurbulence must inherit property "ownerSVGElement" with the proper type 
+PASS SVGElement interface: feTurbulence must inherit property "viewportElement" with the proper type 
+PASS SVGElement interface: feTurbulence must inherit property "tabIndex" with the proper type 
+PASS SVGElement interface: feTurbulence must inherit property "focus()" with the proper type 
+PASS SVGElement interface: feTurbulence must inherit property "blur()" with the proper type 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/url/interfaces.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/url/interfaces.any-expected.txt
index 4c167d6..979aeda 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/url/interfaces.any-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/url/interfaces.any-expected.txt
@@ -22,30 +22,30 @@
 FAIL URL interface: operation toJSON() assert_own_property: interface prototype object missing non-static operation expected property "toJSON" missing
 PASS URL must be primary interface of new URL("http://foo") 
 PASS Stringification of new URL("http://foo") 
-PASS URL interface: new URL("http://foo") must inherit property "href" with the proper type (0) 
-PASS URL interface: new URL("http://foo") must inherit property "origin" with the proper type (1) 
-PASS URL interface: new URL("http://foo") must inherit property "protocol" with the proper type (2) 
-PASS URL interface: new URL("http://foo") must inherit property "username" with the proper type (3) 
-PASS URL interface: new URL("http://foo") must inherit property "password" with the proper type (4) 
-PASS URL interface: new URL("http://foo") must inherit property "host" with the proper type (5) 
-PASS URL interface: new URL("http://foo") must inherit property "hostname" with the proper type (6) 
-PASS URL interface: new URL("http://foo") must inherit property "port" with the proper type (7) 
-PASS URL interface: new URL("http://foo") must inherit property "pathname" with the proper type (8) 
-PASS URL interface: new URL("http://foo") must inherit property "search" with the proper type (9) 
-PASS URL interface: new URL("http://foo") must inherit property "searchParams" with the proper type (10) 
-PASS URL interface: new URL("http://foo") must inherit property "hash" with the proper type (11) 
-FAIL URL interface: new URL("http://foo") must inherit property "toJSON" with the proper type (12) assert_inherits: property "toJSON" not found in prototype chain
+PASS URL interface: new URL("http://foo") must inherit property "href" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "origin" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "protocol" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "username" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "password" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "host" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "hostname" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "port" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "pathname" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "search" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "searchParams" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "hash" with the proper type 
+FAIL URL interface: new URL("http://foo") must inherit property "toJSON()" with the proper type assert_inherits: property "toJSON" not found in prototype chain
 PASS URLSearchParams interface: existence and properties of interface object 
 PASS URLSearchParams interface object length 
 PASS URLSearchParams interface object name 
 PASS URLSearchParams interface: existence and properties of interface prototype object 
 PASS URLSearchParams interface: existence and properties of interface prototype object's "constructor" property 
-PASS URLSearchParams interface: operation append(USVString,USVString) 
+PASS URLSearchParams interface: operation append(USVString, USVString) 
 PASS URLSearchParams interface: operation delete(USVString) 
 PASS URLSearchParams interface: operation get(USVString) 
 PASS URLSearchParams interface: operation getAll(USVString) 
 PASS URLSearchParams interface: operation has(USVString) 
-PASS URLSearchParams interface: operation set(USVString,USVString) 
+PASS URLSearchParams interface: operation set(USVString, USVString) 
 PASS URLSearchParams interface: operation sort() 
 PASS Testing Symbol.iterator property of iterable interface URLSearchParams 
 PASS Testing pair iterable interface URLSearchParams 
@@ -53,26 +53,26 @@
 PASS URLSearchParams interface: operation entries() 
 PASS URLSearchParams interface: operation keys() 
 PASS URLSearchParams interface: operation values() 
-PASS URLSearchParams interface: operation forEach(function,any) 
+PASS URLSearchParams interface: operation forEach(function, any) 
 PASS URLSearchParams must be primary interface of new URLSearchParams("hi=there&thank=you") 
 PASS Stringification of new URLSearchParams("hi=there&thank=you") 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "append" with the proper type (0) 
-PASS URLSearchParams interface: calling append(USVString,USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "delete" with the proper type (1) 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "append(USVString, USVString)" with the proper type 
+PASS URLSearchParams interface: calling append(USVString, USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "delete(USVString)" with the proper type 
 PASS URLSearchParams interface: calling delete(USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "get" with the proper type (2) 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "get(USVString)" with the proper type 
 PASS URLSearchParams interface: calling get(USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "getAll" with the proper type (3) 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "getAll(USVString)" with the proper type 
 PASS URLSearchParams interface: calling getAll(USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "has" with the proper type (4) 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "has(USVString)" with the proper type 
 PASS URLSearchParams interface: calling has(USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "set" with the proper type (5) 
-PASS URLSearchParams interface: calling set(USVString,USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "sort" with the proper type (6) 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "entries" with the proper type (9) 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "keys" with the proper type (10) 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "values" with the proper type (11) 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "forEach" with the proper type (12) 
-PASS URLSearchParams interface: calling forEach(function,any) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "set(USVString, USVString)" with the proper type 
+PASS URLSearchParams interface: calling set(USVString, USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "sort()" with the proper type 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "entries()" with the proper type 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "keys()" with the proper type 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "values()" with the proper type 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "forEach(function, any)" with the proper type 
+PASS URLSearchParams interface: calling forEach(function, any) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/url/interfaces.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/url/interfaces.any.worker-expected.txt
index 4c167d6..979aeda 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/url/interfaces.any.worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/url/interfaces.any.worker-expected.txt
@@ -22,30 +22,30 @@
 FAIL URL interface: operation toJSON() assert_own_property: interface prototype object missing non-static operation expected property "toJSON" missing
 PASS URL must be primary interface of new URL("http://foo") 
 PASS Stringification of new URL("http://foo") 
-PASS URL interface: new URL("http://foo") must inherit property "href" with the proper type (0) 
-PASS URL interface: new URL("http://foo") must inherit property "origin" with the proper type (1) 
-PASS URL interface: new URL("http://foo") must inherit property "protocol" with the proper type (2) 
-PASS URL interface: new URL("http://foo") must inherit property "username" with the proper type (3) 
-PASS URL interface: new URL("http://foo") must inherit property "password" with the proper type (4) 
-PASS URL interface: new URL("http://foo") must inherit property "host" with the proper type (5) 
-PASS URL interface: new URL("http://foo") must inherit property "hostname" with the proper type (6) 
-PASS URL interface: new URL("http://foo") must inherit property "port" with the proper type (7) 
-PASS URL interface: new URL("http://foo") must inherit property "pathname" with the proper type (8) 
-PASS URL interface: new URL("http://foo") must inherit property "search" with the proper type (9) 
-PASS URL interface: new URL("http://foo") must inherit property "searchParams" with the proper type (10) 
-PASS URL interface: new URL("http://foo") must inherit property "hash" with the proper type (11) 
-FAIL URL interface: new URL("http://foo") must inherit property "toJSON" with the proper type (12) assert_inherits: property "toJSON" not found in prototype chain
+PASS URL interface: new URL("http://foo") must inherit property "href" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "origin" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "protocol" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "username" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "password" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "host" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "hostname" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "port" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "pathname" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "search" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "searchParams" with the proper type 
+PASS URL interface: new URL("http://foo") must inherit property "hash" with the proper type 
+FAIL URL interface: new URL("http://foo") must inherit property "toJSON()" with the proper type assert_inherits: property "toJSON" not found in prototype chain
 PASS URLSearchParams interface: existence and properties of interface object 
 PASS URLSearchParams interface object length 
 PASS URLSearchParams interface object name 
 PASS URLSearchParams interface: existence and properties of interface prototype object 
 PASS URLSearchParams interface: existence and properties of interface prototype object's "constructor" property 
-PASS URLSearchParams interface: operation append(USVString,USVString) 
+PASS URLSearchParams interface: operation append(USVString, USVString) 
 PASS URLSearchParams interface: operation delete(USVString) 
 PASS URLSearchParams interface: operation get(USVString) 
 PASS URLSearchParams interface: operation getAll(USVString) 
 PASS URLSearchParams interface: operation has(USVString) 
-PASS URLSearchParams interface: operation set(USVString,USVString) 
+PASS URLSearchParams interface: operation set(USVString, USVString) 
 PASS URLSearchParams interface: operation sort() 
 PASS Testing Symbol.iterator property of iterable interface URLSearchParams 
 PASS Testing pair iterable interface URLSearchParams 
@@ -53,26 +53,26 @@
 PASS URLSearchParams interface: operation entries() 
 PASS URLSearchParams interface: operation keys() 
 PASS URLSearchParams interface: operation values() 
-PASS URLSearchParams interface: operation forEach(function,any) 
+PASS URLSearchParams interface: operation forEach(function, any) 
 PASS URLSearchParams must be primary interface of new URLSearchParams("hi=there&thank=you") 
 PASS Stringification of new URLSearchParams("hi=there&thank=you") 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "append" with the proper type (0) 
-PASS URLSearchParams interface: calling append(USVString,USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "delete" with the proper type (1) 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "append(USVString, USVString)" with the proper type 
+PASS URLSearchParams interface: calling append(USVString, USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "delete(USVString)" with the proper type 
 PASS URLSearchParams interface: calling delete(USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "get" with the proper type (2) 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "get(USVString)" with the proper type 
 PASS URLSearchParams interface: calling get(USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "getAll" with the proper type (3) 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "getAll(USVString)" with the proper type 
 PASS URLSearchParams interface: calling getAll(USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "has" with the proper type (4) 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "has(USVString)" with the proper type 
 PASS URLSearchParams interface: calling has(USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "set" with the proper type (5) 
-PASS URLSearchParams interface: calling set(USVString,USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "sort" with the proper type (6) 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "entries" with the proper type (9) 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "keys" with the proper type (10) 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "values" with the proper type (11) 
-PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "forEach" with the proper type (12) 
-PASS URLSearchParams interface: calling forEach(function,any) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "set(USVString, USVString)" with the proper type 
+PASS URLSearchParams interface: calling set(USVString, USVString) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "sort()" with the proper type 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "entries()" with the proper type 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "keys()" with the proper type 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "values()" with the proper type 
+PASS URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "forEach(function, any)" with the proper type 
+PASS URLSearchParams interface: calling forEach(function, any) on new URLSearchParams("hi=there&thank=you") with too few arguments must throw TypeError 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animation/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animation/idlharness-expected.txt
index bf19b27..6406a33 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animation/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animation/idlharness-expected.txt
@@ -23,21 +23,21 @@
 PASS Animation interface: operation reverse() 
 PASS Animation must be primary interface of new Animation() 
 PASS Stringification of new Animation() 
-PASS Animation interface: new Animation() must inherit property "id" with the proper type (0) 
-PASS Animation interface: new Animation() must inherit property "effect" with the proper type (1) 
-PASS Animation interface: new Animation() must inherit property "timeline" with the proper type (2) 
-PASS Animation interface: new Animation() must inherit property "startTime" with the proper type (3) 
-PASS Animation interface: new Animation() must inherit property "currentTime" with the proper type (4) 
-PASS Animation interface: new Animation() must inherit property "playbackRate" with the proper type (5) 
-PASS Animation interface: new Animation() must inherit property "playState" with the proper type (6) 
-PASS Animation interface: new Animation() must inherit property "ready" with the proper type (7) 
-PASS Animation interface: new Animation() must inherit property "finished" with the proper type (8) 
-PASS Animation interface: new Animation() must inherit property "onfinish" with the proper type (9) 
-PASS Animation interface: new Animation() must inherit property "oncancel" with the proper type (10) 
-PASS Animation interface: new Animation() must inherit property "cancel" with the proper type (11) 
-PASS Animation interface: new Animation() must inherit property "finish" with the proper type (12) 
-PASS Animation interface: new Animation() must inherit property "play" with the proper type (13) 
-PASS Animation interface: new Animation() must inherit property "pause" with the proper type (14) 
-PASS Animation interface: new Animation() must inherit property "reverse" with the proper type (15) 
+PASS Animation interface: new Animation() must inherit property "id" with the proper type 
+PASS Animation interface: new Animation() must inherit property "effect" with the proper type 
+PASS Animation interface: new Animation() must inherit property "timeline" with the proper type 
+PASS Animation interface: new Animation() must inherit property "startTime" with the proper type 
+PASS Animation interface: new Animation() must inherit property "currentTime" with the proper type 
+PASS Animation interface: new Animation() must inherit property "playbackRate" with the proper type 
+PASS Animation interface: new Animation() must inherit property "playState" with the proper type 
+PASS Animation interface: new Animation() must inherit property "ready" with the proper type 
+PASS Animation interface: new Animation() must inherit property "finished" with the proper type 
+PASS Animation interface: new Animation() must inherit property "onfinish" with the proper type 
+PASS Animation interface: new Animation() must inherit property "oncancel" with the proper type 
+PASS Animation interface: new Animation() must inherit property "cancel()" with the proper type 
+PASS Animation interface: new Animation() must inherit property "finish()" with the proper type 
+PASS Animation interface: new Animation() must inherit property "play()" with the proper type 
+PASS Animation interface: new Animation() must inherit property "pause()" with the proper type 
+PASS Animation interface: new Animation() must inherit property "reverse()" with the proper type 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-idl-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-idl-expected.txt
index 9627ae4..fdf8b29 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-idl-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-idl-expected.txt
@@ -33,106 +33,106 @@
 PASS RTCPeerConnection interface: attribute onsignalingstatechange 
 PASS RTCPeerConnection interface: attribute oniceconnectionstatechange 
 PASS RTCPeerConnection interface: attribute onicegatheringstatechange 
-FAIL RTCPeerConnection interface: operation createOffer(RTCSessionDescriptionCallback,RTCPeerConnectionErrorCallback,RTCOfferOptions) assert_throws: calling operation with this = null didn't throw TypeError function "function () {
+FAIL RTCPeerConnection interface: operation createOffer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback, RTCOfferOptions) assert_throws: calling operation with this = null didn't throw TypeError function "function () {
             fn.apply(obj, args);
         }" did not throw
-FAIL RTCPeerConnection interface: operation setLocalDescription(RTCSessionDescription,VoidFunction,RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () {
+FAIL RTCPeerConnection interface: operation setLocalDescription(RTCSessionDescription, VoidFunction, RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () {
             fn.apply(obj, args);
         }" did not throw
-FAIL RTCPeerConnection interface: operation createAnswer(RTCSessionDescriptionCallback,RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () {
+FAIL RTCPeerConnection interface: operation createAnswer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () {
             fn.apply(obj, args);
         }" did not throw
-FAIL RTCPeerConnection interface: operation setRemoteDescription(RTCSessionDescription,VoidFunction,RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () {
+FAIL RTCPeerConnection interface: operation setRemoteDescription(RTCSessionDescription, VoidFunction, RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () {
             fn.apply(obj, args);
         }" did not throw
-FAIL RTCPeerConnection interface: operation addIceCandidate(RTCIceCandidate,VoidFunction,RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () {
+FAIL RTCPeerConnection interface: operation addIceCandidate(RTCIceCandidate, VoidFunction, RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () {
             fn.apply(obj, args);
         }" did not throw
-FAIL RTCPeerConnection interface: operation getStats(MediaStreamTrack,RTCStatsCallback,RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () {
+FAIL RTCPeerConnection interface: operation getStats(MediaStreamTrack, RTCStatsCallback, RTCPeerConnectionErrorCallback) assert_throws: calling operation with this = null didn't throw TypeError function "function () {
             fn.apply(obj, args);
         }" did not throw
 PASS RTCPeerConnection interface: operation generateCertificate(AlgorithmIdentifier) 
 PASS RTCPeerConnection interface: operation getSenders() 
 PASS RTCPeerConnection interface: operation getReceivers() 
-PASS RTCPeerConnection interface: operation addTrack(MediaStreamTrack,MediaStream) 
+PASS RTCPeerConnection interface: operation addTrack(MediaStreamTrack, MediaStream) 
 PASS RTCPeerConnection interface: operation removeTrack(RTCRtpSender) 
 FAIL RTCPeerConnection interface: attribute ontrack assert_true: The prototype object must have a property "ontrack" expected true got false
-PASS RTCPeerConnection interface: operation createDataChannel(DOMString,RTCDataChannelInit) 
+PASS RTCPeerConnection interface: operation createDataChannel(DOMString, RTCDataChannelInit) 
 PASS RTCPeerConnection interface: attribute ondatachannel 
 FAIL RTCPeerConnection interface: attribute dtmf assert_true: The prototype object must have a property "dtmf" expected true got false
 PASS RTCPeerConnection interface: operation getStats(MediaStreamTrack) 
-FAIL RTCPeerConnection interface: operation setIdentityProvider(DOMString,DOMString,DOMString) assert_own_property: interface prototype object missing non-static operation expected property "setIdentityProvider" missing
+FAIL RTCPeerConnection interface: operation setIdentityProvider(DOMString, DOMString, DOMString) assert_own_property: interface prototype object missing non-static operation expected property "setIdentityProvider" missing
 FAIL RTCPeerConnection interface: operation getIdentityAssertion() assert_own_property: interface prototype object missing non-static operation expected property "getIdentityAssertion" missing
 FAIL RTCPeerConnection interface: attribute peerIdentity assert_true: The prototype object must have a property "peerIdentity" expected true got false
 FAIL RTCPeerConnection interface: attribute idpLoginUrl assert_true: The prototype object must have a property "idpLoginUrl" expected true got false
 PASS RTCPeerConnection must be primary interface of pc 
 PASS Stringification of pc 
-PASS RTCPeerConnection interface: pc must inherit property "createOffer" with the proper type (0) 
+PASS RTCPeerConnection interface: pc must inherit property "createOffer(RTCOfferOptions)" with the proper type 
 PASS RTCPeerConnection interface: calling createOffer(RTCOfferOptions) on pc with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: pc must inherit property "createAnswer" with the proper type (1) 
+PASS RTCPeerConnection interface: pc must inherit property "createAnswer(RTCAnswerOptions)" with the proper type 
 PASS RTCPeerConnection interface: calling createAnswer(RTCAnswerOptions) on pc with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: pc must inherit property "setLocalDescription" with the proper type (2) 
+PASS RTCPeerConnection interface: pc must inherit property "setLocalDescription(RTCSessionDescription)" with the proper type 
 PASS RTCPeerConnection interface: calling setLocalDescription(RTCSessionDescription) on pc with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: pc must inherit property "localDescription" with the proper type (3) 
-FAIL RTCPeerConnection interface: pc must inherit property "currentLocalDescription" with the proper type (4) assert_inherits: property "currentLocalDescription" not found in prototype chain
-FAIL RTCPeerConnection interface: pc must inherit property "pendingLocalDescription" with the proper type (5) assert_inherits: property "pendingLocalDescription" not found in prototype chain
-PASS RTCPeerConnection interface: pc must inherit property "setRemoteDescription" with the proper type (6) 
+PASS RTCPeerConnection interface: pc must inherit property "localDescription" with the proper type 
+FAIL RTCPeerConnection interface: pc must inherit property "currentLocalDescription" with the proper type assert_inherits: property "currentLocalDescription" not found in prototype chain
+FAIL RTCPeerConnection interface: pc must inherit property "pendingLocalDescription" with the proper type assert_inherits: property "pendingLocalDescription" not found in prototype chain
+PASS RTCPeerConnection interface: pc must inherit property "setRemoteDescription(RTCSessionDescription)" with the proper type 
 PASS RTCPeerConnection interface: calling setRemoteDescription(RTCSessionDescription) on pc with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: pc must inherit property "remoteDescription" with the proper type (7) 
-FAIL RTCPeerConnection interface: pc must inherit property "currentRemoteDescription" with the proper type (8) assert_inherits: property "currentRemoteDescription" not found in prototype chain
-FAIL RTCPeerConnection interface: pc must inherit property "pendingRemoteDescription" with the proper type (9) assert_inherits: property "pendingRemoteDescription" not found in prototype chain
-PASS RTCPeerConnection interface: pc must inherit property "addIceCandidate" with the proper type (10) 
+PASS RTCPeerConnection interface: pc must inherit property "remoteDescription" with the proper type 
+FAIL RTCPeerConnection interface: pc must inherit property "currentRemoteDescription" with the proper type assert_inherits: property "currentRemoteDescription" not found in prototype chain
+FAIL RTCPeerConnection interface: pc must inherit property "pendingRemoteDescription" with the proper type assert_inherits: property "pendingRemoteDescription" not found in prototype chain
+PASS RTCPeerConnection interface: pc must inherit property "addIceCandidate(RTCIceCandidate)" with the proper type 
 PASS RTCPeerConnection interface: calling addIceCandidate(RTCIceCandidate) on pc with too few arguments must throw TypeError 
-FAIL RTCPeerConnection interface: pc must inherit property "signalingState" with the proper type (11) Unrecognized type RTCSignalingState
-FAIL RTCPeerConnection interface: pc must inherit property "iceGatheringState" with the proper type (12) Unrecognized type RTCIceGatheringState
-FAIL RTCPeerConnection interface: pc must inherit property "iceConnectionState" with the proper type (13) Unrecognized type RTCIceConnectionState
-FAIL RTCPeerConnection interface: pc must inherit property "canTrickleIceCandidates" with the proper type (14) assert_inherits: property "canTrickleIceCandidates" not found in prototype chain
-FAIL RTCPeerConnection interface: pc must inherit property "getConfiguration" with the proper type (15) assert_inherits: property "getConfiguration" not found in prototype chain
-PASS RTCPeerConnection interface: pc must inherit property "setConfiguration" with the proper type (16) 
+FAIL RTCPeerConnection interface: pc must inherit property "signalingState" with the proper type Unrecognized type RTCSignalingState
+FAIL RTCPeerConnection interface: pc must inherit property "iceGatheringState" with the proper type Unrecognized type RTCIceGatheringState
+FAIL RTCPeerConnection interface: pc must inherit property "iceConnectionState" with the proper type Unrecognized type RTCIceConnectionState
+FAIL RTCPeerConnection interface: pc must inherit property "canTrickleIceCandidates" with the proper type assert_inherits: property "canTrickleIceCandidates" not found in prototype chain
+FAIL RTCPeerConnection interface: pc must inherit property "getConfiguration()" with the proper type assert_inherits: property "getConfiguration" not found in prototype chain
+PASS RTCPeerConnection interface: pc must inherit property "setConfiguration(RTCConfiguration)" with the proper type 
 PASS RTCPeerConnection interface: calling setConfiguration(RTCConfiguration) on pc with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: pc must inherit property "close" with the proper type (17) 
-FAIL RTCPeerConnection interface: pc must inherit property "onnegotiationneeded" with the proper type (18) Unrecognized type EventHandler
-FAIL RTCPeerConnection interface: pc must inherit property "onicecandidate" with the proper type (19) Unrecognized type EventHandler
-FAIL RTCPeerConnection interface: pc must inherit property "onsignalingstatechange" with the proper type (20) Unrecognized type EventHandler
-FAIL RTCPeerConnection interface: pc must inherit property "oniceconnectionstatechange" with the proper type (21) Unrecognized type EventHandler
-FAIL RTCPeerConnection interface: pc must inherit property "onicegatheringstatechange" with the proper type (22) Unrecognized type EventHandler
-PASS RTCPeerConnection interface: pc must inherit property "createOffer" with the proper type (23) 
-PASS RTCPeerConnection interface: calling createOffer(RTCSessionDescriptionCallback,RTCPeerConnectionErrorCallback,RTCOfferOptions) on pc with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: pc must inherit property "setLocalDescription" with the proper type (24) 
-FAIL RTCPeerConnection interface: calling setLocalDescription(RTCSessionDescription,VoidFunction,RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () {
+PASS RTCPeerConnection interface: pc must inherit property "close()" with the proper type 
+FAIL RTCPeerConnection interface: pc must inherit property "onnegotiationneeded" with the proper type Unrecognized type EventHandler
+FAIL RTCPeerConnection interface: pc must inherit property "onicecandidate" with the proper type Unrecognized type EventHandler
+FAIL RTCPeerConnection interface: pc must inherit property "onsignalingstatechange" with the proper type Unrecognized type EventHandler
+FAIL RTCPeerConnection interface: pc must inherit property "oniceconnectionstatechange" with the proper type Unrecognized type EventHandler
+FAIL RTCPeerConnection interface: pc must inherit property "onicegatheringstatechange" with the proper type Unrecognized type EventHandler
+PASS RTCPeerConnection interface: pc must inherit property "createOffer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback, RTCOfferOptions)" with the proper type 
+PASS RTCPeerConnection interface: calling createOffer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback, RTCOfferOptions) on pc with too few arguments must throw TypeError 
+PASS RTCPeerConnection interface: pc must inherit property "setLocalDescription(RTCSessionDescription, VoidFunction, RTCPeerConnectionErrorCallback)" with the proper type 
+FAIL RTCPeerConnection interface: calling setLocalDescription(RTCSessionDescription, VoidFunction, RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () {
             fn.apply(obj, args);
         }" did not throw
-PASS RTCPeerConnection interface: pc must inherit property "createAnswer" with the proper type (25) 
-PASS RTCPeerConnection interface: calling createAnswer(RTCSessionDescriptionCallback,RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: pc must inherit property "setRemoteDescription" with the proper type (26) 
-FAIL RTCPeerConnection interface: calling setRemoteDescription(RTCSessionDescription,VoidFunction,RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () {
+PASS RTCPeerConnection interface: pc must inherit property "createAnswer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback)" with the proper type 
+PASS RTCPeerConnection interface: calling createAnswer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError 
+PASS RTCPeerConnection interface: pc must inherit property "setRemoteDescription(RTCSessionDescription, VoidFunction, RTCPeerConnectionErrorCallback)" with the proper type 
+FAIL RTCPeerConnection interface: calling setRemoteDescription(RTCSessionDescription, VoidFunction, RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () {
             fn.apply(obj, args);
         }" did not throw
-PASS RTCPeerConnection interface: pc must inherit property "addIceCandidate" with the proper type (27) 
-FAIL RTCPeerConnection interface: calling addIceCandidate(RTCIceCandidate,VoidFunction,RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () {
+PASS RTCPeerConnection interface: pc must inherit property "addIceCandidate(RTCIceCandidate, VoidFunction, RTCPeerConnectionErrorCallback)" with the proper type 
+FAIL RTCPeerConnection interface: calling addIceCandidate(RTCIceCandidate, VoidFunction, RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () {
             fn.apply(obj, args);
         }" did not throw
-PASS RTCPeerConnection interface: pc must inherit property "getStats" with the proper type (28) 
-PASS RTCPeerConnection interface: calling getStats(MediaStreamTrack,RTCStatsCallback,RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: pc must inherit property "generateCertificate" with the proper type (29) 
+PASS RTCPeerConnection interface: pc must inherit property "getStats(MediaStreamTrack, RTCStatsCallback, RTCPeerConnectionErrorCallback)" with the proper type 
+PASS RTCPeerConnection interface: calling getStats(MediaStreamTrack, RTCStatsCallback, RTCPeerConnectionErrorCallback) on pc with too few arguments must throw TypeError 
+PASS RTCPeerConnection interface: pc must inherit property "generateCertificate(AlgorithmIdentifier)" with the proper type 
 FAIL RTCPeerConnection interface: calling generateCertificate(AlgorithmIdentifier) on pc with too few arguments must throw TypeError assert_unreached: Throws "TypeError: Cannot read property 'apply' of undefined" instead of rejecting promise Reached unreachable code
-PASS RTCPeerConnection interface: pc must inherit property "getSenders" with the proper type (30) 
-PASS RTCPeerConnection interface: pc must inherit property "getReceivers" with the proper type (31) 
-PASS RTCPeerConnection interface: pc must inherit property "addTrack" with the proper type (32) 
-PASS RTCPeerConnection interface: calling addTrack(MediaStreamTrack,MediaStream) on pc with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: pc must inherit property "removeTrack" with the proper type (33) 
+PASS RTCPeerConnection interface: pc must inherit property "getSenders()" with the proper type 
+PASS RTCPeerConnection interface: pc must inherit property "getReceivers()" with the proper type 
+PASS RTCPeerConnection interface: pc must inherit property "addTrack(MediaStreamTrack, MediaStream)" with the proper type 
+PASS RTCPeerConnection interface: calling addTrack(MediaStreamTrack, MediaStream) on pc with too few arguments must throw TypeError 
+PASS RTCPeerConnection interface: pc must inherit property "removeTrack(RTCRtpSender)" with the proper type 
 PASS RTCPeerConnection interface: calling removeTrack(RTCRtpSender) on pc with too few arguments must throw TypeError 
-FAIL RTCPeerConnection interface: pc must inherit property "ontrack" with the proper type (34) assert_inherits: property "ontrack" not found in prototype chain
-PASS RTCPeerConnection interface: pc must inherit property "createDataChannel" with the proper type (35) 
-PASS RTCPeerConnection interface: calling createDataChannel(DOMString,RTCDataChannelInit) on pc with too few arguments must throw TypeError 
-FAIL RTCPeerConnection interface: pc must inherit property "ondatachannel" with the proper type (36) Unrecognized type EventHandler
-FAIL RTCPeerConnection interface: pc must inherit property "dtmf" with the proper type (37) assert_inherits: property "dtmf" not found in prototype chain
-PASS RTCPeerConnection interface: pc must inherit property "getStats" with the proper type (38) 
+FAIL RTCPeerConnection interface: pc must inherit property "ontrack" with the proper type assert_inherits: property "ontrack" not found in prototype chain
+PASS RTCPeerConnection interface: pc must inherit property "createDataChannel(DOMString, RTCDataChannelInit)" with the proper type 
+PASS RTCPeerConnection interface: calling createDataChannel(DOMString, RTCDataChannelInit) on pc with too few arguments must throw TypeError 
+FAIL RTCPeerConnection interface: pc must inherit property "ondatachannel" with the proper type Unrecognized type EventHandler
+FAIL RTCPeerConnection interface: pc must inherit property "dtmf" with the proper type assert_inherits: property "dtmf" not found in prototype chain
+PASS RTCPeerConnection interface: pc must inherit property "getStats(MediaStreamTrack)" with the proper type 
 PASS RTCPeerConnection interface: calling getStats(MediaStreamTrack) on pc with too few arguments must throw TypeError 
-FAIL RTCPeerConnection interface: pc must inherit property "setIdentityProvider" with the proper type (39) assert_inherits: property "setIdentityProvider" not found in prototype chain
-FAIL RTCPeerConnection interface: calling setIdentityProvider(DOMString,DOMString,DOMString) on pc with too few arguments must throw TypeError assert_inherits: property "setIdentityProvider" not found in prototype chain
-FAIL RTCPeerConnection interface: pc must inherit property "getIdentityAssertion" with the proper type (40) assert_inherits: property "getIdentityAssertion" not found in prototype chain
-FAIL RTCPeerConnection interface: pc must inherit property "peerIdentity" with the proper type (41) assert_inherits: property "peerIdentity" not found in prototype chain
-FAIL RTCPeerConnection interface: pc must inherit property "idpLoginUrl" with the proper type (42) assert_inherits: property "idpLoginUrl" not found in prototype chain
+FAIL RTCPeerConnection interface: pc must inherit property "setIdentityProvider(DOMString, DOMString, DOMString)" with the proper type assert_inherits: property "setIdentityProvider" not found in prototype chain
+FAIL RTCPeerConnection interface: calling setIdentityProvider(DOMString, DOMString, DOMString) on pc with too few arguments must throw TypeError assert_inherits: property "setIdentityProvider" not found in prototype chain
+FAIL RTCPeerConnection interface: pc must inherit property "getIdentityAssertion()" with the proper type assert_inherits: property "getIdentityAssertion" not found in prototype chain
+FAIL RTCPeerConnection interface: pc must inherit property "peerIdentity" with the proper type assert_inherits: property "peerIdentity" not found in prototype chain
+FAIL RTCPeerConnection interface: pc must inherit property "idpLoginUrl" with the proper type assert_inherits: property "idpLoginUrl" not found in prototype chain
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/datachannel-idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webrtc/datachannel-idlharness-expected.txt
index 88311a83..dbfec9f 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/datachannel-idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/datachannel-idlharness-expected.txt
@@ -29,31 +29,31 @@
 PASS RTCDataChannel interface: operation send(ArrayBufferView) 
 PASS RTCDataChannel must be primary interface of channel 
 FAIL Stringification of channel Cannot read property 'has_stringifier' of undefined
-PASS RTCDataChannel interface: channel must inherit property "label" with the proper type (0) 
-PASS RTCDataChannel interface: channel must inherit property "ordered" with the proper type (1) 
-FAIL RTCDataChannel interface: channel must inherit property "maxPacketLifeTime" with the proper type (2) assert_inherits: property "maxPacketLifeTime" not found in prototype chain
-PASS RTCDataChannel interface: channel must inherit property "maxRetransmits" with the proper type (3) 
-PASS RTCDataChannel interface: channel must inherit property "protocol" with the proper type (4) 
-PASS RTCDataChannel interface: channel must inherit property "negotiated" with the proper type (5) 
-PASS RTCDataChannel interface: channel must inherit property "id" with the proper type (6) 
-FAIL RTCDataChannel interface: channel must inherit property "priority" with the proper type (7) assert_inherits: property "priority" not found in prototype chain
-PASS RTCDataChannel interface: channel must inherit property "readyState" with the proper type (8) 
-PASS RTCDataChannel interface: channel must inherit property "bufferedAmount" with the proper type (9) 
-PASS RTCDataChannel interface: channel must inherit property "bufferedAmountLowThreshold" with the proper type (10) 
-FAIL RTCDataChannel interface: channel must inherit property "onopen" with the proper type (11) Unrecognized type EventHandler
-FAIL RTCDataChannel interface: channel must inherit property "onbufferedamountlow" with the proper type (12) Unrecognized type EventHandler
-FAIL RTCDataChannel interface: channel must inherit property "onerror" with the proper type (13) Unrecognized type EventHandler
-FAIL RTCDataChannel interface: channel must inherit property "onclose" with the proper type (14) Unrecognized type EventHandler
-PASS RTCDataChannel interface: channel must inherit property "close" with the proper type (15) 
-FAIL RTCDataChannel interface: channel must inherit property "onmessage" with the proper type (16) Unrecognized type EventHandler
-PASS RTCDataChannel interface: channel must inherit property "binaryType" with the proper type (17) 
-PASS RTCDataChannel interface: channel must inherit property "send" with the proper type (18) 
+PASS RTCDataChannel interface: channel must inherit property "label" with the proper type 
+PASS RTCDataChannel interface: channel must inherit property "ordered" with the proper type 
+FAIL RTCDataChannel interface: channel must inherit property "maxPacketLifeTime" with the proper type assert_inherits: property "maxPacketLifeTime" not found in prototype chain
+PASS RTCDataChannel interface: channel must inherit property "maxRetransmits" with the proper type 
+PASS RTCDataChannel interface: channel must inherit property "protocol" with the proper type 
+PASS RTCDataChannel interface: channel must inherit property "negotiated" with the proper type 
+PASS RTCDataChannel interface: channel must inherit property "id" with the proper type 
+FAIL RTCDataChannel interface: channel must inherit property "priority" with the proper type assert_inherits: property "priority" not found in prototype chain
+PASS RTCDataChannel interface: channel must inherit property "readyState" with the proper type 
+PASS RTCDataChannel interface: channel must inherit property "bufferedAmount" with the proper type 
+PASS RTCDataChannel interface: channel must inherit property "bufferedAmountLowThreshold" with the proper type 
+FAIL RTCDataChannel interface: channel must inherit property "onopen" with the proper type Unrecognized type EventHandler
+FAIL RTCDataChannel interface: channel must inherit property "onbufferedamountlow" with the proper type Unrecognized type EventHandler
+FAIL RTCDataChannel interface: channel must inherit property "onerror" with the proper type Unrecognized type EventHandler
+FAIL RTCDataChannel interface: channel must inherit property "onclose" with the proper type Unrecognized type EventHandler
+PASS RTCDataChannel interface: channel must inherit property "close()" with the proper type 
+FAIL RTCDataChannel interface: channel must inherit property "onmessage" with the proper type Unrecognized type EventHandler
+PASS RTCDataChannel interface: channel must inherit property "binaryType" with the proper type 
+PASS RTCDataChannel interface: channel must inherit property "send(USVString)" with the proper type 
 PASS RTCDataChannel interface: calling send(USVString) on channel with too few arguments must throw TypeError 
-PASS RTCDataChannel interface: channel must inherit property "send" with the proper type (19) 
+PASS RTCDataChannel interface: channel must inherit property "send(Blob)" with the proper type 
 PASS RTCDataChannel interface: calling send(Blob) on channel with too few arguments must throw TypeError 
-PASS RTCDataChannel interface: channel must inherit property "send" with the proper type (20) 
+PASS RTCDataChannel interface: channel must inherit property "send(ArrayBuffer)" with the proper type 
 PASS RTCDataChannel interface: calling send(ArrayBuffer) on channel with too few arguments must throw TypeError 
-PASS RTCDataChannel interface: channel must inherit property "send" with the proper type (21) 
+PASS RTCDataChannel interface: channel must inherit property "send(ArrayBufferView)" with the proper type 
 PASS RTCDataChannel interface: calling send(ArrayBufferView) on channel with too few arguments must throw TypeError 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces-expected.txt
index 4d429cd7..d4eeb2fa 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces-expected.txt
@@ -13,12 +13,12 @@
 FAIL MediaStreamTrack interface: attribute onisolationchange assert_true: The prototype object must have a property "onisolationchange" expected true got false
 FAIL MediaStreamTrack must be primary interface of idlTestObjects.mediaStreamTrack assert_equals: wrong typeof object expected "object" but got "undefined"
 FAIL Stringification of idlTestObjects.mediaStreamTrack assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL MediaStreamTrack interface: idlTestObjects.mediaStreamTrack must inherit property "isolated" with the proper type (0) assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL MediaStreamTrack interface: idlTestObjects.mediaStreamTrack must inherit property "onisolationchange" with the proper type (1) assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL MediaStreamTrack interface: idlTestObjects.mediaStreamTrack must inherit property "isolated" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL MediaStreamTrack interface: idlTestObjects.mediaStreamTrack must inherit property "onisolationchange" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
 FAIL MediaStreamTrack must be primary interface of generateMediaStreamTrack('audio') assert_equals: Unexpected exception when evaluating object expected null but got object "Error: assert_own_property: Expect pc to have addTransceiver() method expected property "addTransceiver" missing"
 FAIL Stringification of generateMediaStreamTrack('audio') assert_equals: Unexpected exception when evaluating object expected null but got object "Error: assert_own_property: Expect pc to have addTransceiver() method expected property "addTransceiver" missing"
-FAIL MediaStreamTrack interface: generateMediaStreamTrack('audio') must inherit property "isolated" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "Error: assert_own_property: Expect pc to have addTransceiver() method expected property "addTransceiver" missing"
-FAIL MediaStreamTrack interface: generateMediaStreamTrack('audio') must inherit property "onisolationchange" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "Error: assert_own_property: Expect pc to have addTransceiver() method expected property "addTransceiver" missing"
+FAIL MediaStreamTrack interface: generateMediaStreamTrack('audio') must inherit property "isolated" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "Error: assert_own_property: Expect pc to have addTransceiver() method expected property "addTransceiver" missing"
+FAIL MediaStreamTrack interface: generateMediaStreamTrack('audio') must inherit property "onisolationchange" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "Error: assert_own_property: Expect pc to have addTransceiver() method expected property "addTransceiver" missing"
 FAIL RTCPeerConnection interface: existence and properties of interface object Cannot read property 'has_extended_attribute' of undefined
 PASS RTCPeerConnection interface object length 
 PASS RTCPeerConnection interface object name 
@@ -52,98 +52,98 @@
 PASS RTCPeerConnection interface: attribute onicegatheringstatechange 
 FAIL RTCPeerConnection interface: attribute onconnectionstatechange assert_true: The prototype object must have a property "onconnectionstatechange" expected true got false
 FAIL RTCPeerConnection interface: attribute onfingerprintfailure assert_true: The prototype object must have a property "onfingerprintfailure" expected true got false
-PASS RTCPeerConnection interface: operation createOffer(RTCSessionDescriptionCallback,RTCPeerConnectionErrorCallback,RTCOfferOptions) 
-PASS RTCPeerConnection interface: operation setLocalDescription(RTCSessionDescriptionInit,VoidFunction,RTCPeerConnectionErrorCallback) 
-PASS RTCPeerConnection interface: operation createAnswer(RTCSessionDescriptionCallback,RTCPeerConnectionErrorCallback) 
-PASS RTCPeerConnection interface: operation setRemoteDescription(RTCSessionDescriptionInit,VoidFunction,RTCPeerConnectionErrorCallback) 
-PASS RTCPeerConnection interface: operation addIceCandidate([object Object],[object Object],VoidFunction,RTCPeerConnectionErrorCallback) 
+PASS RTCPeerConnection interface: operation createOffer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback, RTCOfferOptions) 
+PASS RTCPeerConnection interface: operation setLocalDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback) 
+PASS RTCPeerConnection interface: operation createAnswer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback) 
+PASS RTCPeerConnection interface: operation setRemoteDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback) 
+PASS RTCPeerConnection interface: operation addIceCandidate([object Object],[object Object], VoidFunction, RTCPeerConnectionErrorCallback) 
 PASS RTCPeerConnection interface: operation generateCertificate(AlgorithmIdentifier) 
 PASS RTCPeerConnection interface: operation getSenders() 
 PASS RTCPeerConnection interface: operation getReceivers() 
 FAIL RTCPeerConnection interface: operation getTransceivers() assert_own_property: interface prototype object missing non-static operation expected property "getTransceivers" missing
-PASS RTCPeerConnection interface: operation addTrack(MediaStreamTrack,MediaStream) 
+PASS RTCPeerConnection interface: operation addTrack(MediaStreamTrack, MediaStream) 
 PASS RTCPeerConnection interface: operation removeTrack(RTCRtpSender) 
-FAIL RTCPeerConnection interface: operation addTransceiver([object Object],[object Object],RTCRtpTransceiverInit) assert_own_property: interface prototype object missing non-static operation expected property "addTransceiver" missing
+FAIL RTCPeerConnection interface: operation addTransceiver([object Object],[object Object], RTCRtpTransceiverInit) assert_own_property: interface prototype object missing non-static operation expected property "addTransceiver" missing
 FAIL RTCPeerConnection interface: attribute ontrack assert_true: The prototype object must have a property "ontrack" expected true got false
 FAIL RTCPeerConnection interface: attribute sctp assert_true: The prototype object must have a property "sctp" expected true got false
-PASS RTCPeerConnection interface: operation createDataChannel(USVString,RTCDataChannelInit) 
+PASS RTCPeerConnection interface: operation createDataChannel(USVString, RTCDataChannelInit) 
 PASS RTCPeerConnection interface: attribute ondatachannel 
 PASS RTCPeerConnection interface: operation getStats(MediaStreamTrack) 
-FAIL RTCPeerConnection interface: operation setIdentityProvider(DOMString,RTCIdentityProviderOptions) assert_own_property: interface prototype object missing non-static operation expected property "setIdentityProvider" missing
+FAIL RTCPeerConnection interface: operation setIdentityProvider(DOMString, RTCIdentityProviderOptions) assert_own_property: interface prototype object missing non-static operation expected property "setIdentityProvider" missing
 FAIL RTCPeerConnection interface: operation getIdentityAssertion() assert_own_property: interface prototype object missing non-static operation expected property "getIdentityAssertion" missing
 FAIL RTCPeerConnection interface: attribute peerIdentity assert_true: The prototype object must have a property "peerIdentity" expected true got false
 FAIL RTCPeerConnection interface: attribute idpLoginUrl assert_true: The prototype object must have a property "idpLoginUrl" expected true got false
 FAIL RTCPeerConnection interface: attribute idpErrorInfo assert_true: The prototype object must have a property "idpErrorInfo" expected true got false
 PASS RTCPeerConnection must be primary interface of new RTCPeerConnection() 
 FAIL Stringification of new RTCPeerConnection() Cannot read property 'has_stringifier' of undefined
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createOffer" with the proper type (0) 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createOffer(RTCOfferOptions)" with the proper type 
 PASS RTCPeerConnection interface: calling createOffer(RTCOfferOptions) on new RTCPeerConnection() with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createAnswer" with the proper type (1) 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createAnswer(RTCAnswerOptions)" with the proper type 
 PASS RTCPeerConnection interface: calling createAnswer(RTCAnswerOptions) on new RTCPeerConnection() with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setLocalDescription" with the proper type (2) 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setLocalDescription(RTCSessionDescriptionInit)" with the proper type 
 PASS RTCPeerConnection interface: calling setLocalDescription(RTCSessionDescriptionInit) on new RTCPeerConnection() with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "localDescription" with the proper type (3) 
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "currentLocalDescription" with the proper type (4) assert_inherits: property "currentLocalDescription" not found in prototype chain
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "pendingLocalDescription" with the proper type (5) assert_inherits: property "pendingLocalDescription" not found in prototype chain
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setRemoteDescription" with the proper type (6) 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "localDescription" with the proper type 
+FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "currentLocalDescription" with the proper type assert_inherits: property "currentLocalDescription" not found in prototype chain
+FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "pendingLocalDescription" with the proper type assert_inherits: property "pendingLocalDescription" not found in prototype chain
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setRemoteDescription(RTCSessionDescriptionInit)" with the proper type 
 PASS RTCPeerConnection interface: calling setRemoteDescription(RTCSessionDescriptionInit) on new RTCPeerConnection() with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "remoteDescription" with the proper type (7) 
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "currentRemoteDescription" with the proper type (8) assert_inherits: property "currentRemoteDescription" not found in prototype chain
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "pendingRemoteDescription" with the proper type (9) assert_inherits: property "pendingRemoteDescription" not found in prototype chain
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addIceCandidate" with the proper type (10) 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "remoteDescription" with the proper type 
+FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "currentRemoteDescription" with the proper type assert_inherits: property "currentRemoteDescription" not found in prototype chain
+FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "pendingRemoteDescription" with the proper type assert_inherits: property "pendingRemoteDescription" not found in prototype chain
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addIceCandidate([object Object],[object Object])" with the proper type 
 PASS RTCPeerConnection interface: calling addIceCandidate([object Object],[object Object]) on new RTCPeerConnection() with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "signalingState" with the proper type (11) 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "iceGatheringState" with the proper type (12) 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "iceConnectionState" with the proper type (13) 
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "connectionState" with the proper type (14) assert_inherits: property "connectionState" not found in prototype chain
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "canTrickleIceCandidates" with the proper type (15) assert_inherits: property "canTrickleIceCandidates" not found in prototype chain
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getDefaultIceServers" with the proper type (16) 
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getConfiguration" with the proper type (17) assert_inherits: property "getConfiguration" not found in prototype chain
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setConfiguration" with the proper type (18) 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "signalingState" with the proper type 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "iceGatheringState" with the proper type 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "iceConnectionState" with the proper type 
+FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "connectionState" with the proper type assert_inherits: property "connectionState" not found in prototype chain
+FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "canTrickleIceCandidates" with the proper type assert_inherits: property "canTrickleIceCandidates" not found in prototype chain
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getDefaultIceServers()" with the proper type 
+FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getConfiguration()" with the proper type assert_inherits: property "getConfiguration" not found in prototype chain
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setConfiguration(RTCConfiguration)" with the proper type 
 PASS RTCPeerConnection interface: calling setConfiguration(RTCConfiguration) on new RTCPeerConnection() with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "close" with the proper type (19) 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onnegotiationneeded" with the proper type (20) 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onicecandidate" with the proper type (21) 
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onicecandidateerror" with the proper type (22) assert_inherits: property "onicecandidateerror" not found in prototype chain
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onsignalingstatechange" with the proper type (23) 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "oniceconnectionstatechange" with the proper type (24) 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onicegatheringstatechange" with the proper type (25) 
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onconnectionstatechange" with the proper type (26) assert_inherits: property "onconnectionstatechange" not found in prototype chain
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onfingerprintfailure" with the proper type (27) assert_inherits: property "onfingerprintfailure" not found in prototype chain
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createOffer" with the proper type (28) 
-PASS RTCPeerConnection interface: calling createOffer(RTCSessionDescriptionCallback,RTCPeerConnectionErrorCallback,RTCOfferOptions) on new RTCPeerConnection() with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setLocalDescription" with the proper type (29) 
-PASS RTCPeerConnection interface: calling setLocalDescription(RTCSessionDescriptionInit,VoidFunction,RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createAnswer" with the proper type (30) 
-PASS RTCPeerConnection interface: calling createAnswer(RTCSessionDescriptionCallback,RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setRemoteDescription" with the proper type (31) 
-PASS RTCPeerConnection interface: calling setRemoteDescription(RTCSessionDescriptionInit,VoidFunction,RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addIceCandidate" with the proper type (32) 
-PASS RTCPeerConnection interface: calling addIceCandidate([object Object],[object Object],VoidFunction,RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "generateCertificate" with the proper type (33) 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "close()" with the proper type 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onnegotiationneeded" with the proper type 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onicecandidate" with the proper type 
+FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onicecandidateerror" with the proper type assert_inherits: property "onicecandidateerror" not found in prototype chain
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onsignalingstatechange" with the proper type 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "oniceconnectionstatechange" with the proper type 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onicegatheringstatechange" with the proper type 
+FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onconnectionstatechange" with the proper type assert_inherits: property "onconnectionstatechange" not found in prototype chain
+FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onfingerprintfailure" with the proper type assert_inherits: property "onfingerprintfailure" not found in prototype chain
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createOffer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback, RTCOfferOptions)" with the proper type 
+PASS RTCPeerConnection interface: calling createOffer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback, RTCOfferOptions) on new RTCPeerConnection() with too few arguments must throw TypeError 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setLocalDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback)" with the proper type 
+PASS RTCPeerConnection interface: calling setLocalDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createAnswer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback)" with the proper type 
+PASS RTCPeerConnection interface: calling createAnswer(RTCSessionDescriptionCallback, RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setRemoteDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback)" with the proper type 
+PASS RTCPeerConnection interface: calling setRemoteDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addIceCandidate([object Object],[object Object], VoidFunction, RTCPeerConnectionErrorCallback)" with the proper type 
+PASS RTCPeerConnection interface: calling addIceCandidate([object Object],[object Object], VoidFunction, RTCPeerConnectionErrorCallback) on new RTCPeerConnection() with too few arguments must throw TypeError 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "generateCertificate(AlgorithmIdentifier)" with the proper type 
 FAIL RTCPeerConnection interface: calling generateCertificate(AlgorithmIdentifier) on new RTCPeerConnection() with too few arguments must throw TypeError assert_unreached: Throws "TypeError: Cannot read property 'apply' of undefined" instead of rejecting promise Reached unreachable code
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getSenders" with the proper type (34) 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getReceivers" with the proper type (35) 
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getTransceivers" with the proper type (36) assert_inherits: property "getTransceivers" not found in prototype chain
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addTrack" with the proper type (37) 
-PASS RTCPeerConnection interface: calling addTrack(MediaStreamTrack,MediaStream) on new RTCPeerConnection() with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "removeTrack" with the proper type (38) 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getSenders()" with the proper type 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getReceivers()" with the proper type 
+FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getTransceivers()" with the proper type assert_inherits: property "getTransceivers" not found in prototype chain
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addTrack(MediaStreamTrack, MediaStream)" with the proper type 
+PASS RTCPeerConnection interface: calling addTrack(MediaStreamTrack, MediaStream) on new RTCPeerConnection() with too few arguments must throw TypeError 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "removeTrack(RTCRtpSender)" with the proper type 
 PASS RTCPeerConnection interface: calling removeTrack(RTCRtpSender) on new RTCPeerConnection() with too few arguments must throw TypeError 
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addTransceiver" with the proper type (39) assert_inherits: property "addTransceiver" not found in prototype chain
-FAIL RTCPeerConnection interface: calling addTransceiver([object Object],[object Object],RTCRtpTransceiverInit) on new RTCPeerConnection() with too few arguments must throw TypeError assert_inherits: property "addTransceiver" not found in prototype chain
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "ontrack" with the proper type (40) assert_inherits: property "ontrack" not found in prototype chain
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "sctp" with the proper type (41) assert_inherits: property "sctp" not found in prototype chain
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createDataChannel" with the proper type (42) 
-PASS RTCPeerConnection interface: calling createDataChannel(USVString,RTCDataChannelInit) on new RTCPeerConnection() with too few arguments must throw TypeError 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "ondatachannel" with the proper type (43) 
-PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getStats" with the proper type (44) 
+FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "addTransceiver([object Object],[object Object], RTCRtpTransceiverInit)" with the proper type assert_inherits: property "addTransceiver" not found in prototype chain
+FAIL RTCPeerConnection interface: calling addTransceiver([object Object],[object Object], RTCRtpTransceiverInit) on new RTCPeerConnection() with too few arguments must throw TypeError assert_inherits: property "addTransceiver" not found in prototype chain
+FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "ontrack" with the proper type assert_inherits: property "ontrack" not found in prototype chain
+FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "sctp" with the proper type assert_inherits: property "sctp" not found in prototype chain
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "createDataChannel(USVString, RTCDataChannelInit)" with the proper type 
+PASS RTCPeerConnection interface: calling createDataChannel(USVString, RTCDataChannelInit) on new RTCPeerConnection() with too few arguments must throw TypeError 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "ondatachannel" with the proper type 
+PASS RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getStats(MediaStreamTrack)" with the proper type 
 PASS RTCPeerConnection interface: calling getStats(MediaStreamTrack) on new RTCPeerConnection() with too few arguments must throw TypeError 
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setIdentityProvider" with the proper type (45) assert_inherits: property "setIdentityProvider" not found in prototype chain
-FAIL RTCPeerConnection interface: calling setIdentityProvider(DOMString,RTCIdentityProviderOptions) on new RTCPeerConnection() with too few arguments must throw TypeError assert_inherits: property "setIdentityProvider" not found in prototype chain
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getIdentityAssertion" with the proper type (46) assert_inherits: property "getIdentityAssertion" not found in prototype chain
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "peerIdentity" with the proper type (47) assert_inherits: property "peerIdentity" not found in prototype chain
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "idpLoginUrl" with the proper type (48) assert_inherits: property "idpLoginUrl" not found in prototype chain
-FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "idpErrorInfo" with the proper type (49) assert_inherits: property "idpErrorInfo" not found in prototype chain
+FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "setIdentityProvider(DOMString, RTCIdentityProviderOptions)" with the proper type assert_inherits: property "setIdentityProvider" not found in prototype chain
+FAIL RTCPeerConnection interface: calling setIdentityProvider(DOMString, RTCIdentityProviderOptions) on new RTCPeerConnection() with too few arguments must throw TypeError assert_inherits: property "setIdentityProvider" not found in prototype chain
+FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "getIdentityAssertion()" with the proper type assert_inherits: property "getIdentityAssertion" not found in prototype chain
+FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "peerIdentity" with the proper type assert_inherits: property "peerIdentity" not found in prototype chain
+FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "idpLoginUrl" with the proper type assert_inherits: property "idpLoginUrl" not found in prototype chain
+FAIL RTCPeerConnection interface: new RTCPeerConnection() must inherit property "idpErrorInfo" with the proper type assert_inherits: property "idpErrorInfo" not found in prototype chain
 PASS RTCSessionDescription interface: existence and properties of interface object 
 FAIL RTCSessionDescription interface object length assert_equals: wrong value for RTCSessionDescription.length expected 1 but got 0
 PASS RTCSessionDescription interface object name 
@@ -153,8 +153,8 @@
 FAIL RTCSessionDescription interface: attribute sdp assert_equals: setter must be undefined for readonly attributes expected (undefined) undefined but got (function) function "function () { [native code] }"
 PASS RTCSessionDescription must be primary interface of new RTCSessionDescription({ type: 'offer' }) 
 PASS Stringification of new RTCSessionDescription({ type: 'offer' }) 
-PASS RTCSessionDescription interface: new RTCSessionDescription({ type: 'offer' }) must inherit property "type" with the proper type (0) 
-FAIL RTCSessionDescription interface: new RTCSessionDescription({ type: 'offer' }) must inherit property "sdp" with the proper type (1) assert_equals: expected "string" but got "object"
+PASS RTCSessionDescription interface: new RTCSessionDescription({ type: 'offer' }) must inherit property "type" with the proper type 
+FAIL RTCSessionDescription interface: new RTCSessionDescription({ type: 'offer' }) must inherit property "sdp" with the proper type assert_equals: expected "string" but got "object"
 PASS RTCIceCandidate interface: existence and properties of interface object 
 FAIL RTCIceCandidate interface object length assert_equals: wrong value for RTCIceCandidate.length expected 0 but got 1
 PASS RTCIceCandidate interface object name 
@@ -176,20 +176,20 @@
 FAIL RTCIceCandidate interface: attribute ufrag assert_true: The prototype object must have a property "ufrag" expected true got false
 FAIL RTCIceCandidate must be primary interface of new RTCIceCandidate({ sdpMid: 1 }) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
 FAIL Stringification of new RTCIceCandidate({ sdpMid: 1 }) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "candidate" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "sdpMid" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "sdpMLineIndex" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "foundation" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "component" with the proper type (4) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "priority" with the proper type (5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "ip" with the proper type (6) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "protocol" with the proper type (7) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "port" with the proper type (8) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "type" with the proper type (9) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "tcpType" with the proper type (10) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "relatedAddress" with the proper type (11) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "relatedPort" with the proper type (12) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
-FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "ufrag" with the proper type (13) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
+FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "candidate" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
+FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "sdpMid" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
+FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "sdpMLineIndex" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
+FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "foundation" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
+FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "component" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
+FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "priority" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
+FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "ip" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
+FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "protocol" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
+FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "port" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
+FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "type" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
+FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "tcpType" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
+FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "relatedAddress" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
+FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "relatedPort" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
+FAIL RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "ufrag" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeMismatchError: Failed to construct 'RTCIceCandidate': The 'candidate' property is not a string, or is empty."
 FAIL RTCPeerConnectionIceEvent interface: existence and properties of interface object Cannot read property 'has_extended_attribute' of undefined
 PASS RTCPeerConnectionIceEvent interface object length 
 PASS RTCPeerConnectionIceEvent interface object name 
@@ -199,8 +199,8 @@
 FAIL RTCPeerConnectionIceEvent interface: attribute url assert_true: The prototype object must have a property "url" expected true got false
 PASS RTCPeerConnectionIceEvent must be primary interface of new RTCPeerConnectionIceEvent('ice') 
 FAIL Stringification of new RTCPeerConnectionIceEvent('ice') Cannot read property 'has_stringifier' of undefined
-PASS RTCPeerConnectionIceEvent interface: new RTCPeerConnectionIceEvent('ice') must inherit property "candidate" with the proper type (0) 
-FAIL RTCPeerConnectionIceEvent interface: new RTCPeerConnectionIceEvent('ice') must inherit property "url" with the proper type (1) assert_inherits: property "url" not found in prototype chain
+PASS RTCPeerConnectionIceEvent interface: new RTCPeerConnectionIceEvent('ice') must inherit property "candidate" with the proper type 
+FAIL RTCPeerConnectionIceEvent interface: new RTCPeerConnectionIceEvent('ice') must inherit property "url" with the proper type assert_inherits: property "url" not found in prototype chain
 FAIL RTCPeerConnectionIceErrorEvent interface: existence and properties of interface object assert_own_property: self does not have own property "RTCPeerConnectionIceErrorEvent" expected property "RTCPeerConnectionIceErrorEvent" missing
 FAIL RTCPeerConnectionIceErrorEvent interface object length assert_own_property: self does not have own property "RTCPeerConnectionIceErrorEvent" expected property "RTCPeerConnectionIceErrorEvent" missing
 FAIL RTCPeerConnectionIceErrorEvent interface object name assert_own_property: self does not have own property "RTCPeerConnectionIceErrorEvent" expected property "RTCPeerConnectionIceErrorEvent" missing
@@ -212,10 +212,10 @@
 FAIL RTCPeerConnectionIceErrorEvent interface: attribute errorText assert_own_property: self does not have own property "RTCPeerConnectionIceErrorEvent" expected property "RTCPeerConnectionIceErrorEvent" missing
 FAIL RTCPeerConnectionIceErrorEvent must be primary interface of new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined"
 FAIL Stringification of new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined"
-FAIL RTCPeerConnectionIceErrorEvent interface: new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); must inherit property "hostCandidate" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined"
-FAIL RTCPeerConnectionIceErrorEvent interface: new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); must inherit property "url" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined"
-FAIL RTCPeerConnectionIceErrorEvent interface: new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); must inherit property "errorCode" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined"
-FAIL RTCPeerConnectionIceErrorEvent interface: new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); must inherit property "errorText" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined"
+FAIL RTCPeerConnectionIceErrorEvent interface: new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); must inherit property "hostCandidate" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined"
+FAIL RTCPeerConnectionIceErrorEvent interface: new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); must inherit property "url" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined"
+FAIL RTCPeerConnectionIceErrorEvent interface: new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); must inherit property "errorCode" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined"
+FAIL RTCPeerConnectionIceErrorEvent interface: new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 }); must inherit property "errorText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCPeerConnectionIceErrorEvent is not defined"
 PASS RTCCertificate interface: existence and properties of interface object 
 PASS RTCCertificate interface object length 
 PASS RTCCertificate interface object name 
@@ -226,9 +226,9 @@
 FAIL RTCCertificate interface: operation getAlgorithm() assert_own_property: interface prototype object missing non-static operation expected property "getAlgorithm" missing
 PASS RTCCertificate must be primary interface of idlTestObjects.certificate 
 PASS Stringification of idlTestObjects.certificate 
-PASS RTCCertificate interface: idlTestObjects.certificate must inherit property "expires" with the proper type (0) 
-PASS RTCCertificate interface: idlTestObjects.certificate must inherit property "getFingerprints" with the proper type (1) 
-FAIL RTCCertificate interface: idlTestObjects.certificate must inherit property "getAlgorithm" with the proper type (2) assert_inherits: property "getAlgorithm" not found in prototype chain
+PASS RTCCertificate interface: idlTestObjects.certificate must inherit property "expires" with the proper type 
+PASS RTCCertificate interface: idlTestObjects.certificate must inherit property "getFingerprints()" with the proper type 
+FAIL RTCCertificate interface: idlTestObjects.certificate must inherit property "getAlgorithm()" with the proper type assert_inherits: property "getAlgorithm" not found in prototype chain
 PASS RTCRtpSender interface: existence and properties of interface object 
 PASS RTCRtpSender interface object length 
 PASS RTCRtpSender interface object name 
@@ -245,18 +245,18 @@
 FAIL RTCRtpSender interface: attribute dtmf assert_true: The prototype object must have a property "dtmf" expected true got false
 FAIL RTCRtpSender must be primary interface of new RTCPeerConnection().addTransceiver('audio').sender assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
 FAIL Stringification of new RTCPeerConnection().addTransceiver('audio').sender assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "track" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "transport" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "rtcpTransport" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "getCapabilities" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "track" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "transport" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "rtcpTransport" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "getCapabilities(DOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
 FAIL RTCRtpSender interface: calling getCapabilities(DOMString) on new RTCPeerConnection().addTransceiver('audio').sender with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "setParameters" with the proper type (4) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "setParameters(RTCRtpParameters)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
 FAIL RTCRtpSender interface: calling setParameters(RTCRtpParameters) on new RTCPeerConnection().addTransceiver('audio').sender with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "getParameters" with the proper type (5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "replaceTrack" with the proper type (6) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "getParameters()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "replaceTrack(MediaStreamTrack)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
 FAIL RTCRtpSender interface: calling replaceTrack(MediaStreamTrack) on new RTCPeerConnection().addTransceiver('audio').sender with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "getStats" with the proper type (7) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "dtmf" with the proper type (8) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "getStats()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "dtmf" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
 PASS RTCRtpReceiver interface: existence and properties of interface object 
 PASS RTCRtpReceiver interface object length 
 PASS RTCRtpReceiver interface object name 
@@ -272,15 +272,15 @@
 FAIL RTCRtpReceiver interface: operation getStats() assert_own_property: interface prototype object missing non-static operation expected property "getStats" missing
 FAIL RTCRtpReceiver must be primary interface of new RTCPeerConnection().addTransceiver('audio').receiver assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
 FAIL Stringification of new RTCPeerConnection().addTransceiver('audio').receiver assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "track" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "transport" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "rtcpTransport" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getCapabilities" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "track" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "transport" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "rtcpTransport" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getCapabilities(DOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
 FAIL RTCRtpReceiver interface: calling getCapabilities(DOMString) on new RTCPeerConnection().addTransceiver('audio').receiver with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getParameters" with the proper type (4) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getContributingSources" with the proper type (5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getSynchronizationSources" with the proper type (6) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getStats" with the proper type (7) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getParameters()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getContributingSources()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getSynchronizationSources()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getStats()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
 PASS RTCRtpContributingSource interface: existence and properties of interface object 
 PASS RTCRtpContributingSource interface object length 
 PASS RTCRtpContributingSource interface object name 
@@ -314,16 +314,16 @@
 FAIL RTCRtpTransceiver interface: operation setCodecPreferences([object Object]) assert_own_property: self does not have own property "RTCRtpTransceiver" expected property "RTCRtpTransceiver" missing
 FAIL RTCRtpTransceiver must be primary interface of new RTCPeerConnection().addTransceiver('audio') assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
 FAIL Stringification of new RTCPeerConnection().addTransceiver('audio') assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "mid" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "sender" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "receiver" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "stopped" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "direction" with the proper type (4) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "currentDirection" with the proper type (5) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "setDirection" with the proper type (6) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "mid" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "sender" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "receiver" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "stopped" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "direction" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "currentDirection" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "setDirection(RTCRtpTransceiverDirection)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
 FAIL RTCRtpTransceiver interface: calling setDirection(RTCRtpTransceiverDirection) on new RTCPeerConnection().addTransceiver('audio') with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "stop" with the proper type (7) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
-FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "setCodecPreferences" with the proper type (8) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "stop()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
+FAIL RTCRtpTransceiver interface: new RTCPeerConnection().addTransceiver('audio') must inherit property "setCodecPreferences([object Object])" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
 FAIL RTCRtpTransceiver interface: calling setCodecPreferences([object Object]) on new RTCPeerConnection().addTransceiver('audio') with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: (intermediate value).addTransceiver is not a function"
 FAIL RTCDtlsTransport interface: existence and properties of interface object assert_own_property: self does not have own property "RTCDtlsTransport" expected property "RTCDtlsTransport" missing
 FAIL RTCDtlsTransport interface object length assert_own_property: self does not have own property "RTCDtlsTransport" expected property "RTCDtlsTransport" missing
@@ -336,10 +336,10 @@
 FAIL RTCDtlsTransport interface: attribute onstatechange assert_own_property: self does not have own property "RTCDtlsTransport" expected property "RTCDtlsTransport" missing
 FAIL RTCDtlsTransport must be primary interface of idlTestObjects.dtlsTransport assert_equals: wrong typeof object expected "object" but got "undefined"
 FAIL Stringification of idlTestObjects.dtlsTransport assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL RTCDtlsTransport interface: idlTestObjects.dtlsTransport must inherit property "transport" with the proper type (0) assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL RTCDtlsTransport interface: idlTestObjects.dtlsTransport must inherit property "state" with the proper type (1) assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL RTCDtlsTransport interface: idlTestObjects.dtlsTransport must inherit property "getRemoteCertificates" with the proper type (2) assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL RTCDtlsTransport interface: idlTestObjects.dtlsTransport must inherit property "onstatechange" with the proper type (3) assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL RTCDtlsTransport interface: idlTestObjects.dtlsTransport must inherit property "transport" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL RTCDtlsTransport interface: idlTestObjects.dtlsTransport must inherit property "state" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL RTCDtlsTransport interface: idlTestObjects.dtlsTransport must inherit property "getRemoteCertificates()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL RTCDtlsTransport interface: idlTestObjects.dtlsTransport must inherit property "onstatechange" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
 FAIL RTCIceTransport interface: existence and properties of interface object assert_own_property: self does not have own property "RTCIceTransport" expected property "RTCIceTransport" missing
 FAIL RTCIceTransport interface object length assert_own_property: self does not have own property "RTCIceTransport" expected property "RTCIceTransport" missing
 FAIL RTCIceTransport interface object name assert_own_property: self does not have own property "RTCIceTransport" expected property "RTCIceTransport" missing
@@ -359,18 +359,18 @@
 FAIL RTCIceTransport interface: attribute onselectedcandidatepairchange assert_own_property: self does not have own property "RTCIceTransport" expected property "RTCIceTransport" missing
 FAIL RTCIceTransport must be primary interface of idlTestObjects.iceTransport assert_equals: wrong typeof object expected "object" but got "undefined"
 FAIL Stringification of idlTestObjects.iceTransport assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "role" with the proper type (0) assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "component" with the proper type (1) assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "state" with the proper type (2) assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "gatheringState" with the proper type (3) assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getLocalCandidates" with the proper type (4) assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getRemoteCandidates" with the proper type (5) assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getSelectedCandidatePair" with the proper type (6) assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getLocalParameters" with the proper type (7) assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getRemoteParameters" with the proper type (8) assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "onstatechange" with the proper type (9) assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "ongatheringstatechange" with the proper type (10) assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "onselectedcandidatepairchange" with the proper type (11) assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "role" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "component" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "state" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "gatheringState" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getLocalCandidates()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getRemoteCandidates()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getSelectedCandidatePair()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getLocalParameters()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "getRemoteParameters()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "onstatechange" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "ongatheringstatechange" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL RTCIceTransport interface: idlTestObjects.iceTransport must inherit property "onselectedcandidatepairchange" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
 FAIL RTCTrackEvent interface: existence and properties of interface object assert_own_property: self does not have own property "RTCTrackEvent" expected property "RTCTrackEvent" missing
 FAIL RTCTrackEvent interface object length assert_own_property: self does not have own property "RTCTrackEvent" expected property "RTCTrackEvent" missing
 FAIL RTCTrackEvent interface object name assert_own_property: self does not have own property "RTCTrackEvent" expected property "RTCTrackEvent" missing
@@ -382,10 +382,10 @@
 FAIL RTCTrackEvent interface: attribute transceiver assert_own_property: self does not have own property "RTCTrackEvent" expected property "RTCTrackEvent" missing
 FAIL RTCTrackEvent must be primary interface of initTrackEvent() assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function"
 FAIL Stringification of initTrackEvent() assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function"
-FAIL RTCTrackEvent interface: initTrackEvent() must inherit property "receiver" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function"
-FAIL RTCTrackEvent interface: initTrackEvent() must inherit property "track" with the proper type (1) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function"
-FAIL RTCTrackEvent interface: initTrackEvent() must inherit property "streams" with the proper type (2) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function"
-FAIL RTCTrackEvent interface: initTrackEvent() must inherit property "transceiver" with the proper type (3) assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function"
+FAIL RTCTrackEvent interface: initTrackEvent() must inherit property "receiver" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function"
+FAIL RTCTrackEvent interface: initTrackEvent() must inherit property "track" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function"
+FAIL RTCTrackEvent interface: initTrackEvent() must inherit property "streams" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function"
+FAIL RTCTrackEvent interface: initTrackEvent() must inherit property "transceiver" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: pc.addTransceiver is not a function"
 FAIL RTCSctpTransport interface: existence and properties of interface object assert_own_property: self does not have own property "RTCSctpTransport" expected property "RTCSctpTransport" missing
 FAIL RTCSctpTransport interface object length assert_own_property: self does not have own property "RTCSctpTransport" expected property "RTCSctpTransport" missing
 FAIL RTCSctpTransport interface object name assert_own_property: self does not have own property "RTCSctpTransport" expected property "RTCSctpTransport" missing
@@ -395,8 +395,8 @@
 FAIL RTCSctpTransport interface: attribute maxMessageSize assert_own_property: self does not have own property "RTCSctpTransport" expected property "RTCSctpTransport" missing
 FAIL RTCSctpTransport must be primary interface of idlTestObjects.sctpTransport assert_equals: wrong typeof object expected "object" but got "undefined"
 FAIL Stringification of idlTestObjects.sctpTransport assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL RTCSctpTransport interface: idlTestObjects.sctpTransport must inherit property "transport" with the proper type (0) assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL RTCSctpTransport interface: idlTestObjects.sctpTransport must inherit property "maxMessageSize" with the proper type (1) assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL RTCSctpTransport interface: idlTestObjects.sctpTransport must inherit property "transport" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL RTCSctpTransport interface: idlTestObjects.sctpTransport must inherit property "maxMessageSize" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
 FAIL RTCDataChannel interface: existence and properties of interface object Cannot read property 'has_extended_attribute' of undefined
 PASS RTCDataChannel interface object length 
 PASS RTCDataChannel interface object name 
@@ -426,31 +426,31 @@
 PASS RTCDataChannel interface: operation send(ArrayBufferView) 
 PASS RTCDataChannel must be primary interface of new RTCPeerConnection().createDataChannel('') 
 FAIL Stringification of new RTCPeerConnection().createDataChannel('') Cannot read property 'has_stringifier' of undefined
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "label" with the proper type (0) 
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "ordered" with the proper type (1) 
-FAIL RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "maxPacketLifeTime" with the proper type (2) assert_inherits: property "maxPacketLifeTime" not found in prototype chain
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "maxRetransmits" with the proper type (3) 
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "protocol" with the proper type (4) 
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "negotiated" with the proper type (5) 
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "id" with the proper type (6) 
-FAIL RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "priority" with the proper type (7) assert_inherits: property "priority" not found in prototype chain
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "readyState" with the proper type (8) 
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "bufferedAmount" with the proper type (9) 
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "bufferedAmountLowThreshold" with the proper type (10) 
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onopen" with the proper type (11) 
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onbufferedamountlow" with the proper type (12) 
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onerror" with the proper type (13) 
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onclose" with the proper type (14) 
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "close" with the proper type (15) 
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onmessage" with the proper type (16) 
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "binaryType" with the proper type (17) 
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "send" with the proper type (18) 
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "label" with the proper type 
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "ordered" with the proper type 
+FAIL RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "maxPacketLifeTime" with the proper type assert_inherits: property "maxPacketLifeTime" not found in prototype chain
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "maxRetransmits" with the proper type 
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "protocol" with the proper type 
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "negotiated" with the proper type 
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "id" with the proper type 
+FAIL RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "priority" with the proper type assert_inherits: property "priority" not found in prototype chain
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "readyState" with the proper type 
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "bufferedAmount" with the proper type 
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "bufferedAmountLowThreshold" with the proper type 
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onopen" with the proper type 
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onbufferedamountlow" with the proper type 
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onerror" with the proper type 
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onclose" with the proper type 
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "close()" with the proper type 
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onmessage" with the proper type 
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "binaryType" with the proper type 
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "send(USVString)" with the proper type 
 PASS RTCDataChannel interface: calling send(USVString) on new RTCPeerConnection().createDataChannel('') with too few arguments must throw TypeError 
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "send" with the proper type (19) 
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "send(Blob)" with the proper type 
 PASS RTCDataChannel interface: calling send(Blob) on new RTCPeerConnection().createDataChannel('') with too few arguments must throw TypeError 
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "send" with the proper type (20) 
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "send(ArrayBuffer)" with the proper type 
 PASS RTCDataChannel interface: calling send(ArrayBuffer) on new RTCPeerConnection().createDataChannel('') with too few arguments must throw TypeError 
-PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "send" with the proper type (21) 
+PASS RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "send(ArrayBufferView)" with the proper type 
 PASS RTCDataChannel interface: calling send(ArrayBufferView) on new RTCPeerConnection().createDataChannel('') with too few arguments must throw TypeError 
 FAIL RTCDataChannelEvent interface: existence and properties of interface object Cannot read property 'has_extended_attribute' of undefined
 PASS RTCDataChannelEvent interface object length 
@@ -463,13 +463,13 @@
 FAIL Stringification of new RTCDataChannelEvent('channel',
         { channel: new RTCPeerConnection().createDataChannel('') }) Cannot read property 'has_stringifier' of undefined
 PASS RTCDataChannelEvent interface: new RTCDataChannelEvent('channel',
-        { channel: new RTCPeerConnection().createDataChannel('') }) must inherit property "channel" with the proper type (0) 
+        { channel: new RTCPeerConnection().createDataChannel('') }) must inherit property "channel" with the proper type 
 FAIL RTCDTMFSender interface: existence and properties of interface object assert_own_property: self does not have own property "RTCDTMFSender" expected property "RTCDTMFSender" missing
 FAIL RTCDTMFSender interface object length assert_own_property: self does not have own property "RTCDTMFSender" expected property "RTCDTMFSender" missing
 FAIL RTCDTMFSender interface object name assert_own_property: self does not have own property "RTCDTMFSender" expected property "RTCDTMFSender" missing
 FAIL RTCDTMFSender interface: existence and properties of interface prototype object assert_own_property: self does not have own property "RTCDTMFSender" expected property "RTCDTMFSender" missing
 FAIL RTCDTMFSender interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "RTCDTMFSender" expected property "RTCDTMFSender" missing
-FAIL RTCDTMFSender interface: operation insertDTMF(DOMString,unsigned long,unsigned long) assert_own_property: self does not have own property "RTCDTMFSender" expected property "RTCDTMFSender" missing
+FAIL RTCDTMFSender interface: operation insertDTMF(DOMString, unsigned long, unsigned long) assert_own_property: self does not have own property "RTCDTMFSender" expected property "RTCDTMFSender" missing
 FAIL RTCDTMFSender interface: attribute ontonechange assert_own_property: self does not have own property "RTCDTMFSender" expected property "RTCDTMFSender" missing
 FAIL RTCDTMFSender interface: attribute toneBuffer assert_own_property: self does not have own property "RTCDTMFSender" expected property "RTCDTMFSender" missing
 FAIL RTCDTMFToneChangeEvent interface: existence and properties of interface object assert_own_property: self does not have own property "RTCDTMFToneChangeEvent" expected property "RTCDTMFToneChangeEvent" missing
@@ -500,6 +500,6 @@
 FAIL RTCErrorEvent interface: attribute error assert_own_property: self does not have own property "RTCErrorEvent" expected property "RTCErrorEvent" missing
 FAIL RTCErrorEvent must be primary interface of new RTCErrorEvent('error') assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCErrorEvent is not defined"
 FAIL Stringification of new RTCErrorEvent('error') assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCErrorEvent is not defined"
-FAIL RTCErrorEvent interface: new RTCErrorEvent('error') must inherit property "error" with the proper type (0) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCErrorEvent is not defined"
+FAIL RTCErrorEvent interface: new RTCErrorEvent('error') must inherit property "error" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: RTCErrorEvent is not defined"
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webstorage/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webstorage/idlharness-expected.txt
index bb44350..4b5ce02 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webstorage/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/webstorage/idlharness-expected.txt
@@ -9,21 +9,21 @@
 FAIL Storage interface: attribute length assert_true: property should be enumerable expected true got false
 FAIL Storage interface: operation key(unsigned long) assert_true: property should be enumerable expected true got false
 FAIL Storage interface: operation getItem(DOMString) assert_true: property should be enumerable expected true got false
-FAIL Storage interface: operation setItem(DOMString,DOMString) assert_true: property should be enumerable expected true got false
+FAIL Storage interface: operation setItem(DOMString, DOMString) assert_true: property should be enumerable expected true got false
 FAIL Storage interface: operation removeItem(DOMString) assert_true: property should be enumerable expected true got false
 FAIL Storage interface: operation clear() assert_true: property should be enumerable expected true got false
 PASS Storage must be primary interface of window.localStorage 
 PASS Stringification of window.localStorage 
-PASS Storage interface: window.localStorage must inherit property "length" with the proper type (0) 
-PASS Storage interface: window.localStorage must inherit property "key" with the proper type (1) 
+PASS Storage interface: window.localStorage must inherit property "length" with the proper type 
+PASS Storage interface: window.localStorage must inherit property "key(unsigned long)" with the proper type 
 PASS Storage interface: calling key(unsigned long) on window.localStorage with too few arguments must throw TypeError 
-PASS Storage interface: window.localStorage must inherit property "getItem" with the proper type (2) 
+PASS Storage interface: window.localStorage must inherit property "getItem(DOMString)" with the proper type 
 PASS Storage interface: calling getItem(DOMString) on window.localStorage with too few arguments must throw TypeError 
-PASS Storage interface: window.localStorage must inherit property "setItem" with the proper type (3) 
-PASS Storage interface: calling setItem(DOMString,DOMString) on window.localStorage with too few arguments must throw TypeError 
-PASS Storage interface: window.localStorage must inherit property "removeItem" with the proper type (4) 
+PASS Storage interface: window.localStorage must inherit property "setItem(DOMString, DOMString)" with the proper type 
+PASS Storage interface: calling setItem(DOMString, DOMString) on window.localStorage with too few arguments must throw TypeError 
+PASS Storage interface: window.localStorage must inherit property "removeItem(DOMString)" with the proper type 
 PASS Storage interface: calling removeItem(DOMString) on window.localStorage with too few arguments must throw TypeError 
-PASS Storage interface: window.localStorage must inherit property "clear" with the proper type (5) 
+PASS Storage interface: window.localStorage must inherit property "clear()" with the proper type 
 PASS StorageEvent interface: existence and properties of interface object 
 PASS StorageEvent interface object length 
 PASS StorageEvent interface object name 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces-expected.txt
index f20b50b9..ab25b95 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/webvtt/api/interfaces-expected.txt
@@ -18,17 +18,17 @@
 PASS VTTCue interface: operation getCueAsHTML() 
 PASS VTTCue must be primary interface of new VTTCue(0, 0, "") 
 PASS Stringification of new VTTCue(0, 0, "") 
-PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "region" with the proper type (0) 
-PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "vertical" with the proper type (1) 
-PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "snapToLines" with the proper type (2) 
-PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "line" with the proper type (3) 
-FAIL VTTCue interface: new VTTCue(0, 0, "") must inherit property "lineAlign" with the proper type (4) assert_inherits: property "lineAlign" not found in prototype chain
-PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "position" with the proper type (5) 
-FAIL VTTCue interface: new VTTCue(0, 0, "") must inherit property "positionAlign" with the proper type (6) assert_inherits: property "positionAlign" not found in prototype chain
-PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "size" with the proper type (7) 
-PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "align" with the proper type (8) 
-PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "text" with the proper type (9) 
-PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "getCueAsHTML" with the proper type (10) 
+PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "region" with the proper type 
+PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "vertical" with the proper type 
+PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "snapToLines" with the proper type 
+PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "line" with the proper type 
+FAIL VTTCue interface: new VTTCue(0, 0, "") must inherit property "lineAlign" with the proper type assert_inherits: property "lineAlign" not found in prototype chain
+PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "position" with the proper type 
+FAIL VTTCue interface: new VTTCue(0, 0, "") must inherit property "positionAlign" with the proper type assert_inherits: property "positionAlign" not found in prototype chain
+PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "size" with the proper type 
+PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "align" with the proper type 
+PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "text" with the proper type 
+PASS VTTCue interface: new VTTCue(0, 0, "") must inherit property "getCueAsHTML()" with the proper type 
 PASS VTTRegion interface: existence and properties of interface object 
 PASS VTTRegion interface object length 
 PASS VTTRegion interface object name 
@@ -43,12 +43,12 @@
 PASS VTTRegion interface: attribute scroll 
 PASS VTTRegion must be primary interface of new VTTRegion() 
 PASS Stringification of new VTTRegion() 
-PASS VTTRegion interface: new VTTRegion() must inherit property "width" with the proper type (0) 
-PASS VTTRegion interface: new VTTRegion() must inherit property "lines" with the proper type (1) 
-PASS VTTRegion interface: new VTTRegion() must inherit property "regionAnchorX" with the proper type (2) 
-PASS VTTRegion interface: new VTTRegion() must inherit property "regionAnchorY" with the proper type (3) 
-PASS VTTRegion interface: new VTTRegion() must inherit property "viewportAnchorX" with the proper type (4) 
-PASS VTTRegion interface: new VTTRegion() must inherit property "viewportAnchorY" with the proper type (5) 
-PASS VTTRegion interface: new VTTRegion() must inherit property "scroll" with the proper type (6) 
+PASS VTTRegion interface: new VTTRegion() must inherit property "width" with the proper type 
+PASS VTTRegion interface: new VTTRegion() must inherit property "lines" with the proper type 
+PASS VTTRegion interface: new VTTRegion() must inherit property "regionAnchorX" with the proper type 
+PASS VTTRegion interface: new VTTRegion() must inherit property "regionAnchorY" with the proper type 
+PASS VTTRegion interface: new VTTRegion() must inherit property "viewportAnchorX" with the proper type 
+PASS VTTRegion interface: new VTTRegion() must inherit property "viewportAnchorY" with the proper type 
+PASS VTTRegion interface: new VTTRegion() must inherit property "scroll" with the proper type 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/workers/Worker_dispatchEvent_ErrorEvent.htm b/third_party/WebKit/LayoutTests/external/wpt/workers/Worker_dispatchEvent_ErrorEvent.htm
index aea7e025..11ade605 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/workers/Worker_dispatchEvent_ErrorEvent.htm
+++ b/third_party/WebKit/LayoutTests/external/wpt/workers/Worker_dispatchEvent_ErrorEvent.htm
@@ -25,12 +25,6 @@
 });
 
 test(function() {
-  var e = document.createEvent("ErrorEvent");
-  var eProto = Object.getPrototypeOf(e);
-  assert_equals(eProto, ErrorEvent.prototype);
-}, "document.createEvent('ErrorEvent')");
-
-test(function() {
   var e = new ErrorEvent("error");
   assert_false("initErrorEvent" in e, "should not be supported");
 }, "initErrorEvent");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/workers/data-url.html b/third_party/WebKit/LayoutTests/external/wpt/workers/data-url.html
index 3a4eb6c..8743490f 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/workers/data-url.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/workers/data-url.html
@@ -25,7 +25,8 @@
     w.onmessage = t.step_func_done(function(e) {
       assert_unreached('Should not receive any message back.');
     });
-    w.onerror = t.step_func_done(function() {
+    w.onerror = t.step_func_done(function(e) {
+      assert_true(true, 'Should throw ' + e.message);
     });
   }, test_desc);
 }
@@ -50,8 +51,9 @@
 assert_worker_sends_pass('cross-origin worker', '', 'fetch("/").then(() => self.postMessage("FAIL"), () => self.postMessage("PASS"))');
 
 // 'data:' workers have opaque origin
-assert_worker_sends_pass('worker has opaque origin', 'application/javascript', 'if (self.location.origin == "null") postMessage("PASS"); else postMessage("FAIL");');
+assert_worker_sends_pass('worker has opaque origin', 'application/javascript', 'if (self.location.origin == "null") {postMessage("PASS");} else {postMessage("FAIL");}');
 
+setup({allow_uncaught_exception:true});
 // invalid javascript will trigger an ErrorEvent
 assert_worker_construction_fails('invalid javascript produces error', 'application/javascript', '}x=3');
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/workers/interfaces.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/workers/interfaces.worker-expected.txt
index 4cbda0d..e8cf991 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/workers/interfaces.worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/workers/interfaces.worker-expected.txt
@@ -5,8 +5,8 @@
 PASS EventTarget interface object name 
 PASS EventTarget interface: existence and properties of interface prototype object 
 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 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 WorkerGlobalScope interface: existence and properties of interface object 
@@ -27,12 +27,12 @@
 PASS WorkerGlobalScope interface: attribute origin 
 PASS WorkerGlobalScope interface: operation btoa(DOMString) 
 PASS WorkerGlobalScope interface: operation atob(DOMString) 
-PASS WorkerGlobalScope interface: operation setTimeout(TimerHandler,long,any) 
+PASS WorkerGlobalScope interface: operation setTimeout(TimerHandler, long, any) 
 PASS WorkerGlobalScope interface: operation clearTimeout(long) 
-PASS WorkerGlobalScope interface: operation setInterval(TimerHandler,long,any) 
+PASS WorkerGlobalScope interface: operation setInterval(TimerHandler, long, any) 
 PASS WorkerGlobalScope interface: operation clearInterval(long) 
-PASS WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource,ImageBitmapOptions) 
-PASS WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource,long,long,long,long,ImageBitmapOptions) 
+PASS WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource, ImageBitmapOptions) 
+PASS WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) 
 PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object 
 PASS DedicatedWorkerGlobalScope interface object length 
 PASS DedicatedWorkerGlobalScope interface object name 
@@ -45,7 +45,7 @@
 PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true 
 PASS DedicatedWorkerGlobalScope interface: existence and properties of interface prototype object's "constructor" property 
 FAIL DedicatedWorkerGlobalScope interface: attribute name assert_own_property: The global object must have a property "name" expected property "name" missing
-PASS DedicatedWorkerGlobalScope interface: operation postMessage(any,[object Object]) 
+PASS DedicatedWorkerGlobalScope interface: operation postMessage(any, [object Object]) 
 PASS DedicatedWorkerGlobalScope interface: operation close() 
 PASS DedicatedWorkerGlobalScope interface: attribute onmessage 
 PASS DedicatedWorkerGlobalScope interface: attribute onmessageerror 
@@ -57,45 +57,45 @@
 PASS DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true 
 PASS DedicatedWorkerGlobalScope must be primary interface of self 
 PASS Stringification of self 
-FAIL DedicatedWorkerGlobalScope interface: self must inherit property "name" with the proper type (0) assert_own_property: expected property "name" missing
-PASS DedicatedWorkerGlobalScope interface: self must inherit property "postMessage" with the proper type (1) 
-PASS DedicatedWorkerGlobalScope interface: calling postMessage(any,[object Object]) on self with too few arguments must throw TypeError 
-PASS DedicatedWorkerGlobalScope interface: self must inherit property "close" with the proper type (2) 
-PASS DedicatedWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type (3) 
-PASS DedicatedWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type (4) 
-PASS WorkerGlobalScope interface: self must inherit property "self" with the proper type (0) 
-PASS WorkerGlobalScope interface: self must inherit property "location" with the proper type (1) 
-PASS WorkerGlobalScope interface: self must inherit property "navigator" with the proper type (2) 
-PASS WorkerGlobalScope interface: self must inherit property "importScripts" with the proper type (3) 
+FAIL DedicatedWorkerGlobalScope interface: self must inherit property "name" with the proper type assert_own_property: expected property "name" missing
+PASS DedicatedWorkerGlobalScope interface: self must inherit property "postMessage(any, [object Object])" with the proper type 
+PASS DedicatedWorkerGlobalScope interface: calling postMessage(any, [object Object]) on self with too few arguments must throw TypeError 
+PASS DedicatedWorkerGlobalScope interface: self must inherit property "close()" with the proper type 
+PASS DedicatedWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type 
+PASS DedicatedWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type 
+PASS WorkerGlobalScope interface: self must inherit property "self" with the proper type 
+PASS WorkerGlobalScope interface: self must inherit property "location" with the proper type 
+PASS WorkerGlobalScope interface: self must inherit property "navigator" with the proper type 
+PASS WorkerGlobalScope interface: self must inherit property "importScripts(USVString)" with the proper type 
 PASS WorkerGlobalScope interface: calling importScripts(USVString) on self with too few arguments must throw TypeError 
-PASS WorkerGlobalScope interface: self must inherit property "onerror" with the proper type (4) 
-FAIL WorkerGlobalScope interface: self must inherit property "onlanguagechange" with the proper type (5) assert_inherits: property "onlanguagechange" not found in prototype chain
-FAIL WorkerGlobalScope interface: self must inherit property "onoffline" with the proper type (6) assert_inherits: property "onoffline" not found in prototype chain
-FAIL WorkerGlobalScope interface: self must inherit property "ononline" with the proper type (7) assert_inherits: property "ononline" not found in prototype chain
-PASS WorkerGlobalScope interface: self must inherit property "onrejectionhandled" with the proper type (8) 
-PASS WorkerGlobalScope interface: self must inherit property "onunhandledrejection" with the proper type (9) 
-PASS WorkerGlobalScope interface: self must inherit property "origin" with the proper type (10) 
-PASS WorkerGlobalScope interface: self must inherit property "btoa" with the proper type (11) 
+PASS WorkerGlobalScope interface: self must inherit property "onerror" with the proper type 
+FAIL WorkerGlobalScope interface: self must inherit property "onlanguagechange" with the proper type assert_inherits: property "onlanguagechange" not found in prototype chain
+FAIL WorkerGlobalScope interface: self must inherit property "onoffline" with the proper type assert_inherits: property "onoffline" not found in prototype chain
+FAIL WorkerGlobalScope interface: self must inherit property "ononline" with the proper type assert_inherits: property "ononline" not found in prototype chain
+PASS WorkerGlobalScope interface: self must inherit property "onrejectionhandled" with the proper type 
+PASS WorkerGlobalScope interface: self must inherit property "onunhandledrejection" with the proper type 
+PASS WorkerGlobalScope interface: self must inherit property "origin" with the proper type 
+PASS WorkerGlobalScope interface: self must inherit property "btoa(DOMString)" with the proper type 
 PASS WorkerGlobalScope interface: calling btoa(DOMString) on self with too few arguments must throw TypeError 
-PASS WorkerGlobalScope interface: self must inherit property "atob" with the proper type (12) 
+PASS WorkerGlobalScope interface: self must inherit property "atob(DOMString)" with the proper type 
 PASS WorkerGlobalScope interface: calling atob(DOMString) on self with too few arguments must throw TypeError 
-PASS WorkerGlobalScope interface: self must inherit property "setTimeout" with the proper type (13) 
-PASS WorkerGlobalScope interface: calling setTimeout(TimerHandler,long,any) on self with too few arguments must throw TypeError 
-PASS WorkerGlobalScope interface: self must inherit property "clearTimeout" with the proper type (14) 
+PASS WorkerGlobalScope interface: self must inherit property "setTimeout(TimerHandler, long, any)" with the proper type 
+PASS WorkerGlobalScope interface: calling setTimeout(TimerHandler, long, any) on self with too few arguments must throw TypeError 
+PASS WorkerGlobalScope interface: self must inherit property "clearTimeout(long)" with the proper type 
 PASS WorkerGlobalScope interface: calling clearTimeout(long) on self with too few arguments must throw TypeError 
-PASS WorkerGlobalScope interface: self must inherit property "setInterval" with the proper type (15) 
-PASS WorkerGlobalScope interface: calling setInterval(TimerHandler,long,any) on self with too few arguments must throw TypeError 
-PASS WorkerGlobalScope interface: self must inherit property "clearInterval" with the proper type (16) 
+PASS WorkerGlobalScope interface: self must inherit property "setInterval(TimerHandler, long, any)" with the proper type 
+PASS WorkerGlobalScope interface: calling setInterval(TimerHandler, long, any) on self with too few arguments must throw TypeError 
+PASS WorkerGlobalScope interface: self must inherit property "clearInterval(long)" with the proper type 
 PASS WorkerGlobalScope interface: calling clearInterval(long) on self with too few arguments must throw TypeError 
-PASS WorkerGlobalScope interface: self must inherit property "createImageBitmap" with the proper type (17) 
-PASS WorkerGlobalScope interface: calling createImageBitmap(ImageBitmapSource,ImageBitmapOptions) on self with too few arguments must throw TypeError 
-PASS WorkerGlobalScope interface: self must inherit property "createImageBitmap" with the proper type (18) 
-PASS WorkerGlobalScope interface: calling createImageBitmap(ImageBitmapSource,long,long,long,long,ImageBitmapOptions) on self with too few arguments must throw TypeError 
-PASS EventTarget interface: self must inherit property "addEventListener" with the proper type (0) 
-PASS EventTarget interface: calling addEventListener(DOMString,EventListener,[object Object],[object Object]) on self with too few arguments must throw TypeError 
-PASS EventTarget interface: self must inherit property "removeEventListener" with the proper type (1) 
-PASS EventTarget interface: calling removeEventListener(DOMString,EventListener,[object Object],[object Object]) on self with too few arguments must throw TypeError 
-PASS EventTarget interface: self must inherit property "dispatchEvent" with the proper type (2) 
+PASS WorkerGlobalScope interface: self must inherit property "createImageBitmap(ImageBitmapSource, ImageBitmapOptions)" with the proper type 
+PASS WorkerGlobalScope interface: calling createImageBitmap(ImageBitmapSource, ImageBitmapOptions) on self with too few arguments must throw TypeError 
+PASS WorkerGlobalScope interface: self must inherit property "createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions)" with the proper type 
+PASS WorkerGlobalScope interface: calling createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) on self with too few arguments must throw TypeError 
+PASS EventTarget interface: self must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on self with too few arguments must throw TypeError 
+PASS EventTarget interface: self must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on self with too few arguments must throw TypeError 
+PASS EventTarget interface: self must inherit property "dispatchEvent(Event)" with the proper type 
 PASS EventTarget interface: calling dispatchEvent(Event) on self with too few arguments must throw TypeError 
 PASS WorkerNavigator interface: existence and properties of interface object 
 PASS WorkerNavigator interface object length 
@@ -117,19 +117,19 @@
 PASS WorkerNavigator interface: attribute hardwareConcurrency 
 PASS WorkerNavigator must be primary interface of self.navigator 
 PASS Stringification of self.navigator 
-PASS WorkerNavigator interface: self.navigator must inherit property "appCodeName" with the proper type (0) 
-PASS WorkerNavigator interface: self.navigator must inherit property "appName" with the proper type (1) 
-PASS WorkerNavigator interface: self.navigator must inherit property "appVersion" with the proper type (2) 
-PASS WorkerNavigator interface: self.navigator must inherit property "platform" with the proper type (3) 
-PASS WorkerNavigator interface: self.navigator must inherit property "product" with the proper type (4) 
+PASS WorkerNavigator interface: self.navigator must inherit property "appCodeName" with the proper type 
+PASS WorkerNavigator interface: self.navigator must inherit property "appName" with the proper type 
+PASS WorkerNavigator interface: self.navigator must inherit property "appVersion" with the proper type 
+PASS WorkerNavigator interface: self.navigator must inherit property "platform" with the proper type 
+PASS WorkerNavigator interface: self.navigator must inherit property "product" with the proper type 
 PASS WorkerNavigatorinterface: self.navigatormust not have property "productSub" 
-PASS WorkerNavigator interface: self.navigator must inherit property "userAgent" with the proper type (6) 
+PASS WorkerNavigator interface: self.navigator must inherit property "userAgent" with the proper type 
 PASS WorkerNavigatorinterface: self.navigatormust not have property "vendor" 
 PASS WorkerNavigatorinterface: self.navigatormust not have property "vendorSub" 
-FAIL WorkerNavigator interface: self.navigator must inherit property "language" with the proper type (9) assert_inherits: property "language" not found in prototype chain
-FAIL WorkerNavigator interface: self.navigator must inherit property "languages" with the proper type (10) assert_inherits: property "languages" not found in prototype chain
-PASS WorkerNavigator interface: self.navigator must inherit property "onLine" with the proper type (11) 
-PASS WorkerNavigator interface: self.navigator must inherit property "hardwareConcurrency" with the proper type (12) 
+FAIL WorkerNavigator interface: self.navigator must inherit property "language" with the proper type assert_inherits: property "language" not found in prototype chain
+FAIL WorkerNavigator interface: self.navigator must inherit property "languages" with the proper type assert_inherits: property "languages" not found in prototype chain
+PASS WorkerNavigator interface: self.navigator must inherit property "onLine" with the proper type 
+PASS WorkerNavigator interface: self.navigator must inherit property "hardwareConcurrency" with the proper type 
 PASS WorkerLocation interface: existence and properties of interface object 
 PASS WorkerLocation interface object length 
 PASS WorkerLocation interface object name 
@@ -147,14 +147,14 @@
 PASS WorkerLocation interface: attribute hash 
 PASS WorkerLocation must be primary interface of self.location 
 PASS Stringification of self.location 
-PASS WorkerLocation interface: self.location must inherit property "href" with the proper type (0) 
-PASS WorkerLocation interface: self.location must inherit property "origin" with the proper type (1) 
-PASS WorkerLocation interface: self.location must inherit property "protocol" with the proper type (2) 
-PASS WorkerLocation interface: self.location must inherit property "host" with the proper type (3) 
-PASS WorkerLocation interface: self.location must inherit property "hostname" with the proper type (4) 
-PASS WorkerLocation interface: self.location must inherit property "port" with the proper type (5) 
-PASS WorkerLocation interface: self.location must inherit property "pathname" with the proper type (6) 
-PASS WorkerLocation interface: self.location must inherit property "search" with the proper type (7) 
-PASS WorkerLocation interface: self.location must inherit property "hash" with the proper type (8) 
+PASS WorkerLocation interface: self.location must inherit property "href" with the proper type 
+PASS WorkerLocation interface: self.location must inherit property "origin" with the proper type 
+PASS WorkerLocation interface: self.location must inherit property "protocol" with the proper type 
+PASS WorkerLocation interface: self.location must inherit property "host" with the proper type 
+PASS WorkerLocation interface: self.location must inherit property "hostname" with the proper type 
+PASS WorkerLocation interface: self.location must inherit property "port" with the proper type 
+PASS WorkerLocation interface: self.location must inherit property "pathname" with the proper type 
+PASS WorkerLocation interface: self.location must inherit property "search" with the proper type 
+PASS WorkerLocation interface: self.location must inherit property "hash" with the proper type 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-getImageData-linear-rgb.html b/third_party/WebKit/LayoutTests/fast/canvas/canvas-getImageData-linear-rgb.html
deleted file mode 100644
index 548783c..0000000
--- a/third_party/WebKit/LayoutTests/fast/canvas/canvas-getImageData-linear-rgb.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE html>
-<body>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script>
-test(drawThenGetImageData, 'verifies that getImageData works on linear-rgb canvases.');
-test(putThenGetImageData, 'verifies that putImageData works on linear-rgb canvases.');
-
-function drawThenGetImageData() {
-  var canvas = document.createElement('canvas');
-  canvas.width = 10;
-  canvas.height = 10;
-  var ctx = canvas.getContext('2d', {colorSpace: 'srgb', pixelFormat: 'float16'})
-  ctx.fillStyle = 'rgb(50, 100, 150)';
-  ctx.fillRect(0, 0, 10, 10);
-  var pixel = ctx.getImageData(5, 5, 1, 1).data;
-  // Note: the color specified as as fillStyle is converted from srgb to linear
-  // when drawn and the the results of getImageData are re-converted to sRGB
-  assert_equals(pixel[0], 50, "Red component retrieved by getImageData is the color that was drawn." );
-  assert_equals(pixel[1], 100, "Green component retrieved by getImageData is the color that was drawn." );
-  assert_equals(pixel[2], 150, "Blue component retrieved by getImageData is the color that was drawn." );
-  assert_equals(pixel[3], 255, "Alpha component retrieved by getImageData is the color that was drawn." );
-}
-
-function putThenGetImageData() {
-  var canvas = document.createElement('canvas');
-  canvas.width = 10;
-  canvas.height = 10;
-  var ctx = canvas.getContext('2d', {colorSpace: 'srgb', pixelFormat: 'float16'})
-  var initialData = ctx.createImageData(1, 1);
-  initialData.data[0] = 50;
-  initialData.data[1] = 100;
-  initialData.data[2] = 150;
-  initialData.data[3] = 255;
-  ctx.putImageData(initialData, 5, 5);
-  var pixel = ctx.getImageData(5, 5, 1, 1).data;
-  assert_equals(pixel[0], 50, "Red component retrieved by getImageData is the color that was put." );
-  assert_equals(pixel[1], 100, "Green component retrieved by getImageData is the color that was put." );
-  assert_equals(pixel[2], 150, "Blue component retrieved by getImageData is the color that was put." );
-  assert_equals(pixel[3], 255, "Alpha component retrieved by getImageData is the color that was put." );
-}
-
-</script>
-</body>
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-getImageData-p3.html b/third_party/WebKit/LayoutTests/fast/canvas/canvas-getImageData-p3.html
deleted file mode 100644
index 955f989..0000000
--- a/third_party/WebKit/LayoutTests/fast/canvas/canvas-getImageData-p3.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE html>
-<body>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script>
-test(drawThenGetImageData, 'verifies that getImageData works on P3 canvases.');
-test(putThenGetImageData, 'verifies that putImageData works on P3 canvases.');
-
-function drawThenGetImageData() {
-    var canvas = document.createElement('canvas');
-    canvas.width = 10;
-    canvas.height = 10;
-    var ctx = canvas.getContext('2d', {colorSpace: 'p3'})
-    ctx.fillStyle = 'rgb(50, 100, 150)';
-    ctx.fillRect(0, 0, 10, 10);
-    var pixel = ctx.getImageData(5, 5, 1, 1).data;
-    // Note: the color specified as as fillStyle is converted from srgb to linear
-    // when drawn and the the results of getImageData are re-converted to sRGB
-    assert_equals(pixel[0], 50, "Red component retrieved by getImageData is the color that was drawn." );
-    assert_equals(pixel[1], 100, "Green component retrieved by getImageData is the color that was drawn." );
-    assert_equals(pixel[2], 150, "Blue component retrieved by getImageData is the color that was drawn." );
-    assert_equals(pixel[3], 255, "Alpha component retrieved by getImageData is the color that was drawn." );
-}
-
-function putThenGetImageData() {
-    var canvas = document.createElement('canvas');
-    canvas.width = 10;
-    canvas.height = 10;
-    var ctx = canvas.getContext('2d', {colorSpace: 'p3'})
-    var initialData = ctx.createImageData(1, 1);
-    initialData.data[0] = 50;
-    initialData.data[1] = 100;
-    initialData.data[2] = 150;
-    initialData.data[3] = 255;
-    ctx.putImageData(initialData, 5, 5);
-    var pixel = ctx.getImageData(5, 5, 1, 1).data;
-    assert_equals(pixel[0], 50, "Red component retrieved by getImageData is the color that was put." );
-    assert_equals(pixel[1], 100, "Green component retrieved by getImageData is the color that was put." );
-    assert_equals(pixel[2], 150, "Blue component retrieved by getImageData is the color that was put." );
-    assert_equals(pixel[3], 255, "Alpha component retrieved by getImageData is the color that was put." );
-}
-</script>
-</body>
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-getImageData-rec2020.html b/third_party/WebKit/LayoutTests/fast/canvas/canvas-getImageData-rec2020.html
deleted file mode 100644
index 8b6c1b6..0000000
--- a/third_party/WebKit/LayoutTests/fast/canvas/canvas-getImageData-rec2020.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE html>
-<body>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script>
-test(drawThenGetImageData, 'verifies that getImageData works on rec2020 canvases.');
-test(putThenGetImageData, 'verifies that putImageData works on rec2020 canvases.');
-
-function drawThenGetImageData() {
-    var canvas = document.createElement('canvas');
-    canvas.width = 10;
-    canvas.height = 10;
-    var ctx = canvas.getContext('2d', {colorSpace: 'rec2020'})
-    ctx.fillStyle = 'rgb(50, 100, 150)';
-    ctx.fillRect(0, 0, 10, 10);
-    var pixel = ctx.getImageData(5, 5, 1, 1).data;
-    // Note: the color specified as as fillStyle is converted from srgb to linear
-    // when drawn and the the results of getImageData are re-converted to sRGB
-    assert_equals(pixel[0], 50, "Red component retrieved by getImageData is the color that was drawn." );
-    assert_equals(pixel[1], 100, "Green component retrieved by getImageData is the color that was drawn." );
-    assert_equals(pixel[2], 150, "Blue component retrieved by getImageData is the color that was drawn." );
-    assert_equals(pixel[3], 255, "Alpha component retrieved by getImageData is the color that was drawn." );
-}
-
-function putThenGetImageData() {
-    var canvas = document.createElement('canvas');
-    canvas.width = 10;
-    canvas.height = 10;
-    var ctx = canvas.getContext('2d', {colorSpace: 'rec2020'})
-    var initialData = ctx.createImageData(1, 1);
-    initialData.data[0] = 50;
-    initialData.data[1] = 100;
-    initialData.data[2] = 150;
-    initialData.data[3] = 255;
-    ctx.putImageData(initialData, 5, 5);
-    var pixel = ctx.getImageData(5, 5, 1, 1).data;
-    assert_equals(pixel[0], 50, "Red component retrieved by getImageData is the color that was put." );
-    assert_equals(pixel[1], 100, "Green component retrieved by getImageData is the color that was put." );
-    assert_equals(pixel[2], 150, "Blue component retrieved by getImageData is the color that was put." );
-    assert_equals(pixel[3], 255, "Alpha component retrieved by getImageData is the color that was put." );
-}
-</script>
-</body>
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/WebKit/LayoutTests/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png
index ade4312..f46a177a 100644
--- a/third_party/WebKit/LayoutTests/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png
+++ b/third_party/WebKit/LayoutTests/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Range/scale-page-bounding-client-rect.html b/third_party/WebKit/LayoutTests/fast/dom/Range/scale-page-bounding-client-rect.html
index 4150018..f2e03d2c 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Range/scale-page-bounding-client-rect.html
+++ b/third_party/WebKit/LayoutTests/fast/dom/Range/scale-page-bounding-client-rect.html
@@ -8,16 +8,17 @@
     testRunner.dumpAsText();
 
     var range = document.createRange();
-    range.selectNodeContents(document.getElementById('div'));
+    range.selectNode(document.getElementById('div'));
     var rect = range.getBoundingClientRect();
 
     window.internals.setPageScaleFactor(2);
     var scaledRange = document.createRange();
-    scaledRange.selectNodeContents(document.getElementById('div'));
+    scaledRange.selectNode(document.getElementById('div'));
     var scaledRect = scaledRange.getBoundingClientRect();
 
     var result = document.getElementById("result");
-    if (rect.left == scaledRect.left &&
+    if (rect.width && rect.height &&
+        rect.left == scaledRect.left &&
         rect.top == scaledRect.top &&
         rect.right == scaledRect.right &&
         rect.bottom == scaledRect.bottom)
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Range/scale-page-client-rects.html b/third_party/WebKit/LayoutTests/fast/dom/Range/scale-page-client-rects.html
index 65529dd..487c0937 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Range/scale-page-client-rects.html
+++ b/third_party/WebKit/LayoutTests/fast/dom/Range/scale-page-client-rects.html
@@ -8,18 +8,19 @@
     testRunner.dumpAsText();
 
     var range = document.createRange();
-    range.selectNodeContents(document.getElementById('div'));
+    range.selectNode(document.getElementById('div'));
     var rectList = range.getClientRects();
     var rect = rectList[0];
 
     window.internals.setPageScaleFactor(2);
     var scaledRange = document.createRange();
-    scaledRange.selectNodeContents(document.getElementById('div'));
+    scaledRange.selectNode(document.getElementById('div'));
     var scaledRectList = scaledRange.getClientRects();
     var scaledRect = scaledRectList[0];
 
     var result = document.getElementById("result");
-    if (rect.left == scaledRect.left &&
+    if (rect.width && rect.height &&
+        rect.left == scaledRect.left &&
         rect.top == scaledRect.top &&
         rect.right == scaledRect.right &&
         rect.bottom == scaledRect.bottom)
diff --git a/third_party/WebKit/LayoutTests/fast/forms/password-length-emoji-expected.html b/third_party/WebKit/LayoutTests/fast/forms/password-length-emoji-expected.html
deleted file mode 100644
index 4f451de..0000000
--- a/third_party/WebKit/LayoutTests/fast/forms/password-length-emoji-expected.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!doctype html>
-<html>
-<body>
-<p> This tests that the number of bullet points shown in a password
-field reflects the number of "grapheme clusters" even if some of the grapheme
-clusters are characters outside the Basic Multilingual Plane, or combining
-characters. For <a href="https://crbug.com/486880">crbug.com/486880</a>.</p>
-<input type="password" value="x"></input> <!-- one ascii character -->
-<br><input type="password" value="cafe"></input> <!-- without combining character -->
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/fast/forms/password-length-emoji.html b/third_party/WebKit/LayoutTests/fast/forms/password-length-emoji.html
deleted file mode 100644
index 22258396..0000000
--- a/third_party/WebKit/LayoutTests/fast/forms/password-length-emoji.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!doctype html>
-<html>
-<body>
-<p> This tests that the number of bullet points shown in a password
-field reflects the number of "grapheme clusters" even if some of the grapheme
-clusters are characters outside the Basic Multilingual Plane, or combining
-characters. For <a href="https://crbug.com/486880">crbug.com/486880</a>.</p>
-<input type="password" value="😃"></input> <!-- Smiley face (U+1F603) -->
-<br><input type="password" value="cafe&#x0301;"></input> <!-- with combining character -->
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/fast/gradients/background-clipped-expected.png b/third_party/WebKit/LayoutTests/fast/gradients/background-clipped-expected.png
index 3f4bcff..190b298a 100644
--- a/third_party/WebKit/LayoutTests/fast/gradients/background-clipped-expected.png
+++ b/third_party/WebKit/LayoutTests/fast/gradients/background-clipped-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/fast/repaint/sub-frame-svg-background-expected.html b/third_party/WebKit/LayoutTests/fast/repaint/sub-frame-svg-background-expected.html
new file mode 100644
index 0000000..b0f6008f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/repaint/sub-frame-svg-background-expected.html
@@ -0,0 +1,3 @@
+<!DOCTYPE html>
+<iframe srcdoc="<html style='background:green;'></html>"></iframe>
+
diff --git a/third_party/WebKit/LayoutTests/fast/repaint/sub-frame-svg-background.html b/third_party/WebKit/LayoutTests/fast/repaint/sub-frame-svg-background.html
new file mode 100644
index 0000000..693e29d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/repaint/sub-frame-svg-background.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<script src="../../resources/run-after-layout-and-paint.js"></script>
+<script>
+  if (window.testRunner) {
+    testRunner.overridePreference("WebKitWebSecurityEnabled", false);
+    testRunner.waitUntilDone();
+  }
+
+  function runTest() {
+    runAfterLayoutAndPaint(function(){
+        var frame = document.getElementById("frame");
+        frame.contentDocument.documentElement.style.background = "green";
+    }, true);
+  }
+</script>
+<iframe id="frame" src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20style%3D%22background%3Ared%3B%22%3E%3C%2Fsvg%3E" onload="runTest();"></iframe>
+
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-unit/datagrid-editable-longtext-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector-unit/datagrid-editable-longtext-expected.txt
new file mode 100644
index 0000000..1b4bd59f9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector-unit/datagrid-editable-longtext-expected.txt
@@ -0,0 +1,31 @@
+This tests long text in datagrid.
+Original lengths
+key text length: 1500
+value text length: 1000
+
+Test committing a long key
+key element is being edited
+key text length: 3000
+Blurring the key
+Editor value committed.
+key text length: 3000
+
+Test no-op editing the key
+key element is being edited
+key text length: 3000
+Blurring the key
+key text length: 3000
+
+Test committing a long value
+value element is being edited
+value text length: 3000
+Blurring the value
+Editor value committed.
+value text length: 1000
+
+Test no-op editing the value
+value element is being edited
+value text length: 3000
+Blurring the value
+value text length: 1000
+
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-unit/datagrid-editable-longtext.js b/third_party/WebKit/LayoutTests/http/tests/inspector-unit/datagrid-editable-longtext.js
new file mode 100644
index 0000000..cd25055
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector-unit/datagrid-editable-longtext.js
@@ -0,0 +1,72 @@
+TestRunner.loadModule('data_grid').then(test);
+
+function test() {
+  TestRunner.addResult("This tests long text in datagrid.");
+
+  var columns = [
+    {id: "key", title: "Key column", editable: true, longText: false},
+    {id: "value", title: "Value column", editable: true, longText: true}
+  ];
+  var dataGrid = new DataGrid.DataGrid(columns, onEdit);
+  UI.inspectorView.element.appendChild(dataGrid.element);
+
+  var rootNode = dataGrid.rootNode();
+  var node = new DataGrid.DataGridNode({key: "k".repeat(1500), value: "v".repeat(1500)});
+  rootNode.appendChild(node);
+
+  var keyElement = dataGrid.element.querySelector(".data .key-column");
+  var valueElement = dataGrid.element.querySelector(".data .value-column");
+
+  TestRunner.addResult("Original lengths");
+  dumpKeyLength();
+  dumpValueLength();
+
+  TestRunner.addResult("\nTest committing a long key");
+  dataGrid._startEditing(keyElement);
+  keyElement.textContent = "k".repeat(3000);
+  dumpKeyLength();
+  TestRunner.addResult("Blurring the key");
+  keyElement.blur();
+  dumpKeyLength();
+
+  TestRunner.addResult("\nTest no-op editing the key");
+  dataGrid._startEditing(keyElement);
+  dumpKeyLength();
+  TestRunner.addResult("Blurring the key");
+  keyElement.blur();
+  dumpKeyLength();
+
+  TestRunner.addResult("\nTest committing a long value");
+  dataGrid._startEditing(valueElement);
+  valueElement.textContent = "v".repeat(3000);
+  dumpValueLength();
+  TestRunner.addResult("Blurring the value");
+  valueElement.blur();
+  dumpValueLength();
+
+  TestRunner.addResult("\nTest no-op editing the value");
+  dataGrid._startEditing(valueElement);
+  dumpValueLength();
+  TestRunner.addResult("Blurring the value");
+  valueElement.blur();
+  dumpValueLength();
+
+
+  TestRunner.completeTest();
+
+  function dumpKeyLength() {
+    if (keyElement.classList.contains("being-edited"))
+      TestRunner.addResult("key element is being edited");
+    TestRunner.addResult("key text length: " + keyElement.textContent.length);
+  }
+
+  function dumpValueLength() {
+    if (valueElement.classList.contains("being-edited"))
+      TestRunner.addResult("value element is being edited");
+    TestRunner.addResult("value text length: " + valueElement.textContent.length);
+  }
+
+  function onEdit() {
+    TestRunner.addResult("Editor value committed.");
+  }
+}
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-active-and-passive-reload.html b/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-active-and-passive-reload.html
index c6d6a1b..35a56592 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-active-and-passive-reload.html
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-active-and-passive-reload.html
@@ -11,8 +11,20 @@
     InspectorTest.addResult("\nBefore Refresh --------------");
 
     var mixedExplanations = [
-        /** @type {!Protocol.Security.SecurityStateExplanation} */ ({"securityState": Protocol.Security.SecurityState.Neutral, "summary": "Neutral Test Summary", "description": "Neutral Test Description", mixedContentType: Protocol.Security.MixedContentType.OptionallyBlockable}),
-        /** @type {!Protocol.Security.SecurityStateExplanation} */ ({"securityState": Protocol.Security.SecurityState.Insecure, "summary": "Insecure Test Summary", "description": "Insecure Test Description", mixedContentType: Protocol.Security.MixedContentType.Blockable})
+        {
+            securityState: Protocol.Security.SecurityState.Neutral,
+            summary: "Neutral Test Summary",
+            description: "Neutral Test Description",
+            mixedContentType: Protocol.Security.MixedContentType.OptionallyBlockable,
+            certificate: []
+        },
+        {
+            securityState: Protocol.Security.SecurityState.Insecure,
+            summary: "Insecure Test Summary",
+            description: "Insecure Test Description",
+            mixedContentType: Protocol.Security.MixedContentType.Blockable,
+            certificate: []
+        }
     ];
     InspectorTest.mainTarget.model(Security.SecurityModel).dispatchEventToListeners(Security.SecurityModel.Events.SecurityStateChanged, new Security.PageSecurityState(Protocol.Security.SecurityState.Neutral, true, mixedExplanations, insecureContentStatus, null));
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-reload.html b/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-reload.html
index 8200b6e..b8ada9e 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-reload.html
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/security/mixed-content-reload.html
@@ -11,7 +11,13 @@
     InspectorTest.addResult("\nBefore Refresh --------------");
 
     var mixedExplanations = [
-        /** @type {!Protocol.Security.SecurityStateExplanation} */ ({"securityState": Protocol.Security.SecurityState.Neutral, "summary": "Neutral Test Summary", "description": "Neutral Test Description", mixedContentType: Protocol.Security.MixedContentType.OptionallyBlockable})
+        {
+            securityState: Protocol.Security.SecurityState.Neutral,
+            summary: "Neutral Test Summary",
+            description: "Neutral Test Description",
+            mixedContentType: Protocol.Security.MixedContentType.OptionallyBlockable,
+            certificate: []
+        }
     ];
     InspectorTest.mainTarget.model(Security.SecurityModel).dispatchEventToListeners(Security.SecurityModel.Events.SecurityStateChanged, new Security.PageSecurityState(Protocol.Security.SecurityState.Neutral, true, mixedExplanations, insecureContentStatus, null));
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/security/security-explanation-ordering.html b/third_party/WebKit/LayoutTests/http/tests/inspector/security/security-explanation-ordering.html
index d6d27070..cf1bcc219f 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/security/security-explanation-ordering.html
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/security/security-explanation-ordering.html
@@ -13,26 +13,28 @@
     // first to make sure it gets reordered.
     var explanations = [
         {
-            "description": "Public-key pinning was bypassed by a local root certificate.",
-            "securityState": "info",
-            "summary": "Public-Key Pinning Bypassed"
+            description: "Public-key pinning was bypassed by a local root certificate.",
+            securityState: "info",
+            summary: "Public-Key Pinning Bypassed",
+            certificate: []
         },
         {
-            "hasCertificate": "true",
-            "description": "The connection to this site is using a valid, trusted server certificate.",
-            "securityState": "secure",
-            "summary": "Valid Certificate"
+            description: "The connection to this site is using a valid, trusted server certificate.",
+            securityState: "secure",
+            summary: "Valid Certificate",
+            certificate: ["BASE64CERTIFICATE"]
         },
         {
-            "description": "The connection to this site uses a strong protocol (TLS 1.2), a strong key exchange (ECDHE_RSA), and an obsolete cipher (AES_256_CBC with HMAC-SHA1).",
-            "securityState": "secure",
-            "summary": "Obsolete Connection Settings"
-
+            description: "The connection to this site uses a strong protocol (TLS 1.2), a strong key exchange (ECDHE_RSA), and an obsolete cipher (AES_256_CBC with HMAC-SHA1).",
+            securityState: "secure",
+            summary: "Obsolete Connection Settings",
+            certificate: []
         },
         {
-            "description": "All resources on this page are served securely.",
-            "securityState": "secure",
-            "summary": "Secure resources"
+            description: "All resources on this page are served securely.",
+            securityState: "secure",
+            summary: "Secure resources",
+            certificate: []
         }
     ];
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-xsl-external-entity-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-xsl-external-entity-expected.txt
index 1d2a6fe..4ccb03e 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-xsl-external-entity-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/security/xss-DENIED-xsl-external-entity-expected.txt
@@ -2,7 +2,5 @@
 
 CONSOLE ERROR: Unsafe attempt to load URL http://localhost:8000/security/resources/target.xml from frame with URL http://127.0.0.1:8000/security/xss-DENIED-xsl-external-entity.xml. Domains, protocols and ports must match.
 
-CONSOLE ERROR: Unsafe attempt to load URL http://localhost:8000/security/resources/target.xml from frame with URL http://127.0.0.1:8000/security/xss-DENIED-xsl-external-entity.xml. Domains, protocols and ports must match.
-
 This test includes a cross-origin external entity. It passes if the load fails and thus there is no text below this line.
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/worklet/chromium/import-filesystem-url.html b/third_party/WebKit/LayoutTests/http/tests/worklet/chromium/import-filesystem-url.html
new file mode 100644
index 0000000..468c29d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/worklet/chromium/import-filesystem-url.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Worklet: addModule() for a filesystem URL</title>
+<body>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script>
+
+// This test should be in chromium/ because Filesystem API is implemented only
+// by Chromium.
+promise_test(() => {
+  return new Promise(resolve => {
+      const kSize = 100;
+      webkitRequestFileSystem(TEMPORARY, kSize, resolve, assert_unreached);
+    }).then(fs => {
+      return new Promise(resolve => {
+          fs.root.getFile('test.js', {create: true}, resolve, assert_unreached);
+        });
+    }).then(entry => {
+      return paintWorklet.addModule(entry.toURL());
+    }).then(() => {
+      assert_unreached('addModule should fail.');
+    }).catch(error => {
+      assert_equals(error.name, 'AbortError');
+    });
+}, 'Importing a filesystem URL should reject the given promise');
+
+</script>
+</body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/worklet/resources/import-tests.js b/third_party/WebKit/LayoutTests/http/tests/worklet/resources/import-tests.js
index a359d74..c74e7d5 100644
--- a/third_party/WebKit/LayoutTests/http/tests/worklet/resources/import-tests.js
+++ b/third_party/WebKit/LayoutTests/http/tests/worklet/resources/import-tests.js
@@ -53,5 +53,37 @@
         }).catch(function(error) {
             assert_equals(error.name, 'SyntaxError', 'error should be a SyntaxError.');
         });
-    }, 'Attempting to resolve an invalid URL should reject the given promise with a SyntaxError.');
+    }, 'Importing an invalid URL should reject the given promise with a SyntaxError.');
+
+    promise_test(() => {
+        const kBlob = new Blob([""], {type: 'text/javascript'});
+        const kBlobURL = URL.createObjectURL(kBlob);
+        return worklet.addModule(kBlobURL).then(undefined_arg => {
+            assert_equals(undefined_arg, undefined);
+        });
+    }, 'Importing a blob URL should resolve the given promise.');
+
+    promise_test(() => {
+        const kFileURL = 'file:///empty-worklet-script.js';
+        return worklet.addModule(kFileURL).then(undefined_arg => {
+            assert_unreached('addModule should fail.');
+        }).catch(function(error) {
+            assert_equals(error.name, 'AbortError');
+        });
+    }, 'Importing a file:// URL should reject the given promise.');
+
+    promise_test(() => {
+        const kDataURL = 'data:text/javascript, // Do nothing.';
+        return worklet.addModule(kDataURL).then(undefined_arg => {
+            assert_equals(undefined_arg, undefined);
+        });
+    }, 'Importing a data URL should resolve the given promise.');
+
+    promise_test(() => {
+        return worklet.addModule('about:blank').then(undefined_arg => {
+            assert_unreached('addModule should fail.');
+        }).catch(function(error) {
+            assert_equals(error.name, 'AbortError');
+        });
+    }, 'Importing about:blank should reject the given promise.');
 }
diff --git a/third_party/WebKit/LayoutTests/images/color-profile-image-canvas-expected.png b/third_party/WebKit/LayoutTests/images/color-profile-image-canvas-expected.png
index 218f124d..9303471c 100644
--- a/third_party/WebKit/LayoutTests/images/color-profile-image-canvas-expected.png
+++ b/third_party/WebKit/LayoutTests/images/color-profile-image-canvas-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/images/color-profile-image-canvas-pattern-expected.png b/third_party/WebKit/LayoutTests/images/color-profile-image-canvas-pattern-expected.png
index 6f07c20..74f6743e 100644
--- a/third_party/WebKit/LayoutTests/images/color-profile-image-canvas-pattern-expected.png
+++ b/third_party/WebKit/LayoutTests/images/color-profile-image-canvas-pattern-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/images/color-profile-munsell-adobe-to-srgb-expected.txt b/third_party/WebKit/LayoutTests/images/color-profile-munsell-adobe-to-srgb-expected.txt
index 44eb3b02..2361439 100644
--- a/third_party/WebKit/LayoutTests/images/color-profile-munsell-adobe-to-srgb-expected.txt
+++ b/third_party/WebKit/LayoutTests/images/color-profile-munsell-adobe-to-srgb-expected.txt
@@ -1,36 +1,36 @@
 
 Color         Actual        Expected      dE
 --------------------------------------------
-Dark Skin     114,80,64     115,80,64     1
-Light Skin    195,150,130   195,151,130   1
-Blue Sky      94,123,156    94,123,156    0
-Foliage       88,108,65     88,108,65     0
-Blue Flower   130,129,177   130,129,177   0
-Bluish Green  100,190,171   100,190,171   0
+Dark Skin     106,81,67     115,80,64     10
+Light Skin    182,149,130   195,151,130   13
+Blue Sky      103,122,154   94,123,156    9
+Foliage       95,108,69     88,108,65     8
+Blue Flower   129,128,174   130,129,177   3
+Bluish Green  133,189,170   100,190,171   33
 --------------------------------------------
-Orange        217,121,37    217,122,37    1
-Purplish Blue 72,90,166     72,91,165     1
-Moderate Red  194,84,97     194,84,98     1
-Purple        90,60,106     91,59,107     2
-Yellow Green  160,188,60    160,188,60    0
-Orange Yellow 231,163,42    230,163,42    1
+Orange        194,121,48    217,122,37    26
+Purplish Blue 79,91,162     72,91,165     8
+Moderate Red  170,85,97     194,84,98     24
+Purple        84,62,105     91,59,107     8
+Yellow Green  167,186,73    160,188,60    15
+Orange Yellow 213,162,57    230,163,42    23
 --------------------------------------------
-Blue          47,60,153     46,60,153     1
-Green         70,149,69     71,150,69     1
-Red           177,45,56     177,44,56     1
-Yellow        239,200,27    238,200,27    1
-Magenta       187,82,147    187,82,148    1
-Cyan (*)      0,135,166     0,135,166     0
+Blue          54,62,149     46,60,153     9
+Green         101,148,76    71,150,69     31
+Red           152,48,58     177,44,56     25
+Yellow        228,199,55    238,200,27    30
+Magenta       164,83,144    187,82,148    23
+Cyan (*)      63,134,163    0,135,166     63
 --------------------------------------------
-White         243,242,236   243,242,237   1
-Neutral 8     202,202,200   201,201,201   2
-Neutral 6.5   160,161,160   161,161,161   1
-Neutral 5     123,121,120   122,122,121   2
-Neutral 3.5   83,83,83      83,83,83      0
-Black         50,50,50      50,49,50      1
+White         242,241,236   243,242,237   2
+Neutral 8     200,200,199   201,201,201   2
+Neutral 6.5   159,160,159   161,161,161   3
+Neutral 5     122,121,120   122,122,121   1
+Neutral 3.5   84,84,84      83,83,83      2
+Black         53,53,53      50,49,50      6
 --------------------------------------------
 
-Result: total RMS color error: 1.04
+Result: total RMS color error: 21.18
  * Munsell Cyan is outside 255 sRGB gamut
 
   
diff --git a/third_party/WebKit/LayoutTests/images/exif-orientation-height-image-document-expected.png b/third_party/WebKit/LayoutTests/images/exif-orientation-height-image-document-expected.png
index cd52fb195..cdb6f4f5 100644
--- a/third_party/WebKit/LayoutTests/images/exif-orientation-height-image-document-expected.png
+++ b/third_party/WebKit/LayoutTests/images/exif-orientation-height-image-document-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/browser/browser-version-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/browser/browser-version-expected.txt
new file mode 100644
index 0000000..24247d8
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/browser/browser-version-expected.txt
@@ -0,0 +1,6 @@
+Verifies Browser.getVersion method.
+version.protocolVersion: OK
+version.revision: OK
+version.userAgent: OK
+version.jsVersion: OK
+
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/browser/browser-version.js b/third_party/WebKit/LayoutTests/inspector-protocol/browser/browser-version.js
new file mode 100644
index 0000000..4673acb
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/browser/browser-version.js
@@ -0,0 +1,14 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startBlank('Verifies Browser.getVersion method.');
+  var response = await dp.Browser.getVersion();
+  check('protocolVersion', /^\d+\.\d+$/); // e.g. 1.2
+  check('revision', /^@[0-9abcdef]+$/); // e.g. @7d9cc1464f836e6d8c1ab9396a48c656df153d58
+  check('userAgent', /^.+$/); // e.g. Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.77.34.5 Safari/537.36
+  check('jsVersion', /^.+$/); // e.g. 6.2.196
+  testRunner.completeTest();
+
+  function check(fieldName, regex) {
+    var status = regex.test(response.result[fieldName]) ? 'OK' : 'FAIL';
+    testRunner.log(`version.${fieldName}: ${status}`);
+  }
+})
diff --git a/third_party/WebKit/LayoutTests/media/color-profile-munsell-bt601-smpte-to-srgb-expected.txt b/third_party/WebKit/LayoutTests/media/color-profile-munsell-bt601-smpte-to-srgb-expected.txt
index 9b66622..1bd2930 100644
--- a/third_party/WebKit/LayoutTests/media/color-profile-munsell-bt601-smpte-to-srgb-expected.txt
+++ b/third_party/WebKit/LayoutTests/media/color-profile-munsell-bt601-smpte-to-srgb-expected.txt
@@ -1,41 +1,41 @@
 
 Color         Actual        Expected      dE
 --------------------------------------------
-Dark Skin     115,80,64     115,80,64     0
-Light Skin    195,151,130   195,151,130   0
-Blue Sky      93,123,156    94,123,156    1
-Foliage       88,108,65     88,108,65     0
-Blue Flower   130,128,177   130,129,177   1
-Bluish Green  100,190,171   100,190,171   0
+Dark Skin     104,64,49     115,80,64     25
+Light Skin    191,139,118   195,151,130   17
+Blue Sky      76,110,145    94,123,156    25
+Foliage       72,95,50      88,108,65     25
+Blue Flower   117,115,168   130,129,177   21
+Bluish Green  76,184,162    100,190,171   26
 --------------------------------------------
-Orange        217,122,37    217,122,37    0
-Purplish Blue 71,91,165     72,91,165     1
-Moderate Red  194,83,98     194,84,98     1
-Purple        90,59,107     91,59,107     1
-Yellow Green  160,188,60    160,188,60    0
-Orange Yellow 230,163,42    230,163,42    0
+Orange        218,107,23    217,122,37    21
+Purplish Blue 53,75,155     72,91,165     27
+Moderate Red  192,64,84     194,84,98     24
+Purple        77,41,93      91,59,107     27
+Yellow Green  149,182,46    160,188,60    19
+Orange Yellow 231,153,29    230,163,42    16
 --------------------------------------------
-Blue          47,60,153     46,60,153     1
-Green         71,150,69     71,150,69     0
-Red           177,44,56     177,44,56     0
-Yellow        238,200,27    238,200,27    0
-Magenta       187,82,148    187,82,148    0
-Cyan (*)      35,134,166    0,135,166     35
+Blue          27,41,142     46,60,153     29
+Green         47,141,54     71,150,69     30
+Red           174,19,41     177,44,56     29
+Yellow        239,194,17    238,200,27    12
+Magenta       184,61,137    187,82,148    24
+Cyan (*)      0,123,156     0,135,166     16
 --------------------------------------------
-White         243,242,237   243,242,237   0
-Neutral 8     201,201,201   201,201,201   0
-Neutral 6.5   161,161,161   161,161,161   0
-Neutral 5     122,122,121   122,122,121   0
-Neutral 3.5   83,83,83      83,83,83      0
-Black         50,49,50      50,49,50      0
+White         242,240,235   243,242,237   3
+Neutral 8     195,195,195   201,201,201   10
+Neutral 6.5   151,151,151   161,161,161   17
+Neutral 5     109,109,108   122,122,121   23
+Neutral 3.5   68,68,68      83,83,83      26
+Black         34,33,34      50,49,50      28
 --------------------------------------------
-SG White      237,237,237   237,237,237   0
-SG White 1/2  130,130,130   130,130,130   0
-SG White 1/4  74,74,74      74,74,74      0
-SG Black 4x   79,79,79      79,79,79      0
-SG Black 2x   48,48,48      48,48,48      0
-SG Black      32,32,32      31,31,31      2
+SG White      235,235,235   237,237,237   3
+SG White 1/2  118,118,118   130,130,130   21
+SG White 1/4  59,59,59      74,74,74      26
+SG Black 4x   64,64,64      79,79,79      26
+SG Black 2x   32,32,32      48,48,48      28
+SG Black      16,16,16      31,31,31      26
 --------------------------------------------
 
-Result: total RMS color error: 0.58
+Result: total RMS color error: 22.60
 
diff --git a/third_party/WebKit/LayoutTests/media/color-profile-munsell-bt709-to-srgb-expected.txt b/third_party/WebKit/LayoutTests/media/color-profile-munsell-bt709-to-srgb-expected.txt
index d34b900..54706fa9 100644
--- a/third_party/WebKit/LayoutTests/media/color-profile-munsell-bt709-to-srgb-expected.txt
+++ b/third_party/WebKit/LayoutTests/media/color-profile-munsell-bt709-to-srgb-expected.txt
@@ -1,41 +1,41 @@
 
 Color         Actual        Expected      dE
 --------------------------------------------
-Dark Skin     114,80,64     115,80,64     1
-Light Skin    195,151,129   195,151,130   1
-Blue Sky      93,123,155    94,123,156    1
-Foliage       88,108,65     88,108,65     0
-Blue Flower   129,128,177   130,129,177   1
-Bluish Green  100,190,171   100,190,171   0
+Dark Skin     101,65,48     115,80,64     26
+Light Skin    188,140,117   195,151,130   18
+Blue Sky      79,110,145    94,123,156    23
+Foliage       73,94,49      88,108,65     26
+Blue Flower   117,116,168   130,129,177   20
+Bluish Green  86,183,162    100,190,171   18
 --------------------------------------------
-Orange        218,122,37    217,122,37    1
-Purplish Blue 72,90,165     72,91,165     1
-Moderate Red  194,84,98     194,84,98     0
-Purple        90,59,107     91,59,107     1
-Yellow Green  160,188,60    160,188,60    0
-Orange Yellow 230,163,42    230,163,42    0
+Orange        213,109,21    217,122,37    21
+Purplish Blue 57,76,155     72,91,165     23
+Moderate Red  187,69,84     194,84,98     22
+Purple        76,43,93      91,59,107     26
+Yellow Green  150,180,44    160,188,60    20
+Orange Yellow 227,153,26    230,163,42    19
 --------------------------------------------
-Blue          46,60,153     46,60,153     0
-Green         71,150,68     71,150,69     1
-Red           177,44,56     177,44,56     0
-Yellow        238,200,28    238,200,27    1
-Magenta       187,82,148    187,82,148    0
-Cyan (*)      0,135,166     0,135,166     0
+Blue          30,44,142     46,60,153     25
+Green         56,139,53     71,150,69     25
+Red           168,28,40     177,44,56     24
+Yellow        236,194,13    238,200,27    15
+Magenta       179,67,137    187,82,148    20
+Cyan (*)      0,123,156     0,135,166     16
 --------------------------------------------
-White         244,242,237   243,242,237   1
-Neutral 8     201,201,201   201,201,201   0
-Neutral 6.5   161,161,161   161,161,161   0
-Neutral 5     122,122,121   122,122,121   0
-Neutral 3.5   83,83,83      83,83,83      0
-Black         50,49,50      50,49,50      0
+White         242,240,235   243,242,237   3
+Neutral 8     195,195,195   201,201,201   10
+Neutral 6.5   151,151,151   161,161,161   17
+Neutral 5     109,109,108   122,122,121   23
+Neutral 3.5   68,68,68      83,83,83      26
+Black         34,33,34      50,49,50      28
 --------------------------------------------
-SG White      237,237,237   237,237,237   0
-SG White 1/2  130,130,130   130,130,130   0
-SG White 1/4  74,74,74      74,74,74      0
-SG Black 4x   79,79,79      79,79,79      0
-SG Black 2x   48,48,48      48,48,48      0
-SG Black      32,32,32      31,31,31      2
+SG White      235,235,235   237,237,237   3
+SG White 1/2  118,118,118   130,130,130   21
+SG White 1/4  59,59,59      74,74,74      26
+SG Black 4x   64,64,64      79,79,79      26
+SG Black 2x   32,32,32      48,48,48      28
+SG Black      16,16,16      31,31,31      26
 --------------------------------------------
 
-Result: total RMS color error: 0.68
+Result: total RMS color error: 21.74
 
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/absolute-sized-document-no-scrollbars-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/absolute-sized-document-no-scrollbars-expected.txt
index df6f7c4..a01cdd3c 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/absolute-sized-document-no-scrollbars-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/absolute-sized-document-no-scrollbars-expected.txt
@@ -7,6 +7,11 @@
       "drawsContent": true,
       "paintInvalidations": [
         {
+          "object": "LayoutView #document",
+          "rect": [0, 0, 800, 600],
+          "reason": "style change"
+        },
+        {
           "object": "LayoutSVGRect rect",
           "rect": [0, 0, 576, 432],
           "reason": "style change"
@@ -26,6 +31,10 @@
   ],
   "objectPaintInvalidations": [
     {
+      "object": "LayoutView #document",
+      "reason": "style change"
+    },
+    {
       "object": "LayoutSVGRoot svg",
       "reason": "style change"
     },
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-document-scrollbars-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-document-scrollbars-expected.txt
index d8e84657..93d817a 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-document-scrollbars-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/svg/relative-sized-document-scrollbars-expected.txt
@@ -7,6 +7,11 @@
       "drawsContent": true,
       "paintInvalidations": [
         {
+          "object": "LayoutView #document",
+          "rect": [0, 0, 800, 600],
+          "reason": "style change"
+        },
+        {
           "object": "LayoutSVGRect rect",
           "rect": [6, 4, 788, 592],
           "reason": "style change"
@@ -21,6 +26,10 @@
   ],
   "objectPaintInvalidations": [
     {
+      "object": "LayoutView #document",
+      "reason": "style change"
+    },
+    {
       "object": "LayoutSVGRoot svg",
       "reason": "style change"
     },
diff --git a/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-transformed-expected.png b/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-transformed-expected.png
index d41092cd..e2bde95 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-transformed-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-transformed-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-transformed2-expected.png b/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-transformed2-expected.png
index b4cad73..1b3c400 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-transformed2-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/nested-reflection-transformed2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/reflection-in-composited-expected.png b/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/reflection-in-composited-expected.png
index 85b3331..d8e4bc4 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/reflection-in-composited-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/compositing/reflections/reflection-in-composited-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png
index a3f2569..028e3c1a 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-antialiasing-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-antialiasing-expected.png
index 2ce1d85..023729c 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-antialiasing-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-antialiasing-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-inner-bleed-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-inner-bleed-expected.png
index 0eab2bdf..cbb7d12 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-inner-bleed-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/borders/border-inner-bleed-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-composite-video-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-composite-video-expected.png
index 1795b005..55b60e3 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-composite-video-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-composite-video-shadow-expected.png
index 9b5c937..ebe81ec 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-composite-video-shadow-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png
deleted file mode 100644
index 836814b..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/image-object-in-canvas-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/image-object-in-canvas-expected.png
index fd50afb..b6a7f6c 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/image-object-in-canvas-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/canvas/image-object-in-canvas-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/css/transformed-mask-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/css/transformed-mask-expected.png
index cf3831d..e3b1a02 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/css/transformed-mask-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/css/transformed-mask-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/reflections/opacity-reflection-transform-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/reflections/opacity-reflection-transform-expected.png
index 4cb5bc6..80125af 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/reflections/opacity-reflection-transform-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/reflections/opacity-reflection-transform-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/linux/images/color-profile-munsell-adobe-to-srgb-expected.png
index 21c130b..2adc82b 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/images/color-profile-munsell-adobe-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/images/color-profile-munsell-adobe-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/linux/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png
index e16f4b04..8bb5a6a 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/media/color-profile-munsell-bt709-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/linux/media/color-profile-munsell-bt709-to-srgb-expected.png
index 1a26685..4de5fce 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/media/color-profile-munsell-bt709-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/media/color-profile-munsell-bt709-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png
index 41911ac..df8d472 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/filters/feTile-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/filters/feTile-expected.png
index 28a45a3..7f5d1c2 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/filters/feTile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/filters/feTile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/smallFonts-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/smallFonts-expected.png
index 4a6abd7..9baedf1 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/smallFonts-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/smallFonts-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textFeatures-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textFeatures-expected.png
index e7a2fb2..b1c7cef 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textFeatures-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textFeatures-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/focus-ring-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/focus-ring-expected.png
index 14da8c6e..b4534f5c 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/focus-ring-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/focus-ring-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/pattern-rotate-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/pattern-rotate-expected.png
index ecabe789..ada9f41 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/pattern-rotate-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/pattern-rotate-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/transformed-outlines-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/transformed-outlines-expected.png
index 16826b45..43fbe89 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/transformed-outlines-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/transformed-outlines-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/perf/004-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/perf/004-expected.png
index 4c5450f..0862b5ba7 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/perf/004-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/hixie/perf/004-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-inside-transformed-html-expected.png
index 998fed4..988c294e 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-inside-transformed-html-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-inside-transformed-html-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-with-svg-transform-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-with-svg-transform-expected.png
index d20544ae..0bdd37bb 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-with-svg-transform-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-pattern-with-svg-transform-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/transforms/transformed-document-element-expected.png b/third_party/WebKit/LayoutTests/platform/linux/transforms/transformed-document-element-expected.png
index f43c0d24..49c2a80 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/transforms/transformed-document-element-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/transforms/transformed-document-element-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png
index b0427cd..cf3e85646 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png
index 1795b005..55b60e3 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png
index 9b5c937..ebe81ec 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png
deleted file mode 100644
index ae68e7d6..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png
index d2e9d70bb..fc457708 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png
index 6cfbbb6..6055a34fa 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png
index c93f73f0..fd50afb 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png
index 2fe2e5e..b91cd46 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png
index cf97088..b3bf324 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt
index 792f6117..b18b8d79 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt
@@ -1,33 +1,4 @@
 This is a testharness.js-based test.
-FAIL ServiceWorkerGlobalScope: Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Request objects have a signal property assert_true: Signal member is present & truthy expected true got false
-FAIL ServiceWorkerGlobalScope: Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Readable stream synchronously cancels with AbortError if aborted before reading AbortController is not defined
+FAIL General fetch abort tests in a service worker Failed to register a ServiceWorker: The script does not have a MIME type.
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-sharedworker-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-sharedworker-expected.txt
new file mode 100644
index 0000000..d9b7c58
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-sharedworker-expected.txt
@@ -0,0 +1,52 @@
+This is a testharness.js-based test.
+FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's window is not null 
+FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors 
+FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - Bad mode init parameter value 
+PASS TypeError from request constructor takes priority - Bad credentials init parameter value 
+PASS TypeError from request constructor takes priority - Bad cache init parameter value 
+PASS TypeError from request constructor takes priority - Bad redirect init parameter value 
+FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false
+FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal state is cloned AbortController is not defined
+FAIL Clone aborts with original controller AbortController is not defined
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any-expected.txt
new file mode 100644
index 0000000..d9b7c58
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any-expected.txt
@@ -0,0 +1,52 @@
+This is a testharness.js-based test.
+FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's window is not null 
+FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors 
+FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - Bad mode init parameter value 
+PASS TypeError from request constructor takes priority - Bad credentials init parameter value 
+PASS TypeError from request constructor takes priority - Bad cache init parameter value 
+PASS TypeError from request constructor takes priority - Bad redirect init parameter value 
+FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false
+FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal state is cloned AbortController is not defined
+FAIL Clone aborts with original controller AbortController is not defined
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any.worker-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any.worker-expected.txt
new file mode 100644
index 0000000..d9b7c58
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any.worker-expected.txt
@@ -0,0 +1,52 @@
+This is a testharness.js-based test.
+FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's window is not null 
+FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors 
+FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - Bad mode init parameter value 
+PASS TypeError from request constructor takes priority - Bad credentials init parameter value 
+PASS TypeError from request constructor takes priority - Bad cache init parameter value 
+PASS TypeError from request constructor takes priority - Bad redirect init parameter value 
+FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false
+FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal state is cloned AbortController is not defined
+FAIL Clone aborts with original controller AbortController is not defined
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/request/request-error-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/request/request-error-expected.txt
new file mode 100644
index 0000000..697b78fd0
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/request/request-error-expected.txt
@@ -0,0 +1,25 @@
+This is a testharness.js-based test.
+FAIL RequestInit's window is not null assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+PASS Input URL is not valid 
+PASS Input URL has credentials 
+PASS RequestInit's mode is navigate 
+PASS RequestInit's referrer is invalid 
+PASS RequestInit's method is invalid 
+PASS RequestInit's method is forbidden 
+PASS RequestInit's mode is no-cors and method is not simple 
+PASS RequestInit's mode is no-cors and integrity is not empty 
+FAIL RequestInit's cache mode is only-if-cached and mode is not same-origin assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Request with cache mode: only-if-cached and fetch mode cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Request with cache mode: only-if-cached and fetch mode no-cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+PASS Bad referrerPolicy init parameter value 
+FAIL Bad mode init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Bad credentials init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Bad cache init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Bad redirect init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+PASS Request should get its content-type from the init request 
+PASS Request should not get its content-type from the init request if init headers are provided 
+PASS Request should get its content-type from the body if none is provided 
+PASS Request should get its content-type from init headers if one is provided 
+PASS Request with cache mode: only-if-cached and fetch mode: same-origin 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/request/request-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/request/request-idl-expected.txt
new file mode 100644
index 0000000..6835e7d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/request/request-idl-expected.txt
@@ -0,0 +1,50 @@
+This is a testharness.js-based test.
+PASS Request interface: existence and properties of interface object 
+PASS Request interface object length 
+PASS Request interface object name 
+PASS Request interface: existence and properties of interface prototype object 
+PASS Request interface: existence and properties of interface prototype object's "constructor" property 
+PASS Request interface: attribute method 
+PASS Request interface: attribute url 
+PASS Request interface: attribute headers 
+FAIL Request interface: attribute type assert_true: The prototype object must have a property "type" expected true got false
+FAIL Request interface: attribute destination assert_true: The prototype object must have a property "destination" expected true got false
+PASS Request interface: attribute referrer 
+PASS Request interface: attribute referrerPolicy 
+PASS Request interface: attribute mode 
+PASS Request interface: attribute credentials 
+PASS Request interface: attribute cache 
+PASS Request interface: attribute redirect 
+PASS Request interface: attribute integrity 
+PASS Request interface: operation clone() 
+FAIL Request interface: attribute body assert_true: The prototype object must have a property "body" expected true got false
+PASS Request interface: attribute bodyUsed 
+PASS Request interface: operation arrayBuffer() 
+PASS Request interface: operation blob() 
+PASS Request interface: operation formData() 
+PASS Request interface: operation json() 
+PASS Request interface: operation text() 
+PASS Request must be primary interface of new Request("") 
+PASS Stringification of new Request("") 
+PASS Request interface: new Request("") must inherit property "method" with the proper type 
+PASS Request interface: new Request("") must inherit property "url" with the proper type 
+PASS Request interface: new Request("") must inherit property "headers" with the proper type 
+FAIL Request interface: new Request("") must inherit property "type" with the proper type assert_inherits: property "type" not found in prototype chain
+FAIL Request interface: new Request("") must inherit property "destination" with the proper type assert_inherits: property "destination" not found in prototype chain
+PASS Request interface: new Request("") must inherit property "referrer" with the proper type 
+PASS Request interface: new Request("") must inherit property "referrerPolicy" with the proper type 
+PASS Request interface: new Request("") must inherit property "mode" with the proper type 
+PASS Request interface: new Request("") must inherit property "credentials" with the proper type 
+PASS Request interface: new Request("") must inherit property "cache" with the proper type 
+PASS Request interface: new Request("") must inherit property "redirect" with the proper type 
+PASS Request interface: new Request("") must inherit property "integrity" with the proper type 
+PASS Request interface: new Request("") must inherit property "clone()" with the proper type 
+FAIL Request interface: new Request("") must inherit property "body" with the proper type assert_inherits: property "body" not found in prototype chain
+PASS Request interface: new Request("") must inherit property "bodyUsed" with the proper type 
+PASS Request interface: new Request("") must inherit property "arrayBuffer()" with the proper type 
+PASS Request interface: new Request("") must inherit property "blob()" with the proper type 
+PASS Request interface: new Request("") must inherit property "formData()" with the proper type 
+PASS Request interface: new Request("") must inherit property "json()" with the proper type 
+PASS Request interface: new Request("") must inherit property "text()" with the proper type 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/response/response-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/response/response-idl-expected.txt
new file mode 100644
index 0000000..db7454c6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/fetch/api/response/response-idl-expected.txt
@@ -0,0 +1,45 @@
+This is a testharness.js-based test.
+PASS Response interface: existence and properties of interface object 
+PASS Response interface object length 
+PASS Response interface object name 
+PASS Response interface: existence and properties of interface prototype object 
+PASS Response interface: existence and properties of interface prototype object's "constructor" property 
+PASS Response interface: operation error() 
+PASS Response interface: operation redirect(USVString, unsigned short) 
+PASS Response interface: attribute type 
+PASS Response interface: attribute url 
+PASS Response interface: attribute status 
+PASS Response interface: attribute ok 
+PASS Response interface: attribute statusText 
+PASS Response interface: attribute headers 
+FAIL Response interface: attribute trailer assert_true: The prototype object must have a property "trailer" expected true got false
+PASS Response interface: operation clone() 
+PASS Response interface: attribute body 
+PASS Response interface: attribute bodyUsed 
+PASS Response interface: operation arrayBuffer() 
+PASS Response interface: operation blob() 
+PASS Response interface: operation formData() 
+PASS Response interface: operation json() 
+PASS Response interface: operation text() 
+PASS Response must be primary interface of new Response() 
+PASS Stringification of new Response() 
+PASS Response interface: new Response() must inherit property "error()" with the proper type 
+PASS Response interface: new Response() must inherit property "redirect(USVString, unsigned short)" with the proper type 
+PASS Response interface: calling redirect(USVString, unsigned short) on new Response() with too few arguments must throw TypeError 
+PASS Response interface: new Response() must inherit property "type" with the proper type 
+PASS Response interface: new Response() must inherit property "url" with the proper type 
+PASS Response interface: new Response() must inherit property "status" with the proper type 
+PASS Response interface: new Response() must inherit property "ok" with the proper type 
+PASS Response interface: new Response() must inherit property "statusText" with the proper type 
+PASS Response interface: new Response() must inherit property "headers" with the proper type 
+FAIL Response interface: new Response() must inherit property "trailer" with the proper type assert_inherits: property "trailer" not found in prototype chain
+PASS Response interface: new Response() must inherit property "clone()" with the proper type 
+PASS Response interface: new Response() must inherit property "body" with the proper type 
+PASS Response interface: new Response() must inherit property "bodyUsed" with the proper type 
+PASS Response interface: new Response() must inherit property "arrayBuffer()" with the proper type 
+PASS Response interface: new Response() must inherit property "blob()" with the proper type 
+PASS Response interface: new Response() must inherit property "formData()" with the proper type 
+PASS Response interface: new Response() must inherit property "json()" with the proper type 
+PASS Response interface: new Response() must inherit property "text()" with the proper type 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
new file mode 100644
index 0000000..b92d7aa
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,187 @@
+This is a testharness.js-based test.
+PASS Interfaces and attributes in ServiceWorkerGlobalScope 
+PASS test setup (cache creation) 
+PASS Event constructors 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface object 
+PASS ServiceWorkerGlobalScope interface object length 
+PASS ServiceWorkerGlobalScope interface object name 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Object.setPrototypeOf should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorkerGlobalScope interface: attribute clients 
+PASS ServiceWorkerGlobalScope interface: attribute registration 
+PASS ServiceWorkerGlobalScope interface: operation skipWaiting() 
+PASS ServiceWorkerGlobalScope interface: attribute oninstall 
+PASS ServiceWorkerGlobalScope interface: attribute onactivate 
+PASS ServiceWorkerGlobalScope interface: attribute onfetch 
+PASS ServiceWorkerGlobalScope interface: attribute onforeignfetch 
+PASS ServiceWorkerGlobalScope interface: attribute onmessage 
+FAIL ServiceWorkerGlobalScope interface: attribute onmessageerror assert_own_property: The global object must have a property "onmessageerror" expected property "onmessageerror" missing
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via __proto__ should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via __proto__ should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true 
+PASS ServiceWorkerGlobalScope must be primary interface of self 
+PASS Stringification of self 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "clients" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "registration" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "skipWaiting()" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "oninstall" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onactivate" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onfetch" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onforeignfetch" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type 
+FAIL ServiceWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type assert_own_property: expected property "onmessageerror" missing
+PASS Client interface: existence and properties of interface object 
+PASS Client interface object length 
+PASS Client interface object name 
+PASS Client interface: existence and properties of interface prototype object 
+PASS Client interface: existence and properties of interface prototype object's "constructor" property 
+PASS Client interface: attribute url 
+PASS Client interface: attribute id 
+PASS Client interface: attribute type 
+FAIL Client interface: attribute reserved assert_true: The prototype object must have a property "reserved" expected true got false
+PASS Client interface: operation postMessage(any, [object Object]) 
+PASS WindowClient interface: existence and properties of interface object 
+PASS WindowClient interface object length 
+PASS WindowClient interface object name 
+PASS WindowClient interface: existence and properties of interface prototype object 
+PASS WindowClient interface: existence and properties of interface prototype object's "constructor" property 
+PASS WindowClient interface: attribute visibilityState 
+PASS WindowClient interface: attribute focused 
+FAIL WindowClient interface: attribute ancestorOrigins assert_true: The prototype object must have a property "ancestorOrigins" expected true got false
+PASS WindowClient interface: operation focus() 
+PASS WindowClient interface: operation navigate(USVString) 
+PASS Clients interface: existence and properties of interface object 
+PASS Clients interface object length 
+PASS Clients interface object name 
+PASS Clients interface: existence and properties of interface prototype object 
+PASS Clients interface: existence and properties of interface prototype object's "constructor" property 
+PASS Clients interface: operation get(DOMString) 
+PASS Clients interface: operation matchAll(ClientQueryOptions) 
+PASS Clients interface: operation openWindow(USVString) 
+PASS Clients interface: operation claim() 
+PASS Clients must be primary interface of self.clients 
+PASS Stringification of self.clients 
+PASS Clients interface: self.clients must inherit property "get(DOMString)" with the proper type 
+PASS Clients interface: calling get(DOMString) on self.clients with too few arguments must throw TypeError 
+PASS Clients interface: self.clients must inherit property "matchAll(ClientQueryOptions)" with the proper type 
+PASS Clients interface: calling matchAll(ClientQueryOptions) on self.clients with too few arguments must throw TypeError 
+PASS Clients interface: self.clients must inherit property "openWindow(USVString)" with the proper type 
+PASS Clients interface: calling openWindow(USVString) on self.clients with too few arguments must throw TypeError 
+PASS Clients interface: self.clients must inherit property "claim()" with the proper type 
+FAIL ServiceWorker interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface object length assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface object name assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: attribute scriptURL assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: attribute state assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: operation postMessage(any, [object Object]) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: attribute onstatechange assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+PASS ServiceWorkerRegistration interface: existence and properties of interface object 
+PASS ServiceWorkerRegistration interface object length 
+PASS ServiceWorkerRegistration interface object name 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorkerRegistration interface: attribute installing 
+PASS ServiceWorkerRegistration interface: attribute waiting 
+PASS ServiceWorkerRegistration interface: attribute active 
+PASS ServiceWorkerRegistration interface: attribute navigationPreload 
+PASS ServiceWorkerRegistration interface: attribute scope 
+FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false
+PASS ServiceWorkerRegistration interface: operation update() 
+PASS ServiceWorkerRegistration interface: operation unregister() 
+PASS ServiceWorkerRegistration interface: attribute onupdatefound 
+PASS ServiceWorkerRegistration must be primary interface of self.registration 
+PASS Stringification of self.registration 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "installing" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "waiting" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "active" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "navigationPreload" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "scope" with the proper type 
+FAIL ServiceWorkerRegistration interface: self.registration must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "update()" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "unregister()" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "onupdatefound" with the proper type 
+PASS EventTarget interface: self.registration must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError 
+PASS EventTarget interface: self.registration must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError 
+PASS EventTarget interface: self.registration must inherit property "dispatchEvent(Event)" with the proper type 
+PASS EventTarget interface: calling dispatchEvent(Event) on self.registration 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 
+PASS EventTarget interface: existence and properties of interface prototype object 
+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 NavigationPreloadManager interface: existence and properties of interface object 
+PASS NavigationPreloadManager interface object length 
+PASS NavigationPreloadManager interface object name 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property 
+PASS NavigationPreloadManager interface: operation enable() 
+PASS NavigationPreloadManager interface: operation disable() 
+PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) 
+PASS NavigationPreloadManager interface: operation getState() 
+PASS Cache interface: existence and properties of interface object 
+PASS Cache interface object length 
+PASS Cache interface object name 
+PASS Cache interface: existence and properties of interface prototype object 
+PASS Cache interface: existence and properties of interface prototype object's "constructor" property 
+PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation add(RequestInfo) 
+PASS Cache interface: operation addAll([object Object]) 
+PASS Cache interface: operation put(RequestInfo, Response) 
+PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) 
+PASS Cache must be primary interface of self.cacheInstance 
+PASS Stringification of self.cacheInstance 
+PASS Cache interface: self.cacheInstance must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling match(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "matchAll(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling matchAll(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "add(RequestInfo)" with the proper type 
+PASS Cache interface: calling add(RequestInfo) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "addAll([object Object])" with the proper type 
+PASS Cache interface: calling addAll([object Object]) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "put(RequestInfo, Response)" with the proper type 
+PASS Cache interface: calling put(RequestInfo, Response) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "delete(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling delete(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "keys(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling keys(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS CacheStorage interface: existence and properties of interface object 
+PASS CacheStorage interface object length 
+PASS CacheStorage interface object name 
+PASS CacheStorage interface: existence and properties of interface prototype object 
+PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property 
+PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS CacheStorage interface: operation has(DOMString) 
+PASS CacheStorage interface: operation open(DOMString) 
+PASS CacheStorage interface: operation delete(DOMString) 
+PASS CacheStorage interface: operation keys() 
+PASS CacheStorage must be primary interface of self.caches 
+PASS Stringification of self.caches 
+PASS CacheStorage interface: self.caches must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS CacheStorage interface: calling match(RequestInfo, CacheQueryOptions) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "has(DOMString)" with the proper type 
+PASS CacheStorage interface: calling has(DOMString) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "open(DOMString)" with the proper type 
+PASS CacheStorage interface: calling open(DOMString) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "delete(DOMString)" with the proper type 
+PASS CacheStorage interface: calling delete(DOMString) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "keys()" with the proper type 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
new file mode 100644
index 0000000..c9f3ca90
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
@@ -0,0 +1,101 @@
+This is a testharness.js-based test.
+PASS test setup (worker registration) 
+PASS WorkerGlobalScope interface: existence and properties of interface object 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface object 
+PASS Client interface: existence and properties of interface object 
+PASS WindowClient interface: existence and properties of interface object 
+PASS Clients interface: existence and properties of interface object 
+PASS ServiceWorker interface: existence and properties of interface object 
+PASS ServiceWorker interface object length 
+PASS ServiceWorker interface object name 
+PASS ServiceWorker interface: existence and properties of interface prototype object 
+PASS ServiceWorker interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorker interface: attribute scriptURL 
+PASS ServiceWorker interface: attribute state 
+PASS ServiceWorker interface: operation postMessage(any, [object Object]) 
+PASS ServiceWorker interface: attribute onstatechange 
+PASS ServiceWorker must be primary interface of window.registrationInstance.installing 
+PASS Stringification of window.registrationInstance.installing 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "scriptURL" with the proper type 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "state" with the proper type 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "postMessage(any, [object Object])" with the proper type 
+PASS ServiceWorker interface: calling postMessage(any, [object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "onstatechange" with the proper type 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "dispatchEvent(Event)" with the proper type 
+PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS ServiceWorkerRegistration interface: existence and properties of interface object 
+PASS ServiceWorkerRegistration interface object length 
+PASS ServiceWorkerRegistration interface object name 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorkerRegistration interface: attribute installing 
+PASS ServiceWorkerRegistration interface: attribute waiting 
+PASS ServiceWorkerRegistration interface: attribute active 
+PASS ServiceWorkerRegistration interface: attribute navigationPreload 
+PASS ServiceWorkerRegistration interface: attribute scope 
+FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false
+PASS ServiceWorkerRegistration interface: operation update() 
+PASS ServiceWorkerRegistration interface: operation unregister() 
+PASS ServiceWorkerRegistration interface: attribute onupdatefound 
+PASS ServiceWorkerRegistration must be primary interface of window.registrationInstance 
+PASS Stringification of window.registrationInstance 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "installing" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "waiting" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "active" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "navigationPreload" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "scope" with the proper type 
+FAIL ServiceWorkerRegistration interface: window.registrationInstance must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "update()" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "unregister()" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "onupdatefound" with the proper type 
+PASS EventTarget interface: window.registrationInstance must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance must inherit property "dispatchEvent(Event)" with the proper type 
+PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance 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 
+PASS EventTarget interface: existence and properties of interface prototype object 
+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 NavigationPreloadManager interface: existence and properties of interface object 
+PASS NavigationPreloadManager interface object length 
+PASS NavigationPreloadManager interface object name 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property 
+PASS NavigationPreloadManager interface: operation enable() 
+PASS NavigationPreloadManager interface: operation disable() 
+PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) 
+PASS NavigationPreloadManager interface: operation getState() 
+PASS Cache interface: existence and properties of interface object 
+PASS Cache interface object length 
+PASS Cache interface object name 
+PASS Cache interface: existence and properties of interface prototype object 
+PASS Cache interface: existence and properties of interface prototype object's "constructor" property 
+PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation add(RequestInfo) 
+PASS Cache interface: operation addAll([object Object]) 
+PASS Cache interface: operation put(RequestInfo, Response) 
+PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) 
+PASS CacheStorage interface: existence and properties of interface object 
+PASS CacheStorage interface object length 
+PASS CacheStorage interface object name 
+PASS CacheStorage interface: existence and properties of interface prototype object 
+PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property 
+PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS CacheStorage interface: operation has(DOMString) 
+PASS CacheStorage interface: operation open(DOMString) 
+PASS CacheStorage interface: operation delete(DOMString) 
+PASS CacheStorage interface: operation keys() 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-localstorage/external/wpt/webstorage/idlharness-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-localstorage/external/wpt/webstorage/idlharness-expected.txt
new file mode 100644
index 0000000..4b5ce02
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/mojo-localstorage/external/wpt/webstorage/idlharness-expected.txt
@@ -0,0 +1,38 @@
+This is a testharness.js-based test.
+PASS Window interface: attribute sessionStorage 
+PASS Window interface: attribute localStorage 
+PASS Storage interface: existence and properties of interface object 
+PASS Storage interface object length 
+PASS Storage interface object name 
+PASS Storage interface: existence and properties of interface prototype object 
+PASS Storage interface: existence and properties of interface prototype object's "constructor" property 
+FAIL Storage interface: attribute length assert_true: property should be enumerable expected true got false
+FAIL Storage interface: operation key(unsigned long) assert_true: property should be enumerable expected true got false
+FAIL Storage interface: operation getItem(DOMString) assert_true: property should be enumerable expected true got false
+FAIL Storage interface: operation setItem(DOMString, DOMString) assert_true: property should be enumerable expected true got false
+FAIL Storage interface: operation removeItem(DOMString) assert_true: property should be enumerable expected true got false
+FAIL Storage interface: operation clear() assert_true: property should be enumerable expected true got false
+PASS Storage must be primary interface of window.localStorage 
+PASS Stringification of window.localStorage 
+PASS Storage interface: window.localStorage must inherit property "length" with the proper type 
+PASS Storage interface: window.localStorage must inherit property "key(unsigned long)" with the proper type 
+PASS Storage interface: calling key(unsigned long) on window.localStorage with too few arguments must throw TypeError 
+PASS Storage interface: window.localStorage must inherit property "getItem(DOMString)" with the proper type 
+PASS Storage interface: calling getItem(DOMString) on window.localStorage with too few arguments must throw TypeError 
+PASS Storage interface: window.localStorage must inherit property "setItem(DOMString, DOMString)" with the proper type 
+PASS Storage interface: calling setItem(DOMString, DOMString) on window.localStorage with too few arguments must throw TypeError 
+PASS Storage interface: window.localStorage must inherit property "removeItem(DOMString)" with the proper type 
+PASS Storage interface: calling removeItem(DOMString) on window.localStorage with too few arguments must throw TypeError 
+PASS Storage interface: window.localStorage must inherit property "clear()" with the proper type 
+PASS StorageEvent interface: existence and properties of interface object 
+PASS StorageEvent interface object length 
+PASS StorageEvent interface object name 
+PASS StorageEvent interface: existence and properties of interface prototype object 
+PASS StorageEvent interface: existence and properties of interface prototype object's "constructor" property 
+PASS StorageEvent interface: attribute key 
+PASS StorageEvent interface: attribute oldValue 
+PASS StorageEvent interface: attribute newValue 
+PASS StorageEvent interface: attribute url 
+PASS StorageEvent interface: attribute storageArea 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
new file mode 100644
index 0000000..b92d7aa
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,187 @@
+This is a testharness.js-based test.
+PASS Interfaces and attributes in ServiceWorkerGlobalScope 
+PASS test setup (cache creation) 
+PASS Event constructors 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface object 
+PASS ServiceWorkerGlobalScope interface object length 
+PASS ServiceWorkerGlobalScope interface object name 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Object.setPrototypeOf should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorkerGlobalScope interface: attribute clients 
+PASS ServiceWorkerGlobalScope interface: attribute registration 
+PASS ServiceWorkerGlobalScope interface: operation skipWaiting() 
+PASS ServiceWorkerGlobalScope interface: attribute oninstall 
+PASS ServiceWorkerGlobalScope interface: attribute onactivate 
+PASS ServiceWorkerGlobalScope interface: attribute onfetch 
+PASS ServiceWorkerGlobalScope interface: attribute onforeignfetch 
+PASS ServiceWorkerGlobalScope interface: attribute onmessage 
+FAIL ServiceWorkerGlobalScope interface: attribute onmessageerror assert_own_property: The global object must have a property "onmessageerror" expected property "onmessageerror" missing
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via __proto__ should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via __proto__ should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true 
+PASS ServiceWorkerGlobalScope must be primary interface of self 
+PASS Stringification of self 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "clients" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "registration" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "skipWaiting()" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "oninstall" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onactivate" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onfetch" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onforeignfetch" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type 
+FAIL ServiceWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type assert_own_property: expected property "onmessageerror" missing
+PASS Client interface: existence and properties of interface object 
+PASS Client interface object length 
+PASS Client interface object name 
+PASS Client interface: existence and properties of interface prototype object 
+PASS Client interface: existence and properties of interface prototype object's "constructor" property 
+PASS Client interface: attribute url 
+PASS Client interface: attribute id 
+PASS Client interface: attribute type 
+FAIL Client interface: attribute reserved assert_true: The prototype object must have a property "reserved" expected true got false
+PASS Client interface: operation postMessage(any, [object Object]) 
+PASS WindowClient interface: existence and properties of interface object 
+PASS WindowClient interface object length 
+PASS WindowClient interface object name 
+PASS WindowClient interface: existence and properties of interface prototype object 
+PASS WindowClient interface: existence and properties of interface prototype object's "constructor" property 
+PASS WindowClient interface: attribute visibilityState 
+PASS WindowClient interface: attribute focused 
+FAIL WindowClient interface: attribute ancestorOrigins assert_true: The prototype object must have a property "ancestorOrigins" expected true got false
+PASS WindowClient interface: operation focus() 
+PASS WindowClient interface: operation navigate(USVString) 
+PASS Clients interface: existence and properties of interface object 
+PASS Clients interface object length 
+PASS Clients interface object name 
+PASS Clients interface: existence and properties of interface prototype object 
+PASS Clients interface: existence and properties of interface prototype object's "constructor" property 
+PASS Clients interface: operation get(DOMString) 
+PASS Clients interface: operation matchAll(ClientQueryOptions) 
+PASS Clients interface: operation openWindow(USVString) 
+PASS Clients interface: operation claim() 
+PASS Clients must be primary interface of self.clients 
+PASS Stringification of self.clients 
+PASS Clients interface: self.clients must inherit property "get(DOMString)" with the proper type 
+PASS Clients interface: calling get(DOMString) on self.clients with too few arguments must throw TypeError 
+PASS Clients interface: self.clients must inherit property "matchAll(ClientQueryOptions)" with the proper type 
+PASS Clients interface: calling matchAll(ClientQueryOptions) on self.clients with too few arguments must throw TypeError 
+PASS Clients interface: self.clients must inherit property "openWindow(USVString)" with the proper type 
+PASS Clients interface: calling openWindow(USVString) on self.clients with too few arguments must throw TypeError 
+PASS Clients interface: self.clients must inherit property "claim()" with the proper type 
+FAIL ServiceWorker interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface object length assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface object name assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: attribute scriptURL assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: attribute state assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: operation postMessage(any, [object Object]) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: attribute onstatechange assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+PASS ServiceWorkerRegistration interface: existence and properties of interface object 
+PASS ServiceWorkerRegistration interface object length 
+PASS ServiceWorkerRegistration interface object name 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorkerRegistration interface: attribute installing 
+PASS ServiceWorkerRegistration interface: attribute waiting 
+PASS ServiceWorkerRegistration interface: attribute active 
+PASS ServiceWorkerRegistration interface: attribute navigationPreload 
+PASS ServiceWorkerRegistration interface: attribute scope 
+FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false
+PASS ServiceWorkerRegistration interface: operation update() 
+PASS ServiceWorkerRegistration interface: operation unregister() 
+PASS ServiceWorkerRegistration interface: attribute onupdatefound 
+PASS ServiceWorkerRegistration must be primary interface of self.registration 
+PASS Stringification of self.registration 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "installing" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "waiting" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "active" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "navigationPreload" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "scope" with the proper type 
+FAIL ServiceWorkerRegistration interface: self.registration must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "update()" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "unregister()" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "onupdatefound" with the proper type 
+PASS EventTarget interface: self.registration must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError 
+PASS EventTarget interface: self.registration must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError 
+PASS EventTarget interface: self.registration must inherit property "dispatchEvent(Event)" with the proper type 
+PASS EventTarget interface: calling dispatchEvent(Event) on self.registration 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 
+PASS EventTarget interface: existence and properties of interface prototype object 
+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 NavigationPreloadManager interface: existence and properties of interface object 
+PASS NavigationPreloadManager interface object length 
+PASS NavigationPreloadManager interface object name 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property 
+PASS NavigationPreloadManager interface: operation enable() 
+PASS NavigationPreloadManager interface: operation disable() 
+PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) 
+PASS NavigationPreloadManager interface: operation getState() 
+PASS Cache interface: existence and properties of interface object 
+PASS Cache interface object length 
+PASS Cache interface object name 
+PASS Cache interface: existence and properties of interface prototype object 
+PASS Cache interface: existence and properties of interface prototype object's "constructor" property 
+PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation add(RequestInfo) 
+PASS Cache interface: operation addAll([object Object]) 
+PASS Cache interface: operation put(RequestInfo, Response) 
+PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) 
+PASS Cache must be primary interface of self.cacheInstance 
+PASS Stringification of self.cacheInstance 
+PASS Cache interface: self.cacheInstance must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling match(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "matchAll(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling matchAll(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "add(RequestInfo)" with the proper type 
+PASS Cache interface: calling add(RequestInfo) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "addAll([object Object])" with the proper type 
+PASS Cache interface: calling addAll([object Object]) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "put(RequestInfo, Response)" with the proper type 
+PASS Cache interface: calling put(RequestInfo, Response) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "delete(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling delete(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "keys(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling keys(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS CacheStorage interface: existence and properties of interface object 
+PASS CacheStorage interface object length 
+PASS CacheStorage interface object name 
+PASS CacheStorage interface: existence and properties of interface prototype object 
+PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property 
+PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS CacheStorage interface: operation has(DOMString) 
+PASS CacheStorage interface: operation open(DOMString) 
+PASS CacheStorage interface: operation delete(DOMString) 
+PASS CacheStorage interface: operation keys() 
+PASS CacheStorage must be primary interface of self.caches 
+PASS Stringification of self.caches 
+PASS CacheStorage interface: self.caches must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS CacheStorage interface: calling match(RequestInfo, CacheQueryOptions) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "has(DOMString)" with the proper type 
+PASS CacheStorage interface: calling has(DOMString) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "open(DOMString)" with the proper type 
+PASS CacheStorage interface: calling open(DOMString) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "delete(DOMString)" with the proper type 
+PASS CacheStorage interface: calling delete(DOMString) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "keys()" with the proper type 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
new file mode 100644
index 0000000..c9f3ca90
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
@@ -0,0 +1,101 @@
+This is a testharness.js-based test.
+PASS test setup (worker registration) 
+PASS WorkerGlobalScope interface: existence and properties of interface object 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface object 
+PASS Client interface: existence and properties of interface object 
+PASS WindowClient interface: existence and properties of interface object 
+PASS Clients interface: existence and properties of interface object 
+PASS ServiceWorker interface: existence and properties of interface object 
+PASS ServiceWorker interface object length 
+PASS ServiceWorker interface object name 
+PASS ServiceWorker interface: existence and properties of interface prototype object 
+PASS ServiceWorker interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorker interface: attribute scriptURL 
+PASS ServiceWorker interface: attribute state 
+PASS ServiceWorker interface: operation postMessage(any, [object Object]) 
+PASS ServiceWorker interface: attribute onstatechange 
+PASS ServiceWorker must be primary interface of window.registrationInstance.installing 
+PASS Stringification of window.registrationInstance.installing 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "scriptURL" with the proper type 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "state" with the proper type 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "postMessage(any, [object Object])" with the proper type 
+PASS ServiceWorker interface: calling postMessage(any, [object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "onstatechange" with the proper type 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "dispatchEvent(Event)" with the proper type 
+PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS ServiceWorkerRegistration interface: existence and properties of interface object 
+PASS ServiceWorkerRegistration interface object length 
+PASS ServiceWorkerRegistration interface object name 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorkerRegistration interface: attribute installing 
+PASS ServiceWorkerRegistration interface: attribute waiting 
+PASS ServiceWorkerRegistration interface: attribute active 
+PASS ServiceWorkerRegistration interface: attribute navigationPreload 
+PASS ServiceWorkerRegistration interface: attribute scope 
+FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false
+PASS ServiceWorkerRegistration interface: operation update() 
+PASS ServiceWorkerRegistration interface: operation unregister() 
+PASS ServiceWorkerRegistration interface: attribute onupdatefound 
+PASS ServiceWorkerRegistration must be primary interface of window.registrationInstance 
+PASS Stringification of window.registrationInstance 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "installing" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "waiting" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "active" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "navigationPreload" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "scope" with the proper type 
+FAIL ServiceWorkerRegistration interface: window.registrationInstance must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "update()" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "unregister()" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "onupdatefound" with the proper type 
+PASS EventTarget interface: window.registrationInstance must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance must inherit property "dispatchEvent(Event)" with the proper type 
+PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance 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 
+PASS EventTarget interface: existence and properties of interface prototype object 
+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 NavigationPreloadManager interface: existence and properties of interface object 
+PASS NavigationPreloadManager interface object length 
+PASS NavigationPreloadManager interface object name 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property 
+PASS NavigationPreloadManager interface: operation enable() 
+PASS NavigationPreloadManager interface: operation disable() 
+PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) 
+PASS NavigationPreloadManager interface: operation getState() 
+PASS Cache interface: existence and properties of interface object 
+PASS Cache interface object length 
+PASS Cache interface object name 
+PASS Cache interface: existence and properties of interface prototype object 
+PASS Cache interface: existence and properties of interface prototype object's "constructor" property 
+PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation add(RequestInfo) 
+PASS Cache interface: operation addAll([object Object]) 
+PASS Cache interface: operation put(RequestInfo, Response) 
+PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) 
+PASS CacheStorage interface: existence and properties of interface object 
+PASS CacheStorage interface object length 
+PASS CacheStorage interface object name 
+PASS CacheStorage interface: existence and properties of interface prototype object 
+PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property 
+PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS CacheStorage interface: operation has(DOMString) 
+PASS CacheStorage interface: operation open(DOMString) 
+PASS CacheStorage interface: operation delete(DOMString) 
+PASS CacheStorage interface: operation keys() 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt
new file mode 100644
index 0000000..b18b8d79
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL General fetch abort tests in a service worker Failed to register a ServiceWorker: The script does not have a MIME type.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-sharedworker-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-sharedworker-expected.txt
new file mode 100644
index 0000000..d9b7c58
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-sharedworker-expected.txt
@@ -0,0 +1,52 @@
+This is a testharness.js-based test.
+FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's window is not null 
+FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors 
+FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - Bad mode init parameter value 
+PASS TypeError from request constructor takes priority - Bad credentials init parameter value 
+PASS TypeError from request constructor takes priority - Bad cache init parameter value 
+PASS TypeError from request constructor takes priority - Bad redirect init parameter value 
+FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false
+FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal state is cloned AbortController is not defined
+FAIL Clone aborts with original controller AbortController is not defined
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any-expected.txt
new file mode 100644
index 0000000..d9b7c58
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any-expected.txt
@@ -0,0 +1,52 @@
+This is a testharness.js-based test.
+FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's window is not null 
+FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors 
+FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - Bad mode init parameter value 
+PASS TypeError from request constructor takes priority - Bad credentials init parameter value 
+PASS TypeError from request constructor takes priority - Bad cache init parameter value 
+PASS TypeError from request constructor takes priority - Bad redirect init parameter value 
+FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false
+FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal state is cloned AbortController is not defined
+FAIL Clone aborts with original controller AbortController is not defined
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any.worker-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any.worker-expected.txt
new file mode 100644
index 0000000..d9b7c58
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any.worker-expected.txt
@@ -0,0 +1,52 @@
+This is a testharness.js-based test.
+FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's window is not null 
+FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors 
+FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - Bad mode init parameter value 
+PASS TypeError from request constructor takes priority - Bad credentials init parameter value 
+PASS TypeError from request constructor takes priority - Bad cache init parameter value 
+PASS TypeError from request constructor takes priority - Bad redirect init parameter value 
+FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false
+FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal state is cloned AbortController is not defined
+FAIL Clone aborts with original controller AbortController is not defined
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/request/request-error-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/request/request-error-expected.txt
new file mode 100644
index 0000000..697b78fd0
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/request/request-error-expected.txt
@@ -0,0 +1,25 @@
+This is a testharness.js-based test.
+FAIL RequestInit's window is not null assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+PASS Input URL is not valid 
+PASS Input URL has credentials 
+PASS RequestInit's mode is navigate 
+PASS RequestInit's referrer is invalid 
+PASS RequestInit's method is invalid 
+PASS RequestInit's method is forbidden 
+PASS RequestInit's mode is no-cors and method is not simple 
+PASS RequestInit's mode is no-cors and integrity is not empty 
+FAIL RequestInit's cache mode is only-if-cached and mode is not same-origin assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Request with cache mode: only-if-cached and fetch mode cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Request with cache mode: only-if-cached and fetch mode no-cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+PASS Bad referrerPolicy init parameter value 
+FAIL Bad mode init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Bad credentials init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Bad cache init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Bad redirect init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+PASS Request should get its content-type from the init request 
+PASS Request should not get its content-type from the init request if init headers are provided 
+PASS Request should get its content-type from the body if none is provided 
+PASS Request should get its content-type from init headers if one is provided 
+PASS Request with cache mode: only-if-cached and fetch mode: same-origin 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/request/request-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/request/request-idl-expected.txt
new file mode 100644
index 0000000..6835e7d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/request/request-idl-expected.txt
@@ -0,0 +1,50 @@
+This is a testharness.js-based test.
+PASS Request interface: existence and properties of interface object 
+PASS Request interface object length 
+PASS Request interface object name 
+PASS Request interface: existence and properties of interface prototype object 
+PASS Request interface: existence and properties of interface prototype object's "constructor" property 
+PASS Request interface: attribute method 
+PASS Request interface: attribute url 
+PASS Request interface: attribute headers 
+FAIL Request interface: attribute type assert_true: The prototype object must have a property "type" expected true got false
+FAIL Request interface: attribute destination assert_true: The prototype object must have a property "destination" expected true got false
+PASS Request interface: attribute referrer 
+PASS Request interface: attribute referrerPolicy 
+PASS Request interface: attribute mode 
+PASS Request interface: attribute credentials 
+PASS Request interface: attribute cache 
+PASS Request interface: attribute redirect 
+PASS Request interface: attribute integrity 
+PASS Request interface: operation clone() 
+FAIL Request interface: attribute body assert_true: The prototype object must have a property "body" expected true got false
+PASS Request interface: attribute bodyUsed 
+PASS Request interface: operation arrayBuffer() 
+PASS Request interface: operation blob() 
+PASS Request interface: operation formData() 
+PASS Request interface: operation json() 
+PASS Request interface: operation text() 
+PASS Request must be primary interface of new Request("") 
+PASS Stringification of new Request("") 
+PASS Request interface: new Request("") must inherit property "method" with the proper type 
+PASS Request interface: new Request("") must inherit property "url" with the proper type 
+PASS Request interface: new Request("") must inherit property "headers" with the proper type 
+FAIL Request interface: new Request("") must inherit property "type" with the proper type assert_inherits: property "type" not found in prototype chain
+FAIL Request interface: new Request("") must inherit property "destination" with the proper type assert_inherits: property "destination" not found in prototype chain
+PASS Request interface: new Request("") must inherit property "referrer" with the proper type 
+PASS Request interface: new Request("") must inherit property "referrerPolicy" with the proper type 
+PASS Request interface: new Request("") must inherit property "mode" with the proper type 
+PASS Request interface: new Request("") must inherit property "credentials" with the proper type 
+PASS Request interface: new Request("") must inherit property "cache" with the proper type 
+PASS Request interface: new Request("") must inherit property "redirect" with the proper type 
+PASS Request interface: new Request("") must inherit property "integrity" with the proper type 
+PASS Request interface: new Request("") must inherit property "clone()" with the proper type 
+FAIL Request interface: new Request("") must inherit property "body" with the proper type assert_inherits: property "body" not found in prototype chain
+PASS Request interface: new Request("") must inherit property "bodyUsed" with the proper type 
+PASS Request interface: new Request("") must inherit property "arrayBuffer()" with the proper type 
+PASS Request interface: new Request("") must inherit property "blob()" with the proper type 
+PASS Request interface: new Request("") must inherit property "formData()" with the proper type 
+PASS Request interface: new Request("") must inherit property "json()" with the proper type 
+PASS Request interface: new Request("") must inherit property "text()" with the proper type 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/response/response-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/response/response-idl-expected.txt
new file mode 100644
index 0000000..db7454c6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/outofblink-cors/external/wpt/fetch/api/response/response-idl-expected.txt
@@ -0,0 +1,45 @@
+This is a testharness.js-based test.
+PASS Response interface: existence and properties of interface object 
+PASS Response interface object length 
+PASS Response interface object name 
+PASS Response interface: existence and properties of interface prototype object 
+PASS Response interface: existence and properties of interface prototype object's "constructor" property 
+PASS Response interface: operation error() 
+PASS Response interface: operation redirect(USVString, unsigned short) 
+PASS Response interface: attribute type 
+PASS Response interface: attribute url 
+PASS Response interface: attribute status 
+PASS Response interface: attribute ok 
+PASS Response interface: attribute statusText 
+PASS Response interface: attribute headers 
+FAIL Response interface: attribute trailer assert_true: The prototype object must have a property "trailer" expected true got false
+PASS Response interface: operation clone() 
+PASS Response interface: attribute body 
+PASS Response interface: attribute bodyUsed 
+PASS Response interface: operation arrayBuffer() 
+PASS Response interface: operation blob() 
+PASS Response interface: operation formData() 
+PASS Response interface: operation json() 
+PASS Response interface: operation text() 
+PASS Response must be primary interface of new Response() 
+PASS Stringification of new Response() 
+PASS Response interface: new Response() must inherit property "error()" with the proper type 
+PASS Response interface: new Response() must inherit property "redirect(USVString, unsigned short)" with the proper type 
+PASS Response interface: calling redirect(USVString, unsigned short) on new Response() with too few arguments must throw TypeError 
+PASS Response interface: new Response() must inherit property "type" with the proper type 
+PASS Response interface: new Response() must inherit property "url" with the proper type 
+PASS Response interface: new Response() must inherit property "status" with the proper type 
+PASS Response interface: new Response() must inherit property "ok" with the proper type 
+PASS Response interface: new Response() must inherit property "statusText" with the proper type 
+PASS Response interface: new Response() must inherit property "headers" with the proper type 
+FAIL Response interface: new Response() must inherit property "trailer" with the proper type assert_inherits: property "trailer" not found in prototype chain
+PASS Response interface: new Response() must inherit property "clone()" with the proper type 
+PASS Response interface: new Response() must inherit property "body" with the proper type 
+PASS Response interface: new Response() must inherit property "bodyUsed" with the proper type 
+PASS Response interface: new Response() must inherit property "arrayBuffer()" with the proper type 
+PASS Response interface: new Response() must inherit property "blob()" with the proper type 
+PASS Response interface: new Response() must inherit property "formData()" with the proper type 
+PASS Response interface: new Response() must inherit property "json()" with the proper type 
+PASS Response interface: new Response() must inherit property "text()" with the proper type 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
new file mode 100644
index 0000000..b92d7aa
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,187 @@
+This is a testharness.js-based test.
+PASS Interfaces and attributes in ServiceWorkerGlobalScope 
+PASS test setup (cache creation) 
+PASS Event constructors 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface object 
+PASS ServiceWorkerGlobalScope interface object length 
+PASS ServiceWorkerGlobalScope interface object name 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Object.setPrototypeOf should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorkerGlobalScope interface: attribute clients 
+PASS ServiceWorkerGlobalScope interface: attribute registration 
+PASS ServiceWorkerGlobalScope interface: operation skipWaiting() 
+PASS ServiceWorkerGlobalScope interface: attribute oninstall 
+PASS ServiceWorkerGlobalScope interface: attribute onactivate 
+PASS ServiceWorkerGlobalScope interface: attribute onfetch 
+PASS ServiceWorkerGlobalScope interface: attribute onforeignfetch 
+PASS ServiceWorkerGlobalScope interface: attribute onmessage 
+FAIL ServiceWorkerGlobalScope interface: attribute onmessageerror assert_own_property: The global object must have a property "onmessageerror" expected property "onmessageerror" missing
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via __proto__ should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via __proto__ should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true 
+PASS ServiceWorkerGlobalScope must be primary interface of self 
+PASS Stringification of self 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "clients" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "registration" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "skipWaiting()" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "oninstall" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onactivate" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onfetch" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onforeignfetch" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type 
+FAIL ServiceWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type assert_own_property: expected property "onmessageerror" missing
+PASS Client interface: existence and properties of interface object 
+PASS Client interface object length 
+PASS Client interface object name 
+PASS Client interface: existence and properties of interface prototype object 
+PASS Client interface: existence and properties of interface prototype object's "constructor" property 
+PASS Client interface: attribute url 
+PASS Client interface: attribute id 
+PASS Client interface: attribute type 
+FAIL Client interface: attribute reserved assert_true: The prototype object must have a property "reserved" expected true got false
+PASS Client interface: operation postMessage(any, [object Object]) 
+PASS WindowClient interface: existence and properties of interface object 
+PASS WindowClient interface object length 
+PASS WindowClient interface object name 
+PASS WindowClient interface: existence and properties of interface prototype object 
+PASS WindowClient interface: existence and properties of interface prototype object's "constructor" property 
+PASS WindowClient interface: attribute visibilityState 
+PASS WindowClient interface: attribute focused 
+FAIL WindowClient interface: attribute ancestorOrigins assert_true: The prototype object must have a property "ancestorOrigins" expected true got false
+PASS WindowClient interface: operation focus() 
+PASS WindowClient interface: operation navigate(USVString) 
+PASS Clients interface: existence and properties of interface object 
+PASS Clients interface object length 
+PASS Clients interface object name 
+PASS Clients interface: existence and properties of interface prototype object 
+PASS Clients interface: existence and properties of interface prototype object's "constructor" property 
+PASS Clients interface: operation get(DOMString) 
+PASS Clients interface: operation matchAll(ClientQueryOptions) 
+PASS Clients interface: operation openWindow(USVString) 
+PASS Clients interface: operation claim() 
+PASS Clients must be primary interface of self.clients 
+PASS Stringification of self.clients 
+PASS Clients interface: self.clients must inherit property "get(DOMString)" with the proper type 
+PASS Clients interface: calling get(DOMString) on self.clients with too few arguments must throw TypeError 
+PASS Clients interface: self.clients must inherit property "matchAll(ClientQueryOptions)" with the proper type 
+PASS Clients interface: calling matchAll(ClientQueryOptions) on self.clients with too few arguments must throw TypeError 
+PASS Clients interface: self.clients must inherit property "openWindow(USVString)" with the proper type 
+PASS Clients interface: calling openWindow(USVString) on self.clients with too few arguments must throw TypeError 
+PASS Clients interface: self.clients must inherit property "claim()" with the proper type 
+FAIL ServiceWorker interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface object length assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface object name assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: attribute scriptURL assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: attribute state assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: operation postMessage(any, [object Object]) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: attribute onstatechange assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+PASS ServiceWorkerRegistration interface: existence and properties of interface object 
+PASS ServiceWorkerRegistration interface object length 
+PASS ServiceWorkerRegistration interface object name 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorkerRegistration interface: attribute installing 
+PASS ServiceWorkerRegistration interface: attribute waiting 
+PASS ServiceWorkerRegistration interface: attribute active 
+PASS ServiceWorkerRegistration interface: attribute navigationPreload 
+PASS ServiceWorkerRegistration interface: attribute scope 
+FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false
+PASS ServiceWorkerRegistration interface: operation update() 
+PASS ServiceWorkerRegistration interface: operation unregister() 
+PASS ServiceWorkerRegistration interface: attribute onupdatefound 
+PASS ServiceWorkerRegistration must be primary interface of self.registration 
+PASS Stringification of self.registration 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "installing" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "waiting" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "active" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "navigationPreload" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "scope" with the proper type 
+FAIL ServiceWorkerRegistration interface: self.registration must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "update()" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "unregister()" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "onupdatefound" with the proper type 
+PASS EventTarget interface: self.registration must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError 
+PASS EventTarget interface: self.registration must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError 
+PASS EventTarget interface: self.registration must inherit property "dispatchEvent(Event)" with the proper type 
+PASS EventTarget interface: calling dispatchEvent(Event) on self.registration 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 
+PASS EventTarget interface: existence and properties of interface prototype object 
+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 NavigationPreloadManager interface: existence and properties of interface object 
+PASS NavigationPreloadManager interface object length 
+PASS NavigationPreloadManager interface object name 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property 
+PASS NavigationPreloadManager interface: operation enable() 
+PASS NavigationPreloadManager interface: operation disable() 
+PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) 
+PASS NavigationPreloadManager interface: operation getState() 
+PASS Cache interface: existence and properties of interface object 
+PASS Cache interface object length 
+PASS Cache interface object name 
+PASS Cache interface: existence and properties of interface prototype object 
+PASS Cache interface: existence and properties of interface prototype object's "constructor" property 
+PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation add(RequestInfo) 
+PASS Cache interface: operation addAll([object Object]) 
+PASS Cache interface: operation put(RequestInfo, Response) 
+PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) 
+PASS Cache must be primary interface of self.cacheInstance 
+PASS Stringification of self.cacheInstance 
+PASS Cache interface: self.cacheInstance must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling match(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "matchAll(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling matchAll(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "add(RequestInfo)" with the proper type 
+PASS Cache interface: calling add(RequestInfo) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "addAll([object Object])" with the proper type 
+PASS Cache interface: calling addAll([object Object]) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "put(RequestInfo, Response)" with the proper type 
+PASS Cache interface: calling put(RequestInfo, Response) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "delete(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling delete(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "keys(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling keys(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS CacheStorage interface: existence and properties of interface object 
+PASS CacheStorage interface object length 
+PASS CacheStorage interface object name 
+PASS CacheStorage interface: existence and properties of interface prototype object 
+PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property 
+PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS CacheStorage interface: operation has(DOMString) 
+PASS CacheStorage interface: operation open(DOMString) 
+PASS CacheStorage interface: operation delete(DOMString) 
+PASS CacheStorage interface: operation keys() 
+PASS CacheStorage must be primary interface of self.caches 
+PASS Stringification of self.caches 
+PASS CacheStorage interface: self.caches must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS CacheStorage interface: calling match(RequestInfo, CacheQueryOptions) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "has(DOMString)" with the proper type 
+PASS CacheStorage interface: calling has(DOMString) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "open(DOMString)" with the proper type 
+PASS CacheStorage interface: calling open(DOMString) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "delete(DOMString)" with the proper type 
+PASS CacheStorage interface: calling delete(DOMString) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "keys()" with the proper type 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
new file mode 100644
index 0000000..c9f3ca90
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
@@ -0,0 +1,101 @@
+This is a testharness.js-based test.
+PASS test setup (worker registration) 
+PASS WorkerGlobalScope interface: existence and properties of interface object 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface object 
+PASS Client interface: existence and properties of interface object 
+PASS WindowClient interface: existence and properties of interface object 
+PASS Clients interface: existence and properties of interface object 
+PASS ServiceWorker interface: existence and properties of interface object 
+PASS ServiceWorker interface object length 
+PASS ServiceWorker interface object name 
+PASS ServiceWorker interface: existence and properties of interface prototype object 
+PASS ServiceWorker interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorker interface: attribute scriptURL 
+PASS ServiceWorker interface: attribute state 
+PASS ServiceWorker interface: operation postMessage(any, [object Object]) 
+PASS ServiceWorker interface: attribute onstatechange 
+PASS ServiceWorker must be primary interface of window.registrationInstance.installing 
+PASS Stringification of window.registrationInstance.installing 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "scriptURL" with the proper type 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "state" with the proper type 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "postMessage(any, [object Object])" with the proper type 
+PASS ServiceWorker interface: calling postMessage(any, [object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "onstatechange" with the proper type 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "dispatchEvent(Event)" with the proper type 
+PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS ServiceWorkerRegistration interface: existence and properties of interface object 
+PASS ServiceWorkerRegistration interface object length 
+PASS ServiceWorkerRegistration interface object name 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorkerRegistration interface: attribute installing 
+PASS ServiceWorkerRegistration interface: attribute waiting 
+PASS ServiceWorkerRegistration interface: attribute active 
+PASS ServiceWorkerRegistration interface: attribute navigationPreload 
+PASS ServiceWorkerRegistration interface: attribute scope 
+FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false
+PASS ServiceWorkerRegistration interface: operation update() 
+PASS ServiceWorkerRegistration interface: operation unregister() 
+PASS ServiceWorkerRegistration interface: attribute onupdatefound 
+PASS ServiceWorkerRegistration must be primary interface of window.registrationInstance 
+PASS Stringification of window.registrationInstance 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "installing" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "waiting" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "active" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "navigationPreload" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "scope" with the proper type 
+FAIL ServiceWorkerRegistration interface: window.registrationInstance must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "update()" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "unregister()" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "onupdatefound" with the proper type 
+PASS EventTarget interface: window.registrationInstance must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance must inherit property "dispatchEvent(Event)" with the proper type 
+PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance 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 
+PASS EventTarget interface: existence and properties of interface prototype object 
+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 NavigationPreloadManager interface: existence and properties of interface object 
+PASS NavigationPreloadManager interface object length 
+PASS NavigationPreloadManager interface object name 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property 
+PASS NavigationPreloadManager interface: operation enable() 
+PASS NavigationPreloadManager interface: operation disable() 
+PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) 
+PASS NavigationPreloadManager interface: operation getState() 
+PASS Cache interface: existence and properties of interface object 
+PASS Cache interface object length 
+PASS Cache interface object name 
+PASS Cache interface: existence and properties of interface prototype object 
+PASS Cache interface: existence and properties of interface prototype object's "constructor" property 
+PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation add(RequestInfo) 
+PASS Cache interface: operation addAll([object Object]) 
+PASS Cache interface: operation put(RequestInfo, Response) 
+PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) 
+PASS CacheStorage interface: existence and properties of interface object 
+PASS CacheStorage interface object length 
+PASS CacheStorage interface object name 
+PASS CacheStorage interface: existence and properties of interface prototype object 
+PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property 
+PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS CacheStorage interface: operation has(DOMString) 
+PASS CacheStorage interface: operation open(DOMString) 
+PASS CacheStorage interface: operation delete(DOMString) 
+PASS CacheStorage interface: operation keys() 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/placeholder-position-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/placeholder-position-expected.png
index 0f91d1e0..aee0d16 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/placeholder-position-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/placeholder-position-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/images/color-profile-munsell-adobe-to-srgb-expected.png
index 2152282b..1808da3e 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/images/color-profile-munsell-adobe-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/images/color-profile-munsell-adobe-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png
index fe630a2..6912cba 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png
index df47f5d..8347146 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/placeholder-position-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/placeholder-position-expected.png
index 284ceea..68da93f71 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/placeholder-position-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/placeholder-position-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/canvas/canvas-composite-video-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/canvas/canvas-composite-video-expected.png
index 9877fa03..c0aea11f 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/canvas/canvas-composite-video-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/canvas/canvas-composite-video-shadow-expected.png
index f6b9b659..6f897226 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/canvas/canvas-composite-video-shadow-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/placeholder-position-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/placeholder-position-expected.png
index 655db98..ba959f0 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/placeholder-position-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/placeholder-position-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/layers/scroll-with-transform-layer-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/layers/scroll-with-transform-layer-expected.png
index b94996b..066f8be 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/layers/scroll-with-transform-layer-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/layers/scroll-with-transform-layer-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/foreign-object-skew-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/foreign-object-skew-expected.png
index c0aa7b730..35db139c 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/foreign-object-skew-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/foreign-object-skew-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png
index 9877fa03..c0aea11f 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png
index f6b9b659..6f897226 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/placeholder-position-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/placeholder-position-expected.png
index 284ceea..68da93f71 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/placeholder-position-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/placeholder-position-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-transformed-expected.png b/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-transformed-expected.png
index cd6d214b..5050e02e 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-transformed-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-transformed-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-transformed2-expected.png b/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-transformed2-expected.png
index 9517ed2a..a344d8c 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-transformed2-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/nested-reflection-transformed2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/reflection-in-composited-expected.png b/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/reflection-in-composited-expected.png
index 349bd305..09073d2 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/reflection-in-composited-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/reflection-in-composited-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png
index fbc89829..8881d88 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-image-rotate-transform-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-image-rotate-transform-expected.png
index c79a602..baf5817 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-image-rotate-transform-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-image-rotate-transform-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-inner-bleed-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-inner-bleed-expected.png
index 57c869b09..88f67dc 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-inner-bleed-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/borders/border-inner-bleed-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-composite-video-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-composite-video-expected.png
index 89b633e1..4cbdf75 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-composite-video-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-composite-video-shadow-expected.png
index bfd4965..90973311 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-composite-video-shadow-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/image-object-in-canvas-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/image-object-in-canvas-expected.png
index ebff45f8..6ef7d5c 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/image-object-in-canvas-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/image-object-in-canvas-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/css/transformed-mask-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/css/transformed-mask-expected.png
index f4f175d..423ae30 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/css/transformed-mask-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/css/transformed-mask-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/layers/scroll-with-transform-layer-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/layers/scroll-with-transform-layer-expected.png
index ddc33d6..e59d3a3 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/layers/scroll-with-transform-layer-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/layers/scroll-with-transform-layer-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/opacity-reflection-transform-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/opacity-reflection-transform-expected.png
index 161c887..977b328 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/opacity-reflection-transform-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/opacity-reflection-transform-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/images/color-profile-image-canvas-svg-expected.png b/third_party/WebKit/LayoutTests/platform/mac/images/color-profile-image-canvas-svg-expected.png
index fa863df7..b2096fb 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/images/color-profile-image-canvas-svg-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/images/color-profile-image-canvas-svg-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac/images/color-profile-munsell-adobe-to-srgb-expected.png
index 522c84c..d7353c7 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/images/color-profile-munsell-adobe-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/images/color-profile-munsell-adobe-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png
index e5b63e7..4ea3221 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-munsell-bt709-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-munsell-bt709-to-srgb-expected.png
index ef22cc73..4e71cb3 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-munsell-bt709-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/media/color-profile-munsell-bt709-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png
index c2ded6e8..759daf8 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/filters/feTile-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/filters/feTile-expected.png
index 5364dc6..cb260e92 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/filters/feTile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/filters/feTile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/smallFonts-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/smallFonts-expected.png
index 0f003bd..2e864da 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/smallFonts-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/smallFonts-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textFeatures-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textFeatures-expected.png
index b4b029d..83765b08 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textFeatures-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textFeatures-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/focus-ring-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/focus-ring-expected.png
index b90cbed..0301123 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/focus-ring-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/focus-ring-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/foreign-object-skew-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/foreign-object-skew-expected.png
index a71aefe..c5a07ab 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/foreign-object-skew-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/foreign-object-skew-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/pattern-rotate-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/pattern-rotate-expected.png
index 17ecef5..9be0afc 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/pattern-rotate-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/pattern-rotate-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/transformed-outlines-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/transformed-outlines-expected.png
index c7379b7..ec336cb 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/transformed-outlines-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/transformed-outlines-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/hixie/perf/004-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/hixie/perf/004-expected.png
index 46b1b9d2..f8392e94 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/hixie/perf/004-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/hixie/perf/004-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-inside-transformed-html-expected.png
index 731024c..7c7281fc 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-inside-transformed-html-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-inside-transformed-html-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-with-svg-transform-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-with-svg-transform-expected.png
index 580ebf3..0fafdf7 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-with-svg-transform-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-pattern-with-svg-transform-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/transforms/transformed-document-element-expected.png b/third_party/WebKit/LayoutTests/platform/mac/transforms/transformed-document-element-expected.png
index b3a8853..6ad401a 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/transforms/transformed-document-element-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/transforms/transformed-document-element-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png
index 369581c..0d10a60 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png
index 89b633e1..4cbdf75 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png
index bfd4965..90973311 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png
new file mode 100644
index 0000000..fe14df1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png
index 8a308f1..d1a5b0f1 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png
index 03a026a..3ce8b7d 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png
index ae68f842..ebff45f8 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png
index 7c31ef7d..a971274 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png
index f5d1dc4..a695fb4 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/images/color-profile-image-canvas-svg-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/images/color-profile-image-canvas-svg-expected.png
index 95ed5a56..6f0f3489 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/images/color-profile-image-canvas-svg-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/images/color-profile-image-canvas-svg-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png
index 20f0f484..5e51737 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt
index 792f6117..b18b8d79 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt
@@ -1,33 +1,4 @@
 This is a testharness.js-based test.
-FAIL ServiceWorkerGlobalScope: Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Request objects have a signal property assert_true: Signal member is present & truthy expected true got false
-FAIL ServiceWorkerGlobalScope: Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
-FAIL ServiceWorkerGlobalScope: Readable stream synchronously cancels with AbortError if aborted before reading AbortController is not defined
+FAIL General fetch abort tests in a service worker Failed to register a ServiceWorker: The script does not have a MIME type.
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-sharedworker-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-sharedworker-expected.txt
new file mode 100644
index 0000000..d9b7c58
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general-sharedworker-expected.txt
@@ -0,0 +1,52 @@
+This is a testharness.js-based test.
+FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's window is not null 
+FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors 
+FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - Bad mode init parameter value 
+PASS TypeError from request constructor takes priority - Bad credentials init parameter value 
+PASS TypeError from request constructor takes priority - Bad cache init parameter value 
+PASS TypeError from request constructor takes priority - Bad redirect init parameter value 
+FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false
+FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal state is cloned AbortController is not defined
+FAIL Clone aborts with original controller AbortController is not defined
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any-expected.txt
new file mode 100644
index 0000000..d9b7c58
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any-expected.txt
@@ -0,0 +1,52 @@
+This is a testharness.js-based test.
+FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's window is not null 
+FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors 
+FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - Bad mode init parameter value 
+PASS TypeError from request constructor takes priority - Bad credentials init parameter value 
+PASS TypeError from request constructor takes priority - Bad cache init parameter value 
+PASS TypeError from request constructor takes priority - Bad redirect init parameter value 
+FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false
+FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal state is cloned AbortController is not defined
+FAIL Clone aborts with original controller AbortController is not defined
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any.worker-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any.worker-expected.txt
new file mode 100644
index 0000000..d9b7c58
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/abort/general.any.worker-expected.txt
@@ -0,0 +1,52 @@
+This is a testharness.js-based test.
+FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's window is not null 
+FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors 
+FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - Bad mode init parameter value 
+PASS TypeError from request constructor takes priority - Bad credentials init parameter value 
+PASS TypeError from request constructor takes priority - Bad cache init parameter value 
+PASS TypeError from request constructor takes priority - Bad redirect init parameter value 
+FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false
+FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal state is cloned AbortController is not defined
+FAIL Clone aborts with original controller AbortController is not defined
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/request/request-error-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/request/request-error-expected.txt
new file mode 100644
index 0000000..697b78fd0
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/request/request-error-expected.txt
@@ -0,0 +1,25 @@
+This is a testharness.js-based test.
+FAIL RequestInit's window is not null assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+PASS Input URL is not valid 
+PASS Input URL has credentials 
+PASS RequestInit's mode is navigate 
+PASS RequestInit's referrer is invalid 
+PASS RequestInit's method is invalid 
+PASS RequestInit's method is forbidden 
+PASS RequestInit's mode is no-cors and method is not simple 
+PASS RequestInit's mode is no-cors and integrity is not empty 
+FAIL RequestInit's cache mode is only-if-cached and mode is not same-origin assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Request with cache mode: only-if-cached and fetch mode cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Request with cache mode: only-if-cached and fetch mode no-cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+PASS Bad referrerPolicy init parameter value 
+FAIL Bad mode init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Bad credentials init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Bad cache init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Bad redirect init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+PASS Request should get its content-type from the init request 
+PASS Request should not get its content-type from the init request if init headers are provided 
+PASS Request should get its content-type from the body if none is provided 
+PASS Request should get its content-type from init headers if one is provided 
+PASS Request with cache mode: only-if-cached and fetch mode: same-origin 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/request/request-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/request/request-idl-expected.txt
new file mode 100644
index 0000000..6835e7d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/request/request-idl-expected.txt
@@ -0,0 +1,50 @@
+This is a testharness.js-based test.
+PASS Request interface: existence and properties of interface object 
+PASS Request interface object length 
+PASS Request interface object name 
+PASS Request interface: existence and properties of interface prototype object 
+PASS Request interface: existence and properties of interface prototype object's "constructor" property 
+PASS Request interface: attribute method 
+PASS Request interface: attribute url 
+PASS Request interface: attribute headers 
+FAIL Request interface: attribute type assert_true: The prototype object must have a property "type" expected true got false
+FAIL Request interface: attribute destination assert_true: The prototype object must have a property "destination" expected true got false
+PASS Request interface: attribute referrer 
+PASS Request interface: attribute referrerPolicy 
+PASS Request interface: attribute mode 
+PASS Request interface: attribute credentials 
+PASS Request interface: attribute cache 
+PASS Request interface: attribute redirect 
+PASS Request interface: attribute integrity 
+PASS Request interface: operation clone() 
+FAIL Request interface: attribute body assert_true: The prototype object must have a property "body" expected true got false
+PASS Request interface: attribute bodyUsed 
+PASS Request interface: operation arrayBuffer() 
+PASS Request interface: operation blob() 
+PASS Request interface: operation formData() 
+PASS Request interface: operation json() 
+PASS Request interface: operation text() 
+PASS Request must be primary interface of new Request("") 
+PASS Stringification of new Request("") 
+PASS Request interface: new Request("") must inherit property "method" with the proper type 
+PASS Request interface: new Request("") must inherit property "url" with the proper type 
+PASS Request interface: new Request("") must inherit property "headers" with the proper type 
+FAIL Request interface: new Request("") must inherit property "type" with the proper type assert_inherits: property "type" not found in prototype chain
+FAIL Request interface: new Request("") must inherit property "destination" with the proper type assert_inherits: property "destination" not found in prototype chain
+PASS Request interface: new Request("") must inherit property "referrer" with the proper type 
+PASS Request interface: new Request("") must inherit property "referrerPolicy" with the proper type 
+PASS Request interface: new Request("") must inherit property "mode" with the proper type 
+PASS Request interface: new Request("") must inherit property "credentials" with the proper type 
+PASS Request interface: new Request("") must inherit property "cache" with the proper type 
+PASS Request interface: new Request("") must inherit property "redirect" with the proper type 
+PASS Request interface: new Request("") must inherit property "integrity" with the proper type 
+PASS Request interface: new Request("") must inherit property "clone()" with the proper type 
+FAIL Request interface: new Request("") must inherit property "body" with the proper type assert_inherits: property "body" not found in prototype chain
+PASS Request interface: new Request("") must inherit property "bodyUsed" with the proper type 
+PASS Request interface: new Request("") must inherit property "arrayBuffer()" with the proper type 
+PASS Request interface: new Request("") must inherit property "blob()" with the proper type 
+PASS Request interface: new Request("") must inherit property "formData()" with the proper type 
+PASS Request interface: new Request("") must inherit property "json()" with the proper type 
+PASS Request interface: new Request("") must inherit property "text()" with the proper type 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/response/response-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/response/response-idl-expected.txt
new file mode 100644
index 0000000..db7454c6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/fetch/api/response/response-idl-expected.txt
@@ -0,0 +1,45 @@
+This is a testharness.js-based test.
+PASS Response interface: existence and properties of interface object 
+PASS Response interface object length 
+PASS Response interface object name 
+PASS Response interface: existence and properties of interface prototype object 
+PASS Response interface: existence and properties of interface prototype object's "constructor" property 
+PASS Response interface: operation error() 
+PASS Response interface: operation redirect(USVString, unsigned short) 
+PASS Response interface: attribute type 
+PASS Response interface: attribute url 
+PASS Response interface: attribute status 
+PASS Response interface: attribute ok 
+PASS Response interface: attribute statusText 
+PASS Response interface: attribute headers 
+FAIL Response interface: attribute trailer assert_true: The prototype object must have a property "trailer" expected true got false
+PASS Response interface: operation clone() 
+PASS Response interface: attribute body 
+PASS Response interface: attribute bodyUsed 
+PASS Response interface: operation arrayBuffer() 
+PASS Response interface: operation blob() 
+PASS Response interface: operation formData() 
+PASS Response interface: operation json() 
+PASS Response interface: operation text() 
+PASS Response must be primary interface of new Response() 
+PASS Stringification of new Response() 
+PASS Response interface: new Response() must inherit property "error()" with the proper type 
+PASS Response interface: new Response() must inherit property "redirect(USVString, unsigned short)" with the proper type 
+PASS Response interface: calling redirect(USVString, unsigned short) on new Response() with too few arguments must throw TypeError 
+PASS Response interface: new Response() must inherit property "type" with the proper type 
+PASS Response interface: new Response() must inherit property "url" with the proper type 
+PASS Response interface: new Response() must inherit property "status" with the proper type 
+PASS Response interface: new Response() must inherit property "ok" with the proper type 
+PASS Response interface: new Response() must inherit property "statusText" with the proper type 
+PASS Response interface: new Response() must inherit property "headers" with the proper type 
+FAIL Response interface: new Response() must inherit property "trailer" with the proper type assert_inherits: property "trailer" not found in prototype chain
+PASS Response interface: new Response() must inherit property "clone()" with the proper type 
+PASS Response interface: new Response() must inherit property "body" with the proper type 
+PASS Response interface: new Response() must inherit property "bodyUsed" with the proper type 
+PASS Response interface: new Response() must inherit property "arrayBuffer()" with the proper type 
+PASS Response interface: new Response() must inherit property "blob()" with the proper type 
+PASS Response interface: new Response() must inherit property "formData()" with the proper type 
+PASS Response interface: new Response() must inherit property "json()" with the proper type 
+PASS Response interface: new Response() must inherit property "text()" with the proper type 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
new file mode 100644
index 0000000..b92d7aa
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,187 @@
+This is a testharness.js-based test.
+PASS Interfaces and attributes in ServiceWorkerGlobalScope 
+PASS test setup (cache creation) 
+PASS Event constructors 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface object 
+PASS ServiceWorkerGlobalScope interface object length 
+PASS ServiceWorkerGlobalScope interface object name 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Object.setPrototypeOf should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorkerGlobalScope interface: attribute clients 
+PASS ServiceWorkerGlobalScope interface: attribute registration 
+PASS ServiceWorkerGlobalScope interface: operation skipWaiting() 
+PASS ServiceWorkerGlobalScope interface: attribute oninstall 
+PASS ServiceWorkerGlobalScope interface: attribute onactivate 
+PASS ServiceWorkerGlobalScope interface: attribute onfetch 
+PASS ServiceWorkerGlobalScope interface: attribute onforeignfetch 
+PASS ServiceWorkerGlobalScope interface: attribute onmessage 
+FAIL ServiceWorkerGlobalScope interface: attribute onmessageerror assert_own_property: The global object must have a property "onmessageerror" expected property "onmessageerror" missing
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via __proto__ should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via __proto__ should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true 
+PASS ServiceWorkerGlobalScope must be primary interface of self 
+PASS Stringification of self 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "clients" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "registration" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "skipWaiting()" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "oninstall" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onactivate" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onfetch" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onforeignfetch" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type 
+FAIL ServiceWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type assert_own_property: expected property "onmessageerror" missing
+PASS Client interface: existence and properties of interface object 
+PASS Client interface object length 
+PASS Client interface object name 
+PASS Client interface: existence and properties of interface prototype object 
+PASS Client interface: existence and properties of interface prototype object's "constructor" property 
+PASS Client interface: attribute url 
+PASS Client interface: attribute id 
+PASS Client interface: attribute type 
+FAIL Client interface: attribute reserved assert_true: The prototype object must have a property "reserved" expected true got false
+PASS Client interface: operation postMessage(any, [object Object]) 
+PASS WindowClient interface: existence and properties of interface object 
+PASS WindowClient interface object length 
+PASS WindowClient interface object name 
+PASS WindowClient interface: existence and properties of interface prototype object 
+PASS WindowClient interface: existence and properties of interface prototype object's "constructor" property 
+PASS WindowClient interface: attribute visibilityState 
+PASS WindowClient interface: attribute focused 
+FAIL WindowClient interface: attribute ancestorOrigins assert_true: The prototype object must have a property "ancestorOrigins" expected true got false
+PASS WindowClient interface: operation focus() 
+PASS WindowClient interface: operation navigate(USVString) 
+PASS Clients interface: existence and properties of interface object 
+PASS Clients interface object length 
+PASS Clients interface object name 
+PASS Clients interface: existence and properties of interface prototype object 
+PASS Clients interface: existence and properties of interface prototype object's "constructor" property 
+PASS Clients interface: operation get(DOMString) 
+PASS Clients interface: operation matchAll(ClientQueryOptions) 
+PASS Clients interface: operation openWindow(USVString) 
+PASS Clients interface: operation claim() 
+PASS Clients must be primary interface of self.clients 
+PASS Stringification of self.clients 
+PASS Clients interface: self.clients must inherit property "get(DOMString)" with the proper type 
+PASS Clients interface: calling get(DOMString) on self.clients with too few arguments must throw TypeError 
+PASS Clients interface: self.clients must inherit property "matchAll(ClientQueryOptions)" with the proper type 
+PASS Clients interface: calling matchAll(ClientQueryOptions) on self.clients with too few arguments must throw TypeError 
+PASS Clients interface: self.clients must inherit property "openWindow(USVString)" with the proper type 
+PASS Clients interface: calling openWindow(USVString) on self.clients with too few arguments must throw TypeError 
+PASS Clients interface: self.clients must inherit property "claim()" with the proper type 
+FAIL ServiceWorker interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface object length assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface object name assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: attribute scriptURL assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: attribute state assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: operation postMessage(any, [object Object]) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: attribute onstatechange assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+PASS ServiceWorkerRegistration interface: existence and properties of interface object 
+PASS ServiceWorkerRegistration interface object length 
+PASS ServiceWorkerRegistration interface object name 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorkerRegistration interface: attribute installing 
+PASS ServiceWorkerRegistration interface: attribute waiting 
+PASS ServiceWorkerRegistration interface: attribute active 
+PASS ServiceWorkerRegistration interface: attribute navigationPreload 
+PASS ServiceWorkerRegistration interface: attribute scope 
+FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false
+PASS ServiceWorkerRegistration interface: operation update() 
+PASS ServiceWorkerRegistration interface: operation unregister() 
+PASS ServiceWorkerRegistration interface: attribute onupdatefound 
+PASS ServiceWorkerRegistration must be primary interface of self.registration 
+PASS Stringification of self.registration 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "installing" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "waiting" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "active" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "navigationPreload" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "scope" with the proper type 
+FAIL ServiceWorkerRegistration interface: self.registration must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "update()" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "unregister()" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "onupdatefound" with the proper type 
+PASS EventTarget interface: self.registration must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError 
+PASS EventTarget interface: self.registration must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError 
+PASS EventTarget interface: self.registration must inherit property "dispatchEvent(Event)" with the proper type 
+PASS EventTarget interface: calling dispatchEvent(Event) on self.registration 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 
+PASS EventTarget interface: existence and properties of interface prototype object 
+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 NavigationPreloadManager interface: existence and properties of interface object 
+PASS NavigationPreloadManager interface object length 
+PASS NavigationPreloadManager interface object name 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property 
+PASS NavigationPreloadManager interface: operation enable() 
+PASS NavigationPreloadManager interface: operation disable() 
+PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) 
+PASS NavigationPreloadManager interface: operation getState() 
+PASS Cache interface: existence and properties of interface object 
+PASS Cache interface object length 
+PASS Cache interface object name 
+PASS Cache interface: existence and properties of interface prototype object 
+PASS Cache interface: existence and properties of interface prototype object's "constructor" property 
+PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation add(RequestInfo) 
+PASS Cache interface: operation addAll([object Object]) 
+PASS Cache interface: operation put(RequestInfo, Response) 
+PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) 
+PASS Cache must be primary interface of self.cacheInstance 
+PASS Stringification of self.cacheInstance 
+PASS Cache interface: self.cacheInstance must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling match(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "matchAll(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling matchAll(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "add(RequestInfo)" with the proper type 
+PASS Cache interface: calling add(RequestInfo) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "addAll([object Object])" with the proper type 
+PASS Cache interface: calling addAll([object Object]) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "put(RequestInfo, Response)" with the proper type 
+PASS Cache interface: calling put(RequestInfo, Response) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "delete(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling delete(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "keys(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling keys(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS CacheStorage interface: existence and properties of interface object 
+PASS CacheStorage interface object length 
+PASS CacheStorage interface object name 
+PASS CacheStorage interface: existence and properties of interface prototype object 
+PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property 
+PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS CacheStorage interface: operation has(DOMString) 
+PASS CacheStorage interface: operation open(DOMString) 
+PASS CacheStorage interface: operation delete(DOMString) 
+PASS CacheStorage interface: operation keys() 
+PASS CacheStorage must be primary interface of self.caches 
+PASS Stringification of self.caches 
+PASS CacheStorage interface: self.caches must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS CacheStorage interface: calling match(RequestInfo, CacheQueryOptions) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "has(DOMString)" with the proper type 
+PASS CacheStorage interface: calling has(DOMString) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "open(DOMString)" with the proper type 
+PASS CacheStorage interface: calling open(DOMString) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "delete(DOMString)" with the proper type 
+PASS CacheStorage interface: calling delete(DOMString) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "keys()" with the proper type 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
new file mode 100644
index 0000000..c9f3ca90
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-blobs/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
@@ -0,0 +1,101 @@
+This is a testharness.js-based test.
+PASS test setup (worker registration) 
+PASS WorkerGlobalScope interface: existence and properties of interface object 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface object 
+PASS Client interface: existence and properties of interface object 
+PASS WindowClient interface: existence and properties of interface object 
+PASS Clients interface: existence and properties of interface object 
+PASS ServiceWorker interface: existence and properties of interface object 
+PASS ServiceWorker interface object length 
+PASS ServiceWorker interface object name 
+PASS ServiceWorker interface: existence and properties of interface prototype object 
+PASS ServiceWorker interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorker interface: attribute scriptURL 
+PASS ServiceWorker interface: attribute state 
+PASS ServiceWorker interface: operation postMessage(any, [object Object]) 
+PASS ServiceWorker interface: attribute onstatechange 
+PASS ServiceWorker must be primary interface of window.registrationInstance.installing 
+PASS Stringification of window.registrationInstance.installing 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "scriptURL" with the proper type 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "state" with the proper type 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "postMessage(any, [object Object])" with the proper type 
+PASS ServiceWorker interface: calling postMessage(any, [object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "onstatechange" with the proper type 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "dispatchEvent(Event)" with the proper type 
+PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS ServiceWorkerRegistration interface: existence and properties of interface object 
+PASS ServiceWorkerRegistration interface object length 
+PASS ServiceWorkerRegistration interface object name 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorkerRegistration interface: attribute installing 
+PASS ServiceWorkerRegistration interface: attribute waiting 
+PASS ServiceWorkerRegistration interface: attribute active 
+PASS ServiceWorkerRegistration interface: attribute navigationPreload 
+PASS ServiceWorkerRegistration interface: attribute scope 
+FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false
+PASS ServiceWorkerRegistration interface: operation update() 
+PASS ServiceWorkerRegistration interface: operation unregister() 
+PASS ServiceWorkerRegistration interface: attribute onupdatefound 
+PASS ServiceWorkerRegistration must be primary interface of window.registrationInstance 
+PASS Stringification of window.registrationInstance 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "installing" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "waiting" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "active" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "navigationPreload" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "scope" with the proper type 
+FAIL ServiceWorkerRegistration interface: window.registrationInstance must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "update()" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "unregister()" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "onupdatefound" with the proper type 
+PASS EventTarget interface: window.registrationInstance must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance must inherit property "dispatchEvent(Event)" with the proper type 
+PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance 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 
+PASS EventTarget interface: existence and properties of interface prototype object 
+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 NavigationPreloadManager interface: existence and properties of interface object 
+PASS NavigationPreloadManager interface object length 
+PASS NavigationPreloadManager interface object name 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property 
+PASS NavigationPreloadManager interface: operation enable() 
+PASS NavigationPreloadManager interface: operation disable() 
+PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) 
+PASS NavigationPreloadManager interface: operation getState() 
+PASS Cache interface: existence and properties of interface object 
+PASS Cache interface object length 
+PASS Cache interface object name 
+PASS Cache interface: existence and properties of interface prototype object 
+PASS Cache interface: existence and properties of interface prototype object's "constructor" property 
+PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation add(RequestInfo) 
+PASS Cache interface: operation addAll([object Object]) 
+PASS Cache interface: operation put(RequestInfo, Response) 
+PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) 
+PASS CacheStorage interface: existence and properties of interface object 
+PASS CacheStorage interface object length 
+PASS CacheStorage interface object name 
+PASS CacheStorage interface: existence and properties of interface prototype object 
+PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property 
+PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS CacheStorage interface: operation has(DOMString) 
+PASS CacheStorage interface: operation open(DOMString) 
+PASS CacheStorage interface: operation delete(DOMString) 
+PASS CacheStorage interface: operation keys() 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-localstorage/external/wpt/webstorage/idlharness-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-localstorage/external/wpt/webstorage/idlharness-expected.txt
new file mode 100644
index 0000000..4b5ce02
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/mojo-localstorage/external/wpt/webstorage/idlharness-expected.txt
@@ -0,0 +1,38 @@
+This is a testharness.js-based test.
+PASS Window interface: attribute sessionStorage 
+PASS Window interface: attribute localStorage 
+PASS Storage interface: existence and properties of interface object 
+PASS Storage interface object length 
+PASS Storage interface object name 
+PASS Storage interface: existence and properties of interface prototype object 
+PASS Storage interface: existence and properties of interface prototype object's "constructor" property 
+FAIL Storage interface: attribute length assert_true: property should be enumerable expected true got false
+FAIL Storage interface: operation key(unsigned long) assert_true: property should be enumerable expected true got false
+FAIL Storage interface: operation getItem(DOMString) assert_true: property should be enumerable expected true got false
+FAIL Storage interface: operation setItem(DOMString, DOMString) assert_true: property should be enumerable expected true got false
+FAIL Storage interface: operation removeItem(DOMString) assert_true: property should be enumerable expected true got false
+FAIL Storage interface: operation clear() assert_true: property should be enumerable expected true got false
+PASS Storage must be primary interface of window.localStorage 
+PASS Stringification of window.localStorage 
+PASS Storage interface: window.localStorage must inherit property "length" with the proper type 
+PASS Storage interface: window.localStorage must inherit property "key(unsigned long)" with the proper type 
+PASS Storage interface: calling key(unsigned long) on window.localStorage with too few arguments must throw TypeError 
+PASS Storage interface: window.localStorage must inherit property "getItem(DOMString)" with the proper type 
+PASS Storage interface: calling getItem(DOMString) on window.localStorage with too few arguments must throw TypeError 
+PASS Storage interface: window.localStorage must inherit property "setItem(DOMString, DOMString)" with the proper type 
+PASS Storage interface: calling setItem(DOMString, DOMString) on window.localStorage with too few arguments must throw TypeError 
+PASS Storage interface: window.localStorage must inherit property "removeItem(DOMString)" with the proper type 
+PASS Storage interface: calling removeItem(DOMString) on window.localStorage with too few arguments must throw TypeError 
+PASS Storage interface: window.localStorage must inherit property "clear()" with the proper type 
+PASS StorageEvent interface: existence and properties of interface object 
+PASS StorageEvent interface object length 
+PASS StorageEvent interface object name 
+PASS StorageEvent interface: existence and properties of interface prototype object 
+PASS StorageEvent interface: existence and properties of interface prototype object's "constructor" property 
+PASS StorageEvent interface: attribute key 
+PASS StorageEvent interface: attribute oldValue 
+PASS StorageEvent interface: attribute newValue 
+PASS StorageEvent interface: attribute url 
+PASS StorageEvent interface: attribute storageArea 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
new file mode 100644
index 0000000..b92d7aa
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,187 @@
+This is a testharness.js-based test.
+PASS Interfaces and attributes in ServiceWorkerGlobalScope 
+PASS test setup (cache creation) 
+PASS Event constructors 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface object 
+PASS ServiceWorkerGlobalScope interface object length 
+PASS ServiceWorkerGlobalScope interface object name 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Object.setPrototypeOf should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorkerGlobalScope interface: attribute clients 
+PASS ServiceWorkerGlobalScope interface: attribute registration 
+PASS ServiceWorkerGlobalScope interface: operation skipWaiting() 
+PASS ServiceWorkerGlobalScope interface: attribute oninstall 
+PASS ServiceWorkerGlobalScope interface: attribute onactivate 
+PASS ServiceWorkerGlobalScope interface: attribute onfetch 
+PASS ServiceWorkerGlobalScope interface: attribute onforeignfetch 
+PASS ServiceWorkerGlobalScope interface: attribute onmessage 
+FAIL ServiceWorkerGlobalScope interface: attribute onmessageerror assert_own_property: The global object must have a property "onmessageerror" expected property "onmessageerror" missing
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via __proto__ should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via __proto__ should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true 
+PASS ServiceWorkerGlobalScope must be primary interface of self 
+PASS Stringification of self 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "clients" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "registration" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "skipWaiting()" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "oninstall" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onactivate" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onfetch" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onforeignfetch" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type 
+FAIL ServiceWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type assert_own_property: expected property "onmessageerror" missing
+PASS Client interface: existence and properties of interface object 
+PASS Client interface object length 
+PASS Client interface object name 
+PASS Client interface: existence and properties of interface prototype object 
+PASS Client interface: existence and properties of interface prototype object's "constructor" property 
+PASS Client interface: attribute url 
+PASS Client interface: attribute id 
+PASS Client interface: attribute type 
+FAIL Client interface: attribute reserved assert_true: The prototype object must have a property "reserved" expected true got false
+PASS Client interface: operation postMessage(any, [object Object]) 
+PASS WindowClient interface: existence and properties of interface object 
+PASS WindowClient interface object length 
+PASS WindowClient interface object name 
+PASS WindowClient interface: existence and properties of interface prototype object 
+PASS WindowClient interface: existence and properties of interface prototype object's "constructor" property 
+PASS WindowClient interface: attribute visibilityState 
+PASS WindowClient interface: attribute focused 
+FAIL WindowClient interface: attribute ancestorOrigins assert_true: The prototype object must have a property "ancestorOrigins" expected true got false
+PASS WindowClient interface: operation focus() 
+PASS WindowClient interface: operation navigate(USVString) 
+PASS Clients interface: existence and properties of interface object 
+PASS Clients interface object length 
+PASS Clients interface object name 
+PASS Clients interface: existence and properties of interface prototype object 
+PASS Clients interface: existence and properties of interface prototype object's "constructor" property 
+PASS Clients interface: operation get(DOMString) 
+PASS Clients interface: operation matchAll(ClientQueryOptions) 
+PASS Clients interface: operation openWindow(USVString) 
+PASS Clients interface: operation claim() 
+PASS Clients must be primary interface of self.clients 
+PASS Stringification of self.clients 
+PASS Clients interface: self.clients must inherit property "get(DOMString)" with the proper type 
+PASS Clients interface: calling get(DOMString) on self.clients with too few arguments must throw TypeError 
+PASS Clients interface: self.clients must inherit property "matchAll(ClientQueryOptions)" with the proper type 
+PASS Clients interface: calling matchAll(ClientQueryOptions) on self.clients with too few arguments must throw TypeError 
+PASS Clients interface: self.clients must inherit property "openWindow(USVString)" with the proper type 
+PASS Clients interface: calling openWindow(USVString) on self.clients with too few arguments must throw TypeError 
+PASS Clients interface: self.clients must inherit property "claim()" with the proper type 
+FAIL ServiceWorker interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface object length assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface object name assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: attribute scriptURL assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: attribute state assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: operation postMessage(any, [object Object]) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: attribute onstatechange assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+PASS ServiceWorkerRegistration interface: existence and properties of interface object 
+PASS ServiceWorkerRegistration interface object length 
+PASS ServiceWorkerRegistration interface object name 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorkerRegistration interface: attribute installing 
+PASS ServiceWorkerRegistration interface: attribute waiting 
+PASS ServiceWorkerRegistration interface: attribute active 
+PASS ServiceWorkerRegistration interface: attribute navigationPreload 
+PASS ServiceWorkerRegistration interface: attribute scope 
+FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false
+PASS ServiceWorkerRegistration interface: operation update() 
+PASS ServiceWorkerRegistration interface: operation unregister() 
+PASS ServiceWorkerRegistration interface: attribute onupdatefound 
+PASS ServiceWorkerRegistration must be primary interface of self.registration 
+PASS Stringification of self.registration 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "installing" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "waiting" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "active" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "navigationPreload" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "scope" with the proper type 
+FAIL ServiceWorkerRegistration interface: self.registration must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "update()" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "unregister()" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "onupdatefound" with the proper type 
+PASS EventTarget interface: self.registration must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError 
+PASS EventTarget interface: self.registration must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError 
+PASS EventTarget interface: self.registration must inherit property "dispatchEvent(Event)" with the proper type 
+PASS EventTarget interface: calling dispatchEvent(Event) on self.registration 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 
+PASS EventTarget interface: existence and properties of interface prototype object 
+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 NavigationPreloadManager interface: existence and properties of interface object 
+PASS NavigationPreloadManager interface object length 
+PASS NavigationPreloadManager interface object name 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property 
+PASS NavigationPreloadManager interface: operation enable() 
+PASS NavigationPreloadManager interface: operation disable() 
+PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) 
+PASS NavigationPreloadManager interface: operation getState() 
+PASS Cache interface: existence and properties of interface object 
+PASS Cache interface object length 
+PASS Cache interface object name 
+PASS Cache interface: existence and properties of interface prototype object 
+PASS Cache interface: existence and properties of interface prototype object's "constructor" property 
+PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation add(RequestInfo) 
+PASS Cache interface: operation addAll([object Object]) 
+PASS Cache interface: operation put(RequestInfo, Response) 
+PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) 
+PASS Cache must be primary interface of self.cacheInstance 
+PASS Stringification of self.cacheInstance 
+PASS Cache interface: self.cacheInstance must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling match(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "matchAll(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling matchAll(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "add(RequestInfo)" with the proper type 
+PASS Cache interface: calling add(RequestInfo) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "addAll([object Object])" with the proper type 
+PASS Cache interface: calling addAll([object Object]) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "put(RequestInfo, Response)" with the proper type 
+PASS Cache interface: calling put(RequestInfo, Response) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "delete(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling delete(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "keys(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling keys(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS CacheStorage interface: existence and properties of interface object 
+PASS CacheStorage interface object length 
+PASS CacheStorage interface object name 
+PASS CacheStorage interface: existence and properties of interface prototype object 
+PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property 
+PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS CacheStorage interface: operation has(DOMString) 
+PASS CacheStorage interface: operation open(DOMString) 
+PASS CacheStorage interface: operation delete(DOMString) 
+PASS CacheStorage interface: operation keys() 
+PASS CacheStorage must be primary interface of self.caches 
+PASS Stringification of self.caches 
+PASS CacheStorage interface: self.caches must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS CacheStorage interface: calling match(RequestInfo, CacheQueryOptions) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "has(DOMString)" with the proper type 
+PASS CacheStorage interface: calling has(DOMString) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "open(DOMString)" with the proper type 
+PASS CacheStorage interface: calling open(DOMString) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "delete(DOMString)" with the proper type 
+PASS CacheStorage interface: calling delete(DOMString) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "keys()" with the proper type 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
new file mode 100644
index 0000000..c9f3ca90
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
@@ -0,0 +1,101 @@
+This is a testharness.js-based test.
+PASS test setup (worker registration) 
+PASS WorkerGlobalScope interface: existence and properties of interface object 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface object 
+PASS Client interface: existence and properties of interface object 
+PASS WindowClient interface: existence and properties of interface object 
+PASS Clients interface: existence and properties of interface object 
+PASS ServiceWorker interface: existence and properties of interface object 
+PASS ServiceWorker interface object length 
+PASS ServiceWorker interface object name 
+PASS ServiceWorker interface: existence and properties of interface prototype object 
+PASS ServiceWorker interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorker interface: attribute scriptURL 
+PASS ServiceWorker interface: attribute state 
+PASS ServiceWorker interface: operation postMessage(any, [object Object]) 
+PASS ServiceWorker interface: attribute onstatechange 
+PASS ServiceWorker must be primary interface of window.registrationInstance.installing 
+PASS Stringification of window.registrationInstance.installing 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "scriptURL" with the proper type 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "state" with the proper type 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "postMessage(any, [object Object])" with the proper type 
+PASS ServiceWorker interface: calling postMessage(any, [object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "onstatechange" with the proper type 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "dispatchEvent(Event)" with the proper type 
+PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS ServiceWorkerRegistration interface: existence and properties of interface object 
+PASS ServiceWorkerRegistration interface object length 
+PASS ServiceWorkerRegistration interface object name 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorkerRegistration interface: attribute installing 
+PASS ServiceWorkerRegistration interface: attribute waiting 
+PASS ServiceWorkerRegistration interface: attribute active 
+PASS ServiceWorkerRegistration interface: attribute navigationPreload 
+PASS ServiceWorkerRegistration interface: attribute scope 
+FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false
+PASS ServiceWorkerRegistration interface: operation update() 
+PASS ServiceWorkerRegistration interface: operation unregister() 
+PASS ServiceWorkerRegistration interface: attribute onupdatefound 
+PASS ServiceWorkerRegistration must be primary interface of window.registrationInstance 
+PASS Stringification of window.registrationInstance 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "installing" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "waiting" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "active" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "navigationPreload" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "scope" with the proper type 
+FAIL ServiceWorkerRegistration interface: window.registrationInstance must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "update()" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "unregister()" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "onupdatefound" with the proper type 
+PASS EventTarget interface: window.registrationInstance must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance must inherit property "dispatchEvent(Event)" with the proper type 
+PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance 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 
+PASS EventTarget interface: existence and properties of interface prototype object 
+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 NavigationPreloadManager interface: existence and properties of interface object 
+PASS NavigationPreloadManager interface object length 
+PASS NavigationPreloadManager interface object name 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property 
+PASS NavigationPreloadManager interface: operation enable() 
+PASS NavigationPreloadManager interface: operation disable() 
+PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) 
+PASS NavigationPreloadManager interface: operation getState() 
+PASS Cache interface: existence and properties of interface object 
+PASS Cache interface object length 
+PASS Cache interface object name 
+PASS Cache interface: existence and properties of interface prototype object 
+PASS Cache interface: existence and properties of interface prototype object's "constructor" property 
+PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation add(RequestInfo) 
+PASS Cache interface: operation addAll([object Object]) 
+PASS Cache interface: operation put(RequestInfo, Response) 
+PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) 
+PASS CacheStorage interface: existence and properties of interface object 
+PASS CacheStorage interface object length 
+PASS CacheStorage interface object name 
+PASS CacheStorage interface: existence and properties of interface prototype object 
+PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property 
+PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS CacheStorage interface: operation has(DOMString) 
+PASS CacheStorage interface: operation open(DOMString) 
+PASS CacheStorage interface: operation delete(DOMString) 
+PASS CacheStorage interface: operation keys() 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt
new file mode 100644
index 0000000..b18b8d79
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-serviceworker.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL General fetch abort tests in a service worker Failed to register a ServiceWorker: The script does not have a MIME type.
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-sharedworker-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-sharedworker-expected.txt
new file mode 100644
index 0000000..d9b7c58
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general-sharedworker-expected.txt
@@ -0,0 +1,52 @@
+This is a testharness.js-based test.
+FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's window is not null 
+FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors 
+FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - Bad mode init parameter value 
+PASS TypeError from request constructor takes priority - Bad credentials init parameter value 
+PASS TypeError from request constructor takes priority - Bad cache init parameter value 
+PASS TypeError from request constructor takes priority - Bad redirect init parameter value 
+FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false
+FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal state is cloned AbortController is not defined
+FAIL Clone aborts with original controller AbortController is not defined
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any-expected.txt
new file mode 100644
index 0000000..d9b7c58
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any-expected.txt
@@ -0,0 +1,52 @@
+This is a testharness.js-based test.
+FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's window is not null 
+FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors 
+FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - Bad mode init parameter value 
+PASS TypeError from request constructor takes priority - Bad credentials init parameter value 
+PASS TypeError from request constructor takes priority - Bad cache init parameter value 
+PASS TypeError from request constructor takes priority - Bad redirect init parameter value 
+FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false
+FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal state is cloned AbortController is not defined
+FAIL Clone aborts with original controller AbortController is not defined
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any.worker-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any.worker-expected.txt
new file mode 100644
index 0000000..d9b7c58
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/abort/general.any.worker-expected.txt
@@ -0,0 +1,52 @@
+This is a testharness.js-based test.
+FAIL Aborting rejects with AbortError promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Aborting rejects with AbortError - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's window is not null 
+FAIL TypeError from request constructor takes priority - Input URL is not valid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - Input URL has credentials promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is navigate promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's referrer is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is invalid promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's method is forbidden promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and method is not simple promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL TypeError from request constructor takes priority - RequestInit's mode is no-cors and integrity is not empty promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - RequestInit's cache mode is only-if-cached and mode is not same-origin 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode cors 
+PASS TypeError from request constructor takes priority - Request with cache mode: only-if-cached and fetch mode no-cors 
+FAIL TypeError from request constructor takes priority - Bad referrerPolicy init parameter value promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+PASS TypeError from request constructor takes priority - Bad mode init parameter value 
+PASS TypeError from request constructor takes priority - Bad credentials init parameter value 
+PASS TypeError from request constructor takes priority - Bad cache init parameter value 
+PASS TypeError from request constructor takes priority - Bad redirect init parameter value 
+FAIL Request objects have a signal property assert_true: Signal member is present & truthy expected true got false
+FAIL Signal on request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal on request object created from request object, with signal on second request overriding another promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal retained after unrelated properties are overridden by fetch promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal removed by setting to null promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal rejects immediately promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Request is still 'used' if signal is aborted before fetching promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.arrayBuffer() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.blob() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.formData() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.json() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL response.text() rejects if already aborted promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal does not make request promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Already aborted signal can be used for many fetches promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal can be used to abort other fetches, even if another fetch succeeded before aborting promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Underlying connection is closed when aborting after receiving response - no-cors promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.arrayBuffer() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.blob() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.formData() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.json() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Fetch aborted & connection closed when aborted after calling response.text() promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream errors once aborted, after reading. Underlying connection closed. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Stream will not error if body is empty. It's closed with an empty queue before it errors. promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Readable stream synchronously cancels with AbortError if aborted before reading promise_test: Unhandled rejection with value: object "ReferenceError: AbortController is not defined"
+FAIL Signal state is cloned AbortController is not defined
+FAIL Clone aborts with original controller AbortController is not defined
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/request/request-error-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/request/request-error-expected.txt
new file mode 100644
index 0000000..697b78fd0
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/request/request-error-expected.txt
@@ -0,0 +1,25 @@
+This is a testharness.js-based test.
+FAIL RequestInit's window is not null assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+PASS Input URL is not valid 
+PASS Input URL has credentials 
+PASS RequestInit's mode is navigate 
+PASS RequestInit's referrer is invalid 
+PASS RequestInit's method is invalid 
+PASS RequestInit's method is forbidden 
+PASS RequestInit's mode is no-cors and method is not simple 
+PASS RequestInit's mode is no-cors and integrity is not empty 
+FAIL RequestInit's cache mode is only-if-cached and mode is not same-origin assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Request with cache mode: only-if-cached and fetch mode cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Request with cache mode: only-if-cached and fetch mode no-cors assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+PASS Bad referrerPolicy init parameter value 
+FAIL Bad mode init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Bad credentials init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Bad cache init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+FAIL Bad redirect init parameter value assert_throws: Expect TypeError exception function "() => new Request(...args)" did not throw
+PASS Request should get its content-type from the init request 
+PASS Request should not get its content-type from the init request if init headers are provided 
+PASS Request should get its content-type from the body if none is provided 
+PASS Request should get its content-type from init headers if one is provided 
+PASS Request with cache mode: only-if-cached and fetch mode: same-origin 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/request/request-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/request/request-idl-expected.txt
new file mode 100644
index 0000000..6835e7d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/request/request-idl-expected.txt
@@ -0,0 +1,50 @@
+This is a testharness.js-based test.
+PASS Request interface: existence and properties of interface object 
+PASS Request interface object length 
+PASS Request interface object name 
+PASS Request interface: existence and properties of interface prototype object 
+PASS Request interface: existence and properties of interface prototype object's "constructor" property 
+PASS Request interface: attribute method 
+PASS Request interface: attribute url 
+PASS Request interface: attribute headers 
+FAIL Request interface: attribute type assert_true: The prototype object must have a property "type" expected true got false
+FAIL Request interface: attribute destination assert_true: The prototype object must have a property "destination" expected true got false
+PASS Request interface: attribute referrer 
+PASS Request interface: attribute referrerPolicy 
+PASS Request interface: attribute mode 
+PASS Request interface: attribute credentials 
+PASS Request interface: attribute cache 
+PASS Request interface: attribute redirect 
+PASS Request interface: attribute integrity 
+PASS Request interface: operation clone() 
+FAIL Request interface: attribute body assert_true: The prototype object must have a property "body" expected true got false
+PASS Request interface: attribute bodyUsed 
+PASS Request interface: operation arrayBuffer() 
+PASS Request interface: operation blob() 
+PASS Request interface: operation formData() 
+PASS Request interface: operation json() 
+PASS Request interface: operation text() 
+PASS Request must be primary interface of new Request("") 
+PASS Stringification of new Request("") 
+PASS Request interface: new Request("") must inherit property "method" with the proper type 
+PASS Request interface: new Request("") must inherit property "url" with the proper type 
+PASS Request interface: new Request("") must inherit property "headers" with the proper type 
+FAIL Request interface: new Request("") must inherit property "type" with the proper type assert_inherits: property "type" not found in prototype chain
+FAIL Request interface: new Request("") must inherit property "destination" with the proper type assert_inherits: property "destination" not found in prototype chain
+PASS Request interface: new Request("") must inherit property "referrer" with the proper type 
+PASS Request interface: new Request("") must inherit property "referrerPolicy" with the proper type 
+PASS Request interface: new Request("") must inherit property "mode" with the proper type 
+PASS Request interface: new Request("") must inherit property "credentials" with the proper type 
+PASS Request interface: new Request("") must inherit property "cache" with the proper type 
+PASS Request interface: new Request("") must inherit property "redirect" with the proper type 
+PASS Request interface: new Request("") must inherit property "integrity" with the proper type 
+PASS Request interface: new Request("") must inherit property "clone()" with the proper type 
+FAIL Request interface: new Request("") must inherit property "body" with the proper type assert_inherits: property "body" not found in prototype chain
+PASS Request interface: new Request("") must inherit property "bodyUsed" with the proper type 
+PASS Request interface: new Request("") must inherit property "arrayBuffer()" with the proper type 
+PASS Request interface: new Request("") must inherit property "blob()" with the proper type 
+PASS Request interface: new Request("") must inherit property "formData()" with the proper type 
+PASS Request interface: new Request("") must inherit property "json()" with the proper type 
+PASS Request interface: new Request("") must inherit property "text()" with the proper type 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/response/response-idl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/response/response-idl-expected.txt
new file mode 100644
index 0000000..db7454c6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/outofblink-cors/external/wpt/fetch/api/response/response-idl-expected.txt
@@ -0,0 +1,45 @@
+This is a testharness.js-based test.
+PASS Response interface: existence and properties of interface object 
+PASS Response interface object length 
+PASS Response interface object name 
+PASS Response interface: existence and properties of interface prototype object 
+PASS Response interface: existence and properties of interface prototype object's "constructor" property 
+PASS Response interface: operation error() 
+PASS Response interface: operation redirect(USVString, unsigned short) 
+PASS Response interface: attribute type 
+PASS Response interface: attribute url 
+PASS Response interface: attribute status 
+PASS Response interface: attribute ok 
+PASS Response interface: attribute statusText 
+PASS Response interface: attribute headers 
+FAIL Response interface: attribute trailer assert_true: The prototype object must have a property "trailer" expected true got false
+PASS Response interface: operation clone() 
+PASS Response interface: attribute body 
+PASS Response interface: attribute bodyUsed 
+PASS Response interface: operation arrayBuffer() 
+PASS Response interface: operation blob() 
+PASS Response interface: operation formData() 
+PASS Response interface: operation json() 
+PASS Response interface: operation text() 
+PASS Response must be primary interface of new Response() 
+PASS Stringification of new Response() 
+PASS Response interface: new Response() must inherit property "error()" with the proper type 
+PASS Response interface: new Response() must inherit property "redirect(USVString, unsigned short)" with the proper type 
+PASS Response interface: calling redirect(USVString, unsigned short) on new Response() with too few arguments must throw TypeError 
+PASS Response interface: new Response() must inherit property "type" with the proper type 
+PASS Response interface: new Response() must inherit property "url" with the proper type 
+PASS Response interface: new Response() must inherit property "status" with the proper type 
+PASS Response interface: new Response() must inherit property "ok" with the proper type 
+PASS Response interface: new Response() must inherit property "statusText" with the proper type 
+PASS Response interface: new Response() must inherit property "headers" with the proper type 
+FAIL Response interface: new Response() must inherit property "trailer" with the proper type assert_inherits: property "trailer" not found in prototype chain
+PASS Response interface: new Response() must inherit property "clone()" with the proper type 
+PASS Response interface: new Response() must inherit property "body" with the proper type 
+PASS Response interface: new Response() must inherit property "bodyUsed" with the proper type 
+PASS Response interface: new Response() must inherit property "arrayBuffer()" with the proper type 
+PASS Response interface: new Response() must inherit property "blob()" with the proper type 
+PASS Response interface: new Response() must inherit property "formData()" with the proper type 
+PASS Response interface: new Response() must inherit property "json()" with the proper type 
+PASS Response interface: new Response() must inherit property "text()" with the proper type 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
new file mode 100644
index 0000000..b92d7aa
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,187 @@
+This is a testharness.js-based test.
+PASS Interfaces and attributes in ServiceWorkerGlobalScope 
+PASS test setup (cache creation) 
+PASS Event constructors 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface object 
+PASS ServiceWorkerGlobalScope interface object length 
+PASS ServiceWorkerGlobalScope interface object name 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Object.setPrototypeOf should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorkerGlobalScope interface: attribute clients 
+PASS ServiceWorkerGlobalScope interface: attribute registration 
+PASS ServiceWorkerGlobalScope interface: operation skipWaiting() 
+PASS ServiceWorkerGlobalScope interface: attribute oninstall 
+PASS ServiceWorkerGlobalScope interface: attribute onactivate 
+PASS ServiceWorkerGlobalScope interface: attribute onfetch 
+PASS ServiceWorkerGlobalScope interface: attribute onforeignfetch 
+PASS ServiceWorkerGlobalScope interface: attribute onmessage 
+FAIL ServiceWorkerGlobalScope interface: attribute onmessageerror assert_own_property: The global object must have a property "onmessageerror" expected property "onmessageerror" missing
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via __proto__ should throw a TypeError 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via __proto__ should not throw 
+PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true 
+PASS ServiceWorkerGlobalScope must be primary interface of self 
+PASS Stringification of self 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "clients" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "registration" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "skipWaiting()" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "oninstall" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onactivate" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onfetch" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onforeignfetch" with the proper type 
+PASS ServiceWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type 
+FAIL ServiceWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type assert_own_property: expected property "onmessageerror" missing
+PASS Client interface: existence and properties of interface object 
+PASS Client interface object length 
+PASS Client interface object name 
+PASS Client interface: existence and properties of interface prototype object 
+PASS Client interface: existence and properties of interface prototype object's "constructor" property 
+PASS Client interface: attribute url 
+PASS Client interface: attribute id 
+PASS Client interface: attribute type 
+FAIL Client interface: attribute reserved assert_true: The prototype object must have a property "reserved" expected true got false
+PASS Client interface: operation postMessage(any, [object Object]) 
+PASS WindowClient interface: existence and properties of interface object 
+PASS WindowClient interface object length 
+PASS WindowClient interface object name 
+PASS WindowClient interface: existence and properties of interface prototype object 
+PASS WindowClient interface: existence and properties of interface prototype object's "constructor" property 
+PASS WindowClient interface: attribute visibilityState 
+PASS WindowClient interface: attribute focused 
+FAIL WindowClient interface: attribute ancestorOrigins assert_true: The prototype object must have a property "ancestorOrigins" expected true got false
+PASS WindowClient interface: operation focus() 
+PASS WindowClient interface: operation navigate(USVString) 
+PASS Clients interface: existence and properties of interface object 
+PASS Clients interface object length 
+PASS Clients interface object name 
+PASS Clients interface: existence and properties of interface prototype object 
+PASS Clients interface: existence and properties of interface prototype object's "constructor" property 
+PASS Clients interface: operation get(DOMString) 
+PASS Clients interface: operation matchAll(ClientQueryOptions) 
+PASS Clients interface: operation openWindow(USVString) 
+PASS Clients interface: operation claim() 
+PASS Clients must be primary interface of self.clients 
+PASS Stringification of self.clients 
+PASS Clients interface: self.clients must inherit property "get(DOMString)" with the proper type 
+PASS Clients interface: calling get(DOMString) on self.clients with too few arguments must throw TypeError 
+PASS Clients interface: self.clients must inherit property "matchAll(ClientQueryOptions)" with the proper type 
+PASS Clients interface: calling matchAll(ClientQueryOptions) on self.clients with too few arguments must throw TypeError 
+PASS Clients interface: self.clients must inherit property "openWindow(USVString)" with the proper type 
+PASS Clients interface: calling openWindow(USVString) on self.clients with too few arguments must throw TypeError 
+PASS Clients interface: self.clients must inherit property "claim()" with the proper type 
+FAIL ServiceWorker interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface object length assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface object name assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: attribute scriptURL assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: attribute state assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: operation postMessage(any, [object Object]) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+FAIL ServiceWorker interface: attribute onstatechange assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
+PASS ServiceWorkerRegistration interface: existence and properties of interface object 
+PASS ServiceWorkerRegistration interface object length 
+PASS ServiceWorkerRegistration interface object name 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorkerRegistration interface: attribute installing 
+PASS ServiceWorkerRegistration interface: attribute waiting 
+PASS ServiceWorkerRegistration interface: attribute active 
+PASS ServiceWorkerRegistration interface: attribute navigationPreload 
+PASS ServiceWorkerRegistration interface: attribute scope 
+FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false
+PASS ServiceWorkerRegistration interface: operation update() 
+PASS ServiceWorkerRegistration interface: operation unregister() 
+PASS ServiceWorkerRegistration interface: attribute onupdatefound 
+PASS ServiceWorkerRegistration must be primary interface of self.registration 
+PASS Stringification of self.registration 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "installing" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "waiting" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "active" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "navigationPreload" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "scope" with the proper type 
+FAIL ServiceWorkerRegistration interface: self.registration must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "update()" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "unregister()" with the proper type 
+PASS ServiceWorkerRegistration interface: self.registration must inherit property "onupdatefound" with the proper type 
+PASS EventTarget interface: self.registration must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError 
+PASS EventTarget interface: self.registration must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on self.registration with too few arguments must throw TypeError 
+PASS EventTarget interface: self.registration must inherit property "dispatchEvent(Event)" with the proper type 
+PASS EventTarget interface: calling dispatchEvent(Event) on self.registration 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 
+PASS EventTarget interface: existence and properties of interface prototype object 
+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 NavigationPreloadManager interface: existence and properties of interface object 
+PASS NavigationPreloadManager interface object length 
+PASS NavigationPreloadManager interface object name 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property 
+PASS NavigationPreloadManager interface: operation enable() 
+PASS NavigationPreloadManager interface: operation disable() 
+PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) 
+PASS NavigationPreloadManager interface: operation getState() 
+PASS Cache interface: existence and properties of interface object 
+PASS Cache interface object length 
+PASS Cache interface object name 
+PASS Cache interface: existence and properties of interface prototype object 
+PASS Cache interface: existence and properties of interface prototype object's "constructor" property 
+PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation add(RequestInfo) 
+PASS Cache interface: operation addAll([object Object]) 
+PASS Cache interface: operation put(RequestInfo, Response) 
+PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) 
+PASS Cache must be primary interface of self.cacheInstance 
+PASS Stringification of self.cacheInstance 
+PASS Cache interface: self.cacheInstance must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling match(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "matchAll(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling matchAll(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "add(RequestInfo)" with the proper type 
+PASS Cache interface: calling add(RequestInfo) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "addAll([object Object])" with the proper type 
+PASS Cache interface: calling addAll([object Object]) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "put(RequestInfo, Response)" with the proper type 
+PASS Cache interface: calling put(RequestInfo, Response) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "delete(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling delete(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS Cache interface: self.cacheInstance must inherit property "keys(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS Cache interface: calling keys(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError 
+PASS CacheStorage interface: existence and properties of interface object 
+PASS CacheStorage interface object length 
+PASS CacheStorage interface object name 
+PASS CacheStorage interface: existence and properties of interface prototype object 
+PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property 
+PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS CacheStorage interface: operation has(DOMString) 
+PASS CacheStorage interface: operation open(DOMString) 
+PASS CacheStorage interface: operation delete(DOMString) 
+PASS CacheStorage interface: operation keys() 
+PASS CacheStorage must be primary interface of self.caches 
+PASS Stringification of self.caches 
+PASS CacheStorage interface: self.caches must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type 
+PASS CacheStorage interface: calling match(RequestInfo, CacheQueryOptions) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "has(DOMString)" with the proper type 
+PASS CacheStorage interface: calling has(DOMString) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "open(DOMString)" with the proper type 
+PASS CacheStorage interface: calling open(DOMString) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "delete(DOMString)" with the proper type 
+PASS CacheStorage interface: calling delete(DOMString) on self.caches with too few arguments must throw TypeError 
+PASS CacheStorage interface: self.caches must inherit property "keys()" with the proper type 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
new file mode 100644
index 0000000..c9f3ca90
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/service-worker-script-streaming/external/wpt/service-workers/service-worker/interfaces-window.https-expected.txt
@@ -0,0 +1,101 @@
+This is a testharness.js-based test.
+PASS test setup (worker registration) 
+PASS WorkerGlobalScope interface: existence and properties of interface object 
+PASS ServiceWorkerGlobalScope interface: existence and properties of interface object 
+PASS Client interface: existence and properties of interface object 
+PASS WindowClient interface: existence and properties of interface object 
+PASS Clients interface: existence and properties of interface object 
+PASS ServiceWorker interface: existence and properties of interface object 
+PASS ServiceWorker interface object length 
+PASS ServiceWorker interface object name 
+PASS ServiceWorker interface: existence and properties of interface prototype object 
+PASS ServiceWorker interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorker interface: attribute scriptURL 
+PASS ServiceWorker interface: attribute state 
+PASS ServiceWorker interface: operation postMessage(any, [object Object]) 
+PASS ServiceWorker interface: attribute onstatechange 
+PASS ServiceWorker must be primary interface of window.registrationInstance.installing 
+PASS Stringification of window.registrationInstance.installing 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "scriptURL" with the proper type 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "state" with the proper type 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "postMessage(any, [object Object])" with the proper type 
+PASS ServiceWorker interface: calling postMessage(any, [object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS ServiceWorker interface: window.registrationInstance.installing must inherit property "onstatechange" with the proper type 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance.installing must inherit property "dispatchEvent(Event)" with the proper type 
+PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance.installing with too few arguments must throw TypeError 
+PASS ServiceWorkerRegistration interface: existence and properties of interface object 
+PASS ServiceWorkerRegistration interface object length 
+PASS ServiceWorkerRegistration interface object name 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object 
+PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property 
+PASS ServiceWorkerRegistration interface: attribute installing 
+PASS ServiceWorkerRegistration interface: attribute waiting 
+PASS ServiceWorkerRegistration interface: attribute active 
+PASS ServiceWorkerRegistration interface: attribute navigationPreload 
+PASS ServiceWorkerRegistration interface: attribute scope 
+FAIL ServiceWorkerRegistration interface: attribute updateViaCache assert_true: The prototype object must have a property "updateViaCache" expected true got false
+PASS ServiceWorkerRegistration interface: operation update() 
+PASS ServiceWorkerRegistration interface: operation unregister() 
+PASS ServiceWorkerRegistration interface: attribute onupdatefound 
+PASS ServiceWorkerRegistration must be primary interface of window.registrationInstance 
+PASS Stringification of window.registrationInstance 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "installing" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "waiting" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "active" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "navigationPreload" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "scope" with the proper type 
+FAIL ServiceWorkerRegistration interface: window.registrationInstance must inherit property "updateViaCache" with the proper type assert_inherits: property "updateViaCache" not found in prototype chain
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "update()" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "unregister()" with the proper type 
+PASS ServiceWorkerRegistration interface: window.registrationInstance must inherit property "onupdatefound" with the proper type 
+PASS EventTarget interface: window.registrationInstance must inherit property "addEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance must inherit property "removeEventListener(DOMString, EventListener, [object Object],[object Object])" with the proper type 
+PASS EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object],[object Object]) on window.registrationInstance with too few arguments must throw TypeError 
+PASS EventTarget interface: window.registrationInstance must inherit property "dispatchEvent(Event)" with the proper type 
+PASS EventTarget interface: calling dispatchEvent(Event) on window.registrationInstance 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 
+PASS EventTarget interface: existence and properties of interface prototype object 
+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 NavigationPreloadManager interface: existence and properties of interface object 
+PASS NavigationPreloadManager interface object length 
+PASS NavigationPreloadManager interface object name 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object 
+PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property 
+PASS NavigationPreloadManager interface: operation enable() 
+PASS NavigationPreloadManager interface: operation disable() 
+PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) 
+PASS NavigationPreloadManager interface: operation getState() 
+PASS Cache interface: existence and properties of interface object 
+PASS Cache interface object length 
+PASS Cache interface object name 
+PASS Cache interface: existence and properties of interface prototype object 
+PASS Cache interface: existence and properties of interface prototype object's "constructor" property 
+PASS Cache interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation add(RequestInfo) 
+PASS Cache interface: operation addAll([object Object]) 
+PASS Cache interface: operation put(RequestInfo, Response) 
+PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions) 
+PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions) 
+PASS CacheStorage interface: existence and properties of interface object 
+PASS CacheStorage interface object length 
+PASS CacheStorage interface object name 
+PASS CacheStorage interface: existence and properties of interface prototype object 
+PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property 
+PASS CacheStorage interface: operation match(RequestInfo, CacheQueryOptions) 
+PASS CacheStorage interface: operation has(DOMString) 
+PASS CacheStorage interface: operation open(DOMString) 
+PASS CacheStorage interface: operation delete(DOMString) 
+PASS CacheStorage interface: operation keys() 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-transformed-expected.png b/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-transformed-expected.png
index 326cf1e..3349df3 100644
--- a/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-transformed-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-transformed-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-transformed2-expected.png b/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-transformed2-expected.png
index d59dd8e..19c47c13 100644
--- a/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-transformed2-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/nested-reflection-transformed2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/reflection-in-composited-expected.png b/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/reflection-in-composited-expected.png
index ec7415fb..6f6ae4c 100644
--- a/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/reflection-in-composited-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/compositing/reflections/reflection-in-composited-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png
index e91a060..8ac880e 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-image-rotate-transform-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-image-rotate-transform-expected.png
index 3efca06..1d8da6b 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-image-rotate-transform-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-image-rotate-transform-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-inner-bleed-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-inner-bleed-expected.png
index b26d4fd3..d5c1163 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-inner-bleed-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/borders/border-inner-bleed-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-composite-video-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-composite-video-expected.png
index db2e2723..5754aae 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-composite-video-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-composite-video-shadow-expected.png
index a578bd10..05a993d 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-composite-video-shadow-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/canvas/image-object-in-canvas-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/canvas/image-object-in-canvas-expected.png
index e8f71624..bdbc6ab 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/canvas/image-object-in-canvas-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/canvas/image-object-in-canvas-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/css/transformed-mask-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/css/transformed-mask-expected.png
index 4d902fa..589c9400 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/css/transformed-mask-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/css/transformed-mask-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/reflections/opacity-reflection-transform-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/reflections/opacity-reflection-transform-expected.png
index 9cec965..f76e53c 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/reflections/opacity-reflection-transform-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/reflections/opacity-reflection-transform-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/images/color-profile-image-canvas-svg-expected.png b/third_party/WebKit/LayoutTests/platform/win/images/color-profile-image-canvas-svg-expected.png
index c6175ef..d89a19f 100644
--- a/third_party/WebKit/LayoutTests/platform/win/images/color-profile-image-canvas-svg-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/images/color-profile-image-canvas-svg-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/win/images/color-profile-munsell-adobe-to-srgb-expected.png
index d246ff28..9ba02149 100644
--- a/third_party/WebKit/LayoutTests/platform/win/images/color-profile-munsell-adobe-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/images/color-profile-munsell-adobe-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/win/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png
index b39df69..0a4a656 100644
--- a/third_party/WebKit/LayoutTests/platform/win/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/media/color-profile-munsell-bt601-smpte-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/media/color-profile-munsell-bt709-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/win/media/color-profile-munsell-bt709-to-srgb-expected.png
index 7536943..081dac4 100644
--- a/third_party/WebKit/LayoutTests/platform/win/media/color-profile-munsell-bt709-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/media/color-profile-munsell-bt709-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png
index a281ad5..89f387f 100644
--- a/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/filters/feTile-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/batik/filters/feTile-expected.png
index bfc9e2c..630122b1 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/filters/feTile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/filters/feTile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/smallFonts-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/smallFonts-expected.png
index b170da1a..c7b51fd 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/smallFonts-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/smallFonts-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textFeatures-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textFeatures-expected.png
index a436184..a1a56c30 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textFeatures-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textFeatures-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/custom/focus-ring-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/custom/focus-ring-expected.png
index f141ebb..45c44f9 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/custom/focus-ring-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/custom/focus-ring-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/custom/pattern-rotate-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/custom/pattern-rotate-expected.png
index 740098a..8adf3b5 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/custom/pattern-rotate-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/custom/pattern-rotate-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/custom/transformed-outlines-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/custom/transformed-outlines-expected.png
index 9fe658ad..de89ae7d 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/custom/transformed-outlines-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/custom/transformed-outlines-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/hixie/perf/004-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/hixie/perf/004-expected.png
index d57f21b2..aa0fd8c 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/hixie/perf/004-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/hixie/perf/004-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-inside-transformed-html-expected.png
index 48034234..3738002 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-inside-transformed-html-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-inside-transformed-html-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-with-svg-transform-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-with-svg-transform-expected.png
index 8b2d555..a36dd18 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-with-svg-transform-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-pattern-with-svg-transform-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/transforms/transformed-document-element-expected.png b/third_party/WebKit/LayoutTests/platform/win/transforms/transformed-document-element-expected.png
index 137dee85..c639d58 100644
--- a/third_party/WebKit/LayoutTests/platform/win/transforms/transformed-document-element-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/transforms/transformed-document-element-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png
index 605d21f..ce3c6420c 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png
index db2e2723..5754aae 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png
index a578bd10..05a993d 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png
index ae68e7d6..836814b 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png
index 6b357e5..aa94bdad 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png
index 10270a1b..9b37ee0 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/fillrect_gradient-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png
index e73fe3a..e8f71624 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png
index 17ae7af..4f0b1ca 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-image-canvas-svg-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png
index aaacabd..d0c9520 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-canvas-svg-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-canvas-svg-expected.png
index 6f9aa863..cbefd899 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-canvas-svg-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-image-canvas-svg-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png
index 23ea1555..8a0a426 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-createPutGetImageData-colorManaged.html b/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-createPutGetImageData-colorManaged.html
index 78494cb..123626b 100644
--- a/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-createPutGetImageData-colorManaged.html
+++ b/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-createPutGetImageData-colorManaged.html
@@ -8,16 +8,11 @@
 
 function checkImageData(canvasColorSettings, imageData) {
   var imageDataColorSettings = imageData.getColorSettings();
-  //console.log(canvasColorSettings);
-  console.log(imageDataColorSettings);
-
   assert_equals(canvasColorSettings.colorSpace, imageDataColorSettings.colorSpace);
   if (canvasColorSettings.pixelFormat == "8-8-8-8") {
-    //console.log("8-8-8-8 -> ");
     assert_equals("uint8", imageDataColorSettings.storageFormat);
     assert_equals(imageData.data.length, 4 * xWidth * xHeight);
   } else {
-    //console.log("float16 -> ");
     assert_equals("float32", imageDataColorSettings.storageFormat);
     assert_equals(imageData.dataUnion.length, 4 * xWidth * xHeight);
   }
@@ -44,7 +39,7 @@
   ["Test color managed cretateImageData: {p3, float16} -> {p3, float32}", {colorSpace: "p3", pixelFormat: "float16"}],
 ];
 
-//generate_tests(runTestCreateImageData, testScenariosCreateImageData);
+generate_tests(runTestCreateImageData, testScenariosCreateImageData);
 
 // Test getImageData when the canvas is color managed
 function runTestGetImageData(canvasColorSettings) {
@@ -57,10 +52,10 @@
 }
 
 var testScenariosGetImageData = [
-//  ["Test color managed getImageData: {srgb, 8-8-8-8} -> {srgb, uint8}", {colorSpace: "srgb", pixelFormat: "8-8-8-8"}],
-  ["Test color managed getImageData: {srgb, float16} -> {srgb, float32}", {colorSpace: "srgb", pixelFormat: "float16"}], 
-//  ["Test color managed getImageData: {rec2020, float16} -> {rec2020, float32}", {colorSpace: "rec2020", pixelFormat: "float16"}],
-//  ["Test color managed getImageData: {p3, float16} -> {p3, float32}", {colorSpace: "p3", pixelFormat: "float16"}],
+  ["Test color managed getImageData: {srgb, 8-8-8-8} -> {srgb, uint8}", {colorSpace: "srgb", pixelFormat: "8-8-8-8"}],
+  ["Test color managed getImageData: {srgb, float16} -> {srgb, float32}", {colorSpace: "srgb", pixelFormat: "float16"}],
+  ["Test color managed getImageData: {rec2020, float16} -> {rec2020, float32}", {colorSpace: "rec2020", pixelFormat: "float16"}],
+  ["Test color managed getImageData: {p3, float16} -> {p3, float32}", {colorSpace: "p3", pixelFormat: "float16"}],
 ];
 
 generate_tests(runTestGetImageData, testScenariosGetImageData);
@@ -123,7 +118,7 @@
 
 prepareDataArrays();
 prepareTestScenariosPutImageData();
-//generate_tests(runTestPutImageData, testScenariosPutImageData);
+generate_tests(runTestPutImageData, testScenariosPutImageData);
 
 </script>
 </body>
diff --git a/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-getImageData-linear-rgb.html b/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-getImageData-linear-rgb.html
new file mode 100644
index 0000000..e0370b06
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-getImageData-linear-rgb.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<body>
+<script src="../../../../../resources/testharness.js"></script>
+<script src="../../../../../resources/testharnessreport.js"></script>
+<script>
+test(drawSRGBThenGetImageDataLinearRGB, 'tests drawing SRGB color on LinearRGB \
+canvas and getting LinearRGB image data.');
+test(putImageDataLinearRGBThenGetImageDataLinearRGB, 'tests putting and \
+getting LinearRGB image data on LinearRGB canvas.');
+test(putImageDataSRGBThenGetImageDataLinearRGB, 'tests putting SRGB image data \
+on LinearRGB canvas and getting LinearRGB image data.');
+
+function assert_array_approx_equals(actual, expected, epsilon)
+{
+  assert_true(actual.length === expected.length);
+  for (var i=0; i < actual.length; i++)
+    assert_approx_equals(actual[i], expected[i], epsilon);
+}
+
+function drawSRGBThenGetImageDataLinearRGB() {
+    var canvas = document.createElement('canvas');
+    canvas.width = 10;
+    canvas.height = 10;
+    var ctx = canvas.getContext('2d',
+        {colorSpace: 'srgb', pixelFormat:'float16'});
+    ctx.fillStyle = 'rgb(50, 100, 150)';
+    ctx.fillRect(0, 0, 10, 10);
+    var pixel = ctx.getImageData(5, 5, 1, 1).dataUnion;
+    console.log(pixel);
+    // Check against the same color in LinearRGB. 0.01 protects the test against
+    // color conversion deviations.
+    assert_array_approx_equals(pixel, [0.03, 0.13, 0.30, 1], 0.01);
+}
+
+function putImageDataLinearRGBThenGetImageDataLinearRGB() {
+    var canvas = document.createElement('canvas');
+    canvas.width = 10;
+    canvas.height = 10;
+    var ctx = canvas.getContext('2d',
+        {colorSpace: 'srgb', pixelFormat:'float16'})
+    var dataLinearRGB = new Float32Array(4);
+    dataLinearRGB[0] = 0.03;
+    dataLinearRGB[1] = 0.13;
+    dataLinearRGB[2] = 0.30;
+    dataLinearRGB[3] = 1;
+    var imageData = ctx.createImageData(dataLinearRGB, 1, 1,
+        {colorSpace: 'srgb', storageFormat:'float32'});
+    ctx.putImageData(imageData, 5, 5);
+    var pixel = ctx.getImageData(5, 5, 1, 1).dataUnion;
+    // Check against the same color in LinearRGB. 0.001 protects the test against
+    // rounding errors.
+    assert_array_approx_equals(pixel, [0.03, 0.13, 0.30, 1], 0.001);
+}
+
+function putImageDataSRGBThenGetImageDataLinearRGB() {
+    var canvas = document.createElement('canvas');
+    canvas.width = 10;
+    canvas.height = 10;
+    var ctx = canvas.getContext('2d',
+        {colorSpace: 'srgb', pixelFormat:'float16'});
+    var dataSRGB = new Uint8ClampedArray(4);
+    dataSRGB[0] = 50;
+    dataSRGB[1] = 100;
+    dataSRGB[2] = 150;
+    dataSRGB[3] = 255;
+    var imageData = ctx.createImageData(dataSRGB, 1, 1,
+        {colorSpace: 'srgb', storageFormat:'uint8'});
+    ctx.putImageData(imageData, 5, 5);
+    var pixel = ctx.getImageData(5, 5, 1, 1).dataUnion;
+    // Check against the same color in LinearRGB. 0.01 protects the test against
+    // color conversion deviations.
+    assert_array_approx_equals(pixel, [0.03, 0.13, 0.30, 1], 0.01);
+}
+</script>
+</body>
diff --git a/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-getImageData-p3.html b/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-getImageData-p3.html
new file mode 100644
index 0000000..ff90c05
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-getImageData-p3.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<body>
+<script src="../../../../../resources/testharness.js"></script>
+<script src="../../../../../resources/testharnessreport.js"></script>
+<script>
+test(drawSRGBThenGetImageDataP3,
+    'tests drawing SRGB color on P3 canvas and getting image data in P3.');
+test(putImageDataP3ThenGetImageDataP3,
+    'tests putting and getting P3 image data on P3 canvas.');
+test(putImageDataSRGBThenGetImageDataP3,
+    'tests putting SRGB image data on P3 canvas and getting P3 image data.');
+
+function assert_array_approx_equals(actual, expected, epsilon)
+{
+  assert_true(actual.length === expected.length);
+  for (var i=0; i < actual.length; i++)
+    assert_approx_equals(actual[i], expected[i], epsilon);
+}
+
+function drawSRGBThenGetImageDataP3() {
+    var canvas = document.createElement('canvas');
+    canvas.width = 10;
+    canvas.height = 10;
+    var ctx = canvas.getContext('2d',
+        {colorSpace: 'p3', pixelFormat:'float16'});
+    ctx.fillStyle = 'rgb(50, 100, 150)';
+    ctx.fillRect(0, 0, 10, 10);
+    var pixel = ctx.getImageData(5, 5, 1, 1).dataUnion;
+    // Check against the same color in P3. 0.01 protects the test against
+    // color conversion deviations.
+    assert_array_approx_equals(pixel, [0.05, 0.12, 0.29, 1], 0.01);
+}
+
+function putImageDataP3ThenGetImageDataP3() {
+    var canvas = document.createElement('canvas');
+    canvas.width = 10;
+    canvas.height = 10;
+    var ctx = canvas.getContext('2d',
+        {colorSpace: 'p3', pixelFormat:'float16'})
+    var dataP3 = new Float32Array(4);
+    dataP3[0] = 0.05;
+    dataP3[1] = 0.12;
+    dataP3[2] = 0.29;
+    dataP3[3] = 1;
+    var imageData = ctx.createImageData(dataP3, 1, 1,
+        {colorSpace: 'p3', storageFormat:'float32'});
+    ctx.putImageData(imageData, 5, 5);
+    var pixel = ctx.getImageData(5, 5, 1, 1).dataUnion;
+    // Check against the same color in P3. 0.001 protects the test against
+    // rounding errors.
+    assert_array_approx_equals(pixel, [0.05, 0.12, 0.29, 1], 0.001);
+}
+
+function putImageDataSRGBThenGetImageDataP3() {
+    var canvas = document.createElement('canvas');
+    canvas.width = 10;
+    canvas.height = 10;
+    var ctx = canvas.getContext('2d',
+        {colorSpace: 'p3', pixelFormat:'float16'});
+    var dataSRGB = new Uint8ClampedArray(4);
+    dataSRGB[0] = 50;
+    dataSRGB[1] = 100;
+    dataSRGB[2] = 150;
+    dataSRGB[3] = 255;
+    var imageData = ctx.createImageData(dataSRGB, 1, 1,
+        {colorSpace: 'srgb', storageFormat:'uint8'});
+    ctx.putImageData(imageData, 5, 5);
+    var pixel = ctx.getImageData(5, 5, 1, 1).dataUnion;
+    // Check against the same color in P3. 0.01 protects the test against
+    // color conversion deviations.
+    assert_array_approx_equals(pixel, [0.05, 0.12, 0.29, 1], 0.01);
+}
+</script>
+</body>
diff --git a/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-getImageData-rec2020.html b/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-getImageData-rec2020.html
new file mode 100644
index 0000000..5135c7d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/virtual/color_space/fast/canvas/color-space/canvas-getImageData-rec2020.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<body>
+<script src="../../../../../resources/testharness.js"></script>
+<script src="../../../../../resources/testharnessreport.js"></script>
+<script>
+test(drawSRGBThenGetImageDataRec2020, 'tests drawing SRGB color on Rec2020 \
+canvas and getting Rec2020 image data.');
+test(putImageDataRec2020ThenGetImageDataRec2020,
+    'tests putting and getting Rec2020 image data on Rec2020 canvas.');
+test(putImageDataSRGBThenGetImageDataRec2020, 'tests putting SRGB image data \
+on Rec2020 canvas and getting Rec2020 image data.');
+
+function assert_array_approx_equals(actual, expected, epsilon)
+{
+  assert_true(actual.length === expected.length);
+  for (var i=0; i < actual.length; i++)
+    assert_approx_equals(actual[i], expected[i], epsilon);
+}
+
+function drawSRGBThenGetImageDataRec2020() {
+    var canvas = document.createElement('canvas');
+    canvas.width = 10;
+    canvas.height = 10;
+    var ctx = canvas.getContext('2d',
+        {colorSpace: 'rec2020', pixelFormat:'float16'});
+    ctx.fillStyle = 'rgb(50, 100, 150)';
+    ctx.fillRect(0, 0, 10, 10);
+    var pixel = ctx.getImageData(5, 5, 1, 1).dataUnion;
+    // Check against the same color in Rec2020. 0.01 protects the test against
+    // color conversion deviations.
+    assert_array_approx_equals(pixel, [0.07, 0.12, 0.28, 1], 0.01);
+}
+
+function putImageDataRec2020ThenGetImageDataRec2020() {
+    var canvas = document.createElement('canvas');
+    canvas.width = 10;
+    canvas.height = 10;
+    var ctx = canvas.getContext('2d',
+        {colorSpace: 'rec2020', pixelFormat:'float16'})
+    var dataRec2020 = new Float32Array(4);
+    dataRec2020[0] = 0.07;
+    dataRec2020[1] = 0.12;
+    dataRec2020[2] = 0.28;
+    dataRec2020[3] = 1;
+    var imageData = ctx.createImageData(dataRec2020, 1, 1,
+        {colorSpace: 'rec2020', storageFormat:'float32'});
+    ctx.putImageData(imageData, 5, 5);
+    var pixel = ctx.getImageData(5, 5, 1, 1).dataUnion;
+    // Check against the same color in Rec2020. 0.001 protects the test against
+    // rounding errors.
+    assert_array_approx_equals(pixel, [0.07, 0.12, 0.28, 1], 0.001);
+}
+
+function putImageDataSRGBThenGetImageDataRec2020() {
+    var canvas = document.createElement('canvas');
+    canvas.width = 10;
+    canvas.height = 10;
+    var ctx = canvas.getContext('2d',
+        {colorSpace: 'rec2020', pixelFormat:'float16'});
+    var dataSRGB = new Uint8ClampedArray(4);
+    dataSRGB[0] = 50;
+    dataSRGB[1] = 100;
+    dataSRGB[2] = 150;
+    dataSRGB[3] = 255;
+    var imageData = ctx.createImageData(dataSRGB, 1, 1,
+        {colorSpace: 'srgb', storageFormat:'uint8'});
+    ctx.putImageData(imageData, 5, 5);
+    var pixel = ctx.getImageData(5, 5, 1, 1).dataUnion;
+    // Check against the same color in Rec2020. 0.01 protects the test against
+    // color conversion deviations.
+    assert_array_approx_equals(pixel, [0.07, 0.12, 0.28, 1], 0.01);
+}
+</script>
+</body>
diff --git a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-arc-circumference-expected.png b/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-arc-circumference-expected.png
deleted file mode 100644
index 7ecb23a..0000000
--- a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-arc-circumference-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-arc-circumference-fill-expected.png b/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-arc-circumference-fill-expected.png
deleted file mode 100644
index f44424a..0000000
--- a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-arc-circumference-fill-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-transformclip-expected.png b/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-transformclip-expected.png
deleted file mode 100644
index 6ff69f8..0000000
--- a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-transformclip-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-circumference-expected.png b/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-circumference-expected.png
deleted file mode 100644
index 079d827..0000000
--- a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-circumference-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-circumference-fill-expected.png b/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-circumference-fill-expected.png
deleted file mode 100644
index 9679b87..0000000
--- a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-circumference-fill-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png b/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png
deleted file mode 100644
index 396bbdb..0000000
--- a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-patterns-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png
index 1649230..bbfecdf 100644
--- a/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png
+++ b/third_party/WebKit/LayoutTests/virtual/display_list_2d_canvas/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-expected.png b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-expected.png
index 03a3ff4..ab7bb2da 100644
--- a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-expected.png
+++ b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-pattern-expected.png b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-pattern-expected.png
index c6d9e832..6e84da6 100644
--- a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-pattern-expected.png
+++ b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/color-profile-image-canvas-pattern-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/exif-orientation-height-image-document-expected.png b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/exif-orientation-height-image-document-expected.png
index 679d3b5f..6366d72 100644
--- a/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/exif-orientation-height-image-document-expected.png
+++ b/third_party/WebKit/LayoutTests/virtual/exotic-color-space/images/exif-orientation-height-image-document-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/gpu-rasterization/images/color-profile-image-canvas-expected.png b/third_party/WebKit/LayoutTests/virtual/gpu-rasterization/images/color-profile-image-canvas-expected.png
index 5338925..c164551 100644
--- a/third_party/WebKit/LayoutTests/virtual/gpu-rasterization/images/color-profile-image-canvas-expected.png
+++ b/third_party/WebKit/LayoutTests/virtual/gpu-rasterization/images/color-profile-image-canvas-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/gpu-rasterization/images/color-profile-image-canvas-pattern-expected.png b/third_party/WebKit/LayoutTests/virtual/gpu-rasterization/images/color-profile-image-canvas-pattern-expected.png
index 197d272..181b748 100644
--- a/third_party/WebKit/LayoutTests/virtual/gpu-rasterization/images/color-profile-image-canvas-pattern-expected.png
+++ b/third_party/WebKit/LayoutTests/virtual/gpu-rasterization/images/color-profile-image-canvas-pattern-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt
index 553a40d..adcfe35b 100644
--- a/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt
@@ -4939,8 +4939,8 @@
 interface PerformanceServerTiming
     attribute @@toStringTag
     getter description
-    getter metric
-    getter value
+    getter duration
+    getter name
     method constructor
 interface PerformanceTiming
     attribute @@toStringTag
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
index f1c0e7d..ff1ddb4 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -4946,8 +4946,8 @@
 interface PerformanceServerTiming
     attribute @@toStringTag
     getter description
-    getter metric
-    getter value
+    getter duration
+    getter name
     method constructor
 interface PerformanceTiming
     attribute @@toStringTag
diff --git a/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl b/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl
index 0e04b24..c4c65283 100644
--- a/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl
+++ b/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl
@@ -911,7 +911,7 @@
 }
 
 void {{v8_class_or_partial}}::install{{feature.name}}(ScriptState* scriptState, v8::Local<v8::Object> instance) {
-  V8PerContextData* perContextData = V8PerContextData::From(scriptState->GetContext());
+  V8PerContextData* perContextData = scriptState->PerContextData();
   v8::Local<v8::Object> prototype = perContextData->PrototypeForType(&{{v8_class}}::wrapperTypeInfo);
   v8::Local<v8::Function> interface = perContextData->ConstructorForType(&{{v8_class}}::wrapperTypeInfo);
   ALLOW_UNUSED_LOCAL(interface);
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestConstants.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestConstants.cpp
index fd15644..d2afdd9 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestConstants.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestConstants.cpp
@@ -199,7 +199,7 @@
 }
 
 void V8TestConstants::installFeatureName1(ScriptState* scriptState, v8::Local<v8::Object> instance) {
-  V8PerContextData* perContextData = V8PerContextData::From(scriptState->GetContext());
+  V8PerContextData* perContextData = scriptState->PerContextData();
   v8::Local<v8::Object> prototype = perContextData->PrototypeForType(&V8TestConstants::wrapperTypeInfo);
   v8::Local<v8::Function> interface = perContextData->ConstructorForType(&V8TestConstants::wrapperTypeInfo);
   ALLOW_UNUSED_LOCAL(interface);
@@ -218,7 +218,7 @@
 }
 
 void V8TestConstants::installFeatureName2(ScriptState* scriptState, v8::Local<v8::Object> instance) {
-  V8PerContextData* perContextData = V8PerContextData::From(scriptState->GetContext());
+  V8PerContextData* perContextData = scriptState->PerContextData();
   v8::Local<v8::Object> prototype = perContextData->PrototypeForType(&V8TestConstants::wrapperTypeInfo);
   v8::Local<v8::Function> interface = perContextData->ConstructorForType(&V8TestConstants::wrapperTypeInfo);
   ALLOW_UNUSED_LOCAL(interface);
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp
index f88287b..4748e12 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp
@@ -13060,7 +13060,7 @@
 }
 
 void V8TestObject::installFeatureName(ScriptState* scriptState, v8::Local<v8::Object> instance) {
-  V8PerContextData* perContextData = V8PerContextData::From(scriptState->GetContext());
+  V8PerContextData* perContextData = scriptState->PerContextData();
   v8::Local<v8::Object> prototype = perContextData->PrototypeForType(&V8TestObject::wrapperTypeInfo);
   v8::Local<v8::Function> interface = perContextData->ConstructorForType(&V8TestObject::wrapperTypeInfo);
   ALLOW_UNUSED_LOCAL(interface);
diff --git a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp
index 070f582..0d32c442 100644
--- a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp
@@ -507,7 +507,7 @@
 }
 
 void V8TestInterfacePartial::installOriginTrialPartialFeature(ScriptState* scriptState, v8::Local<v8::Object> instance) {
-  V8PerContextData* perContextData = V8PerContextData::From(scriptState->GetContext());
+  V8PerContextData* perContextData = scriptState->PerContextData();
   v8::Local<v8::Object> prototype = perContextData->PrototypeForType(&V8TestInterface::wrapperTypeInfo);
   v8::Local<v8::Function> interface = perContextData->ConstructorForType(&V8TestInterface::wrapperTypeInfo);
   ALLOW_UNUSED_LOCAL(interface);
diff --git a/third_party/WebKit/Source/core/BUILD.gn b/third_party/WebKit/Source/core/BUILD.gn
index f80c029..ef7bd85 100644
--- a/third_party/WebKit/Source/core/BUILD.gn
+++ b/third_party/WebKit/Source/core/BUILD.gn
@@ -16,9 +16,6 @@
 import("//third_party/WebKit/Source/build/scripts/scripts.gni")
 import("//third_party/WebKit/Source/modules/modules_idl_files.gni")
 import("//third_party/WebKit/Source/platform/platform_generated.gni")
-if (is_win) {
-  import("//build/config/win/visual_studio_version.gni")
-}
 
 visibility = [
   "//third_party/WebKit/Source/*",
@@ -216,16 +213,14 @@
     "//third_party/WebKit/Source/core/xmlhttprequest",
   ]
 
-  if (is_win && is_debug && is_component_build &&
-      visual_studio_version == "2015" && current_cpu == "x64") {
-    # Incremental linking fails in MSVC2015 when the .ilk file gets too large.
+  if (is_win && is_debug && is_component_build && current_cpu == "x64") {
+    # Incremental linking fails when the .ilk file gets too large.
     # 64-bit debug builds with full symbols trigger this problem, so we turn
     # off incremental linking in that configuration.
     # For fastest builds, use component release builds without debug
     # information.
     # VC++ bug filed for 64-bit debug incremental link failures:
     # https://connect.microsoft.com/VisualStudio/feedback/details/2846790
-    # This is fixed in MSVC2017.
     configs -= [ "//build/config/win:default_incremental_linking" ]
     configs += [ "//build/config/win:no_incremental_linking" ]
   }
@@ -1314,7 +1309,6 @@
     "css/invalidation/StyleInvalidatorTest.cpp",
     "css/parser/CSSLazyParsingTest.cpp",
     "css/parser/CSSParserFastPathsTest.cpp",
-    "css/parser/CSSParserTokenStreamTest.cpp",
     "css/parser/CSSParserTokenTest.cpp",
     "css/parser/CSSPropertyParserTest.cpp",
     "css/parser/CSSSelectorParserTest.cpp",
diff --git a/third_party/WebKit/Source/core/css/BUILD.gn b/third_party/WebKit/Source/core/css/BUILD.gn
index ee3fcd9..7205daa 100644
--- a/third_party/WebKit/Source/core/css/BUILD.gn
+++ b/third_party/WebKit/Source/core/css/BUILD.gn
@@ -351,7 +351,6 @@
     "parser/CSSParserToken.h",
     "parser/CSSParserTokenRange.cpp",
     "parser/CSSParserTokenRange.h",
-    "parser/CSSParserTokenStream.cpp",
     "parser/CSSParserTokenStream.h",
     "parser/CSSPropertyParser.cpp",
     "parser/CSSPropertyParser.h",
@@ -579,6 +578,7 @@
     "properties/CSSPropertyWebkitBorderWidthUtils.h",
     "properties/CSSShorthandPropertyAPIAnimation.cpp",
     "properties/CSSShorthandPropertyAPIBackgroundPosition.cpp",
+    "properties/CSSShorthandPropertyAPIBorder.cpp",
     "properties/CSSShorthandPropertyAPIBorderBottom.cpp",
     "properties/CSSShorthandPropertyAPIBorderColor.cpp",
     "properties/CSSShorthandPropertyAPIBorderImage.cpp",
diff --git a/third_party/WebKit/Source/core/css/CSSProperties.json5 b/third_party/WebKit/Source/core/css/CSSProperties.json5
index 836a66fb..7e1c5d4 100644
--- a/third_party/WebKit/Source/core/css/CSSProperties.json5
+++ b/third_party/WebKit/Source/core/css/CSSProperties.json5
@@ -3885,6 +3885,7 @@
       name: "border",
       longhands: ["border-top-color", "border-top-style", "border-top-width", "border-right-color", "border-right-style", "border-right-width", "border-bottom-color", "border-bottom-style", "border-bottom-width", "border-left-color", "border-left-style", "border-left-width", "border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat"],
       api_class: true,
+      api_methods: ["ParseShorthand"],
     },
     {
       name: "border-bottom",
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
index 5e68393..9d9803f 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
@@ -169,7 +169,8 @@
   CSSParserImpl parser(context, document.ElementSheet().Contents());
   CSSTokenizer tokenizer(string);
   CSSParserTokenStream stream(tokenizer);
-  parser.ConsumeDeclarationList(stream, StyleRule::kStyle);
+  // TODO(shend): Use streams instead of ranges
+  parser.ConsumeDeclarationList(stream.MakeRangeToEOF(), StyleRule::kStyle);
   return CreateStylePropertySet(parser.parsed_properties_, mode);
 }
 
@@ -182,7 +183,8 @@
     rule_type = StyleRule::kViewport;
   CSSTokenizer tokenizer(string);
   CSSParserTokenStream stream(tokenizer);
-  parser.ConsumeDeclarationList(stream, rule_type);
+  // TODO(shend): Use streams instead of ranges
+  parser.ConsumeDeclarationList(stream.MakeRangeToEOF(), rule_type);
   if (parser.parsed_properties_.IsEmpty())
     return false;
 
@@ -846,57 +848,6 @@
       CreateStylePropertySet(parsed_properties_, context_->Mode()));
 }
 
-void CSSParserImpl::ConsumeDeclarationList(CSSParserTokenStream& stream,
-                                           StyleRule::RuleType rule_type) {
-  DCHECK(parsed_properties_.IsEmpty());
-
-  bool use_observer = observer_wrapper_ && (rule_type == StyleRule::kStyle ||
-                                            rule_type == StyleRule::kKeyframe);
-  DCHECK(!use_observer);  // TODO(shend): Implement streaming with observers.
-
-  while (!stream.AtEnd()) {
-    switch (stream.UncheckedPeek().GetType()) {
-      case kWhitespaceToken:
-      case kSemicolonToken:
-        stream.UncheckedConsume();
-        break;
-      case kIdentToken: {
-        // TODO(shend): Use streams instead of ranges
-        auto range = stream.MakeRangeToEOF();
-
-        const CSSParserToken* declaration_start = &range.Peek();
-        while (!range.AtEnd() && range.Peek().GetType() != kSemicolonToken)
-          range.ConsumeComponentValue();
-
-        ConsumeDeclaration(range.MakeSubRange(declaration_start, &range.Peek()),
-                           rule_type);
-
-        stream.UpdatePositionFromRange(range);
-        break;
-      }
-      case kAtKeywordToken: {
-        AllowedRulesType allowed_rules =
-            rule_type == StyleRule::kStyle &&
-                    RuntimeEnabledFeatures::CSSApplyAtRulesEnabled()
-                ? kApplyRules
-                : kNoRules;
-
-        // TODO(shend): Use streams instead of ranges
-        auto range = stream.MakeRangeToEOF();
-        StyleRuleBase* rule = ConsumeAtRule(range, allowed_rules);
-        stream.UpdatePositionFromRange(range);
-        DCHECK(!rule);
-        break;
-      }
-      default:  // Parse error, unexpected token in declaration list
-        while (!stream.AtEnd() &&
-               stream.UncheckedPeek().GetType() != kSemicolonToken)
-          stream.UncheckedConsumeComponentValue();
-        break;
-    }
-  }
-}
-
 void CSSParserImpl::ConsumeDeclarationList(CSSParserTokenRange range,
                                            StyleRule::RuleType rule_type) {
   DCHECK(parsed_properties_.IsEmpty());
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.h b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.h
index a467eea3f..df169ad 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.h
+++ b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.h
@@ -21,7 +21,6 @@
 class CSSParserContext;
 class CSSParserObserver;
 class CSSParserObserverWrapper;
-class CSSParserTokenStream;
 class StyleRule;
 class StyleRuleBase;
 class StyleRuleCharset;
@@ -141,8 +140,6 @@
   StyleRule* ConsumeStyleRule(CSSParserTokenRange prelude,
                               CSSParserTokenRange block);
 
-  void ConsumeDeclarationList(CSSParserTokenStream&, StyleRule::RuleType);
-  // TODO(shend): Remove this overload once we switch over to streams.
   void ConsumeDeclarationList(CSSParserTokenRange, StyleRule::RuleType);
   void ConsumeDeclaration(CSSParserTokenRange, StyleRule::RuleType);
   void ConsumeDeclarationValue(CSSParserTokenRange,
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.cpp b/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.cpp
deleted file mode 100644
index 0a2eaf1..0000000
--- a/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "core/css/parser/CSSParserTokenStream.h"
-
-namespace blink {
-
-void CSSParserTokenStream::UncheckedConsumeComponentValue() {
-  unsigned nesting_level = 0;
-  do {
-    const CSSParserToken& token = UncheckedConsume();
-    if (token.GetBlockType() == CSSParserToken::kBlockStart)
-      nesting_level++;
-    else if (token.GetBlockType() == CSSParserToken::kBlockEnd)
-      nesting_level--;
-  } while (nesting_level && !AtEnd());
-}
-
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.h b/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.h
index fbfb0ad..ba4c05b 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.h
+++ b/third_party/WebKit/Source/core/css/parser/CSSParserTokenStream.h
@@ -6,75 +6,23 @@
 #define CSSParserTokenStream_h
 
 #include "CSSTokenizer.h"
-#include "core/css/parser/CSSParserTokenRange.h"
 
 namespace blink {
 
 // A streaming interface to CSSTokenizer that tokenizes on demand.
-// Methods prefixed with "Unchecked" can only be called after Peek()
-// returns a non-EOF token or after AtEnd() returns false, with no
-// subsequent modifications to the stream such as a consume.
-class CORE_EXPORT CSSParserTokenStream {
+class CSSParserTokenStream {
   DISALLOW_NEW();
 
  public:
   explicit CSSParserTokenStream(CSSTokenizer& tokenizer)
-      : tokenizer_(tokenizer), next_index_(0) {
+      : tokenizer_(tokenizer) {
     DCHECK_EQ(tokenizer.tokens_.size(), 0U);
   }
 
-  // TODO(shend): Remove this method. We should never convert from a range to a
-  // stream. We can remove this once all the functions in CSSParserImpl.h accept
-  // streams.
-  void UpdatePositionFromRange(const CSSParserTokenRange& range) {
-    next_index_ = range.begin() - tokenizer_.tokens_.begin();
-  }
-
-  const CSSParserToken& Peek() const {
-    if (next_index_ == tokenizer_.tokens_.size()) {
-      // Reached end of token buffer, but might not be end of input.
-      if (tokenizer_.TokenizeSingle().IsEOF())
-        return g_static_eof_token;
-    }
-    DCHECK_LT(next_index_, tokenizer_.tokens_.size());
-    return UncheckedPeek();
-  }
-
-  const CSSParserToken& UncheckedPeek() const {
-    DCHECK_LT(next_index_, tokenizer_.tokens_.size());
-    return tokenizer_.tokens_[next_index_];
-  }
-
-  const CSSParserToken& Consume() {
-    const CSSParserToken& token = Peek();
-    if (!token.IsEOF())
-      next_index_++;
-
-    DCHECK_LE(next_index_, tokenizer_.tokens_.size());
-    return token;
-  }
-
-  const CSSParserToken& UncheckedConsume() {
-    DCHECK_LE(next_index_, tokenizer_.tokens_.size());
-    return tokenizer_.tokens_[next_index_++];
-  }
-
-  bool AtEnd() const { return Peek().IsEOF(); }
-
-  // Range represents all tokens from current position to EOF.
-  // Eagerly consumes all the remaining input.
-  // TODO(shend): Remove this method once we switch over to using streams
-  // completely.
-  CSSParserTokenRange MakeRangeToEOF() {
-    return tokenizer_.TokenRange().MakeSubRange(
-        tokenizer_.tokens_.begin() + next_index_, tokenizer_.tokens_.end());
-  }
-
-  void UncheckedConsumeComponentValue();
+  CSSParserTokenRange MakeRangeToEOF() { return tokenizer_.TokenRange(); }
 
  private:
   CSSTokenizer& tokenizer_;
-  size_t next_index_;  // Index of next token to be consumed.
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserTokenStreamTest.cpp b/third_party/WebKit/Source/core/css/parser/CSSParserTokenStreamTest.cpp
deleted file mode 100644
index e675e4d..0000000
--- a/third_party/WebKit/Source/core/css/parser/CSSParserTokenStreamTest.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "core/css/parser/CSSParserTokenStream.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace blink {
-
-TEST(CSSParserTokenStreamTest, EmptyStream) {
-  CSSTokenizer tokenizer("");
-  CSSParserTokenStream stream(tokenizer);
-  EXPECT_TRUE(stream.Consume().IsEOF());
-  EXPECT_TRUE(stream.Peek().IsEOF());
-  EXPECT_TRUE(stream.AtEnd());
-  EXPECT_TRUE(stream.MakeRangeToEOF().AtEnd());
-}
-
-TEST(CSSParserTokenStreamTest, PeekThenConsume) {
-  CSSTokenizer tokenizer("A");  // kIdent
-  CSSParserTokenStream stream(tokenizer);
-  EXPECT_EQ(kIdentToken, stream.Peek().GetType());
-  EXPECT_EQ(kIdentToken, stream.Consume().GetType());
-  EXPECT_TRUE(stream.AtEnd());
-}
-
-TEST(CSSParserTokenStreamTest, ConsumeThenPeek) {
-  CSSTokenizer tokenizer("A");  // kIdent
-  CSSParserTokenStream stream(tokenizer);
-  EXPECT_EQ(kIdentToken, stream.Consume().GetType());
-  EXPECT_TRUE(stream.AtEnd());
-}
-
-TEST(CSSParserTokenStreamTest, ConsumeMultipleTokens) {
-  CSSTokenizer tokenizer("A 1");  // kIdent kWhitespace kNumber
-  CSSParserTokenStream stream(tokenizer);
-  EXPECT_EQ(kIdentToken, stream.Consume().GetType());
-  EXPECT_EQ(kWhitespaceToken, stream.Consume().GetType());
-  EXPECT_EQ(kNumberToken, stream.Consume().GetType());
-  EXPECT_TRUE(stream.AtEnd());
-}
-
-TEST(CSSParserTokenStreamTest, UncheckedPeekAndConsumeAfterPeek) {
-  CSSTokenizer tokenizer("A");  // kIdent
-  CSSParserTokenStream stream(tokenizer);
-  EXPECT_EQ(kIdentToken, stream.Peek().GetType());
-  EXPECT_EQ(kIdentToken, stream.UncheckedPeek().GetType());
-  EXPECT_EQ(kIdentToken, stream.UncheckedConsume().GetType());
-  EXPECT_TRUE(stream.AtEnd());
-}
-
-TEST(CSSParserTokenStreamTest, UncheckedPeekAndConsumeAfterAtEnd) {
-  CSSTokenizer tokenizer("A");  // kIdent
-  CSSParserTokenStream stream(tokenizer);
-  EXPECT_FALSE(stream.AtEnd());
-  EXPECT_EQ(kIdentToken, stream.UncheckedPeek().GetType());
-  EXPECT_EQ(kIdentToken, stream.UncheckedConsume().GetType());
-  EXPECT_TRUE(stream.AtEnd());
-}
-
-TEST(CSSParserTokenStreamTest, MakeRangeToEOF) {
-  CSSTokenizer tokenizer("A 1");  // kIdent kWhitespace kNumber
-  CSSParserTokenStream stream(tokenizer);
-  EXPECT_EQ(kIdentToken, stream.Consume().GetType());
-
-  auto range = stream.MakeRangeToEOF();
-  EXPECT_FALSE(stream.AtEnd());
-  EXPECT_EQ(kWhitespaceToken, range.Consume().GetType());
-  EXPECT_FALSE(stream.AtEnd());
-  EXPECT_EQ(kNumberToken, range.Consume().GetType());
-  EXPECT_TRUE(range.AtEnd());
-
-  EXPECT_FALSE(stream.AtEnd());
-}
-
-TEST(CSSParserTokenStreamTest, UncheckedConsumeComponentValue) {
-  CSSTokenizer tokenizer("A{1}{2{3}}B");
-  CSSParserTokenStream stream(tokenizer);
-
-  EXPECT_EQ(kIdentToken, stream.Peek().GetType());
-  stream.UncheckedConsumeComponentValue();
-  EXPECT_EQ(kLeftBraceToken, stream.Peek().GetType());
-  stream.UncheckedConsumeComponentValue();
-  EXPECT_EQ(kLeftBraceToken, stream.Peek().GetType());
-  stream.UncheckedConsumeComponentValue();
-  EXPECT_EQ(kIdentToken, stream.Peek().GetType());
-  stream.UncheckedConsumeComponentValue();
-
-  EXPECT_TRUE(stream.AtEnd());
-}
-
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
index c4ffff4..ef4185dc 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
@@ -77,17 +77,6 @@
               *parsed_properties_);
 }
 
-void CSSPropertyParser::AddExpandedPropertyForValue(CSSPropertyID property,
-                                                    const CSSValue& value,
-                                                    bool important) {
-  const StylePropertyShorthand& shorthand = shorthandForProperty(property);
-  unsigned shorthand_length = shorthand.length();
-  DCHECK(shorthand_length);
-  const CSSPropertyID* longhands = shorthand.properties();
-  for (unsigned i = 0; i < shorthand_length; ++i)
-    AddParsedProperty(longhands[i], property, value, important);
-}
-
 bool CSSPropertyParser::ParseValue(
     CSSPropertyID unresolved_property,
     bool important,
@@ -166,7 +155,8 @@
     if (is_shorthand) {
       const CSSPendingSubstitutionValue& pending_value =
           *CSSPendingSubstitutionValue::Create(property_id, variable);
-      AddExpandedPropertyForValue(property_id, pending_value, important);
+      AddExpandedPropertyForValue(property_id, pending_value, important,
+                                  *parsed_properties_);
     } else {
       AddParsedProperty(property_id, CSSPropertyInvalid, *variable, important);
     }
@@ -273,7 +263,8 @@
       return false;
     AddParsedProperty(property, CSSPropertyInvalid, *value, important);
   } else {
-    AddExpandedPropertyForValue(property, *value, important);
+    AddExpandedPropertyForValue(property, *value, important,
+                                *parsed_properties_);
   }
   range_ = range_copy;
   return true;
@@ -710,50 +701,6 @@
   }
 }
 
-bool CSSPropertyParser::ConsumeBorder(bool important) {
-  CSSValue* width = nullptr;
-  const CSSValue* style = nullptr;
-  CSSValue* color = nullptr;
-
-  while (!width || !style || !color) {
-    if (!width) {
-      width =
-          ConsumeLineWidth(range_, context_->Mode(), UnitlessQuirk::kForbid);
-      if (width)
-        continue;
-    }
-    if (!style) {
-      style = ParseSingleValue(CSSPropertyBorderLeftStyle, CSSPropertyBorder);
-      if (style)
-        continue;
-    }
-    if (!color) {
-      color = ConsumeColor(range_, context_->Mode());
-      if (color)
-        continue;
-    }
-    break;
-  }
-
-  if (!width && !style && !color)
-    return false;
-
-  if (!width)
-    width = CSSInitialValue::Create();
-  if (!style)
-    style = CSSInitialValue::Create();
-  if (!color)
-    color = CSSInitialValue::Create();
-
-  AddExpandedPropertyForValue(CSSPropertyBorderWidth, *width, important);
-  AddExpandedPropertyForValue(CSSPropertyBorderStyle, *style, important);
-  AddExpandedPropertyForValue(CSSPropertyBorderColor, *color, important);
-  AddExpandedPropertyForValue(CSSPropertyBorderImage,
-                              *CSSInitialValue::Create(), important);
-
-  return range_.AtEnd();
-}
-
 static bool ConsumeRepeatStyleComponent(CSSParserTokenRange& range,
                                         CSSValue*& value1,
                                         CSSValue*& value2,
@@ -920,8 +867,6 @@
   }
 
   switch (property) {
-    case CSSPropertyBorder:
-      return ConsumeBorder(important);
     case CSSPropertyBackgroundRepeat:
     case CSSPropertyWebkitMaskRepeat: {
       CSSValue* result_x = nullptr;
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h
index 56933e0..7b0c3e8 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h
@@ -77,11 +77,6 @@
                          const CSSValue&,
                          bool important,
                          bool implicit = false);
-  void AddExpandedPropertyForValue(CSSPropertyID prop_id,
-                                   const CSSValue&,
-                                   bool);
-
-  bool ConsumeBorder(bool important);
 
   bool ParseShorthand(CSSPropertyID, bool important);
 
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
index ac8946f..5b3dcc14 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
@@ -1712,6 +1712,20 @@
   return true;
 }
 
+void AddExpandedPropertyForValue(CSSPropertyID property,
+                                 const CSSValue& value,
+                                 bool important,
+                                 HeapVector<CSSProperty, 256>& properties) {
+  const StylePropertyShorthand& shorthand = shorthandForProperty(property);
+  unsigned shorthand_length = shorthand.length();
+  DCHECK(shorthand_length);
+  const CSSPropertyID* longhands = shorthand.properties();
+  for (unsigned i = 0; i < shorthand_length; ++i) {
+    AddProperty(longhands[i], property, value, important,
+                IsImplicitProperty::kNotImplicit, properties);
+  }
+}
+
 }  // namespace CSSPropertyParserHelpers
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h
index 0813aca..7da7e93b 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.h
@@ -150,6 +150,11 @@
     CSSParserTokenRange&,
     HeapVector<CSSProperty, 256>& properties);
 
+void AddExpandedPropertyForValue(CSSPropertyID prop_id,
+                                 const CSSValue&,
+                                 bool,
+                                 HeapVector<CSSProperty, 256>& properties);
+
 // Template implementations are at the bottom of the file for readability.
 
 template <typename... emptyBaseCase>
diff --git a/third_party/WebKit/Source/core/css/properties/CSSShorthandPropertyAPIBorder.cpp b/third_party/WebKit/Source/core/css/properties/CSSShorthandPropertyAPIBorder.cpp
new file mode 100644
index 0000000..b95f80f2
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/properties/CSSShorthandPropertyAPIBorder.cpp
@@ -0,0 +1,71 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/css/properties/CSSShorthandPropertyAPIBorder.h"
+
+#include "core/css/CSSInitialValue.h"
+#include "core/css/parser/CSSParserContext.h"
+#include "core/css/parser/CSSPropertyParserHelpers.h"
+
+namespace blink {
+
+bool CSSShorthandPropertyAPIBorder::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    bool use_legacy_parsing,
+    HeapVector<CSSProperty, 256>& properties) {
+  CSSValue* width = nullptr;
+  const CSSValue* style = nullptr;
+  CSSValue* color = nullptr;
+
+  while (!width || !style || !color) {
+    if (!width) {
+      width = CSSPropertyParserHelpers::ConsumeLineWidth(
+          range, context.Mode(),
+          CSSPropertyParserHelpers::UnitlessQuirk::kForbid);
+      if (width)
+        continue;
+    }
+    if (!style) {
+      bool needs_legacy_parsing = false;
+      style = CSSPropertyParserHelpers::ParseLonghandViaAPI(
+          CSSPropertyBorderLeftStyle, CSSPropertyBorder, context, range,
+          needs_legacy_parsing);
+      DCHECK(!needs_legacy_parsing);
+      if (style)
+        continue;
+    }
+    if (!color) {
+      color = CSSPropertyParserHelpers::ConsumeColor(range, context.Mode());
+      if (color)
+        continue;
+    }
+    break;
+  }
+
+  if (!width && !style && !color)
+    return false;
+
+  if (!width)
+    width = CSSInitialValue::Create();
+  if (!style)
+    style = CSSInitialValue::Create();
+  if (!color)
+    color = CSSInitialValue::Create();
+
+  CSSPropertyParserHelpers::AddExpandedPropertyForValue(
+      CSSPropertyBorderWidth, *width, important, properties);
+  CSSPropertyParserHelpers::AddExpandedPropertyForValue(
+      CSSPropertyBorderStyle, *style, important, properties);
+  CSSPropertyParserHelpers::AddExpandedPropertyForValue(
+      CSSPropertyBorderColor, *color, important, properties);
+  CSSPropertyParserHelpers::AddExpandedPropertyForValue(
+      CSSPropertyBorderImage, *CSSInitialValue::Create(), important,
+      properties);
+
+  return range.AtEnd();
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/Range.cpp b/third_party/WebKit/Source/core/dom/Range.cpp
index 5cfc8ad9..981602e 100644
--- a/third_party/WebKit/Source/core/dom/Range.cpp
+++ b/third_party/WebKit/Source/core/dom/Range.cpp
@@ -1610,27 +1610,32 @@
   return DOMRect::FromFloatRect(BoundingRect());
 }
 
+// https://www.w3.org/TR/cssom-view-1/#dom-range-getclientrects
 void Range::GetBorderAndTextQuads(Vector<FloatQuad>& quads) const {
   Node* start_container = &start_.Container();
   Node* end_container = &end_.Container();
   Node* stop_node = PastLastNode();
 
-  HeapHashSet<Member<Node>> node_set;
+  // Stores the elements selected by the range.
+  HeapHashSet<Member<Node>> selected_elements;
   for (Node* node = FirstNode(); node != stop_node;
        node = NodeTraversal::Next(*node)) {
-    if (node->IsElementNode())
-      node_set.insert(node);
+    if (!node->IsElementNode())
+      continue;
+    if (selected_elements.Contains(node->parentNode()) ||
+        (!node->contains(start_container) && !node->contains(end_container))) {
+      DCHECK_LE(StartPosition(), Position::BeforeNode(*node));
+      DCHECK_GE(EndPosition(), Position::AfterNode(*node));
+      selected_elements.insert(node);
+    }
   }
 
   for (Node* node = FirstNode(); node != stop_node;
        node = NodeTraversal::Next(*node)) {
     if (node->IsElementNode()) {
-      // Exclude start & end container unless the entire corresponding
-      // node is included in the range.
-      if (!node_set.Contains(node->parentNode()) &&
-          (start_container == end_container ||
-           (!node->contains(start_container) &&
-            !node->contains(end_container)))) {
+      // TODO(xiaochengh): Apply early continue style to reduce indentation.
+      if (selected_elements.Contains(node) &&
+          !selected_elements.Contains(node->parentNode())) {
         if (LayoutObject* layout_object = ToElement(node)->GetLayoutObject()) {
           Vector<FloatQuad> element_quads;
           layout_object->AbsoluteQuads(element_quads);
diff --git a/third_party/WebKit/Source/core/dom/RangeTest.cpp b/third_party/WebKit/Source/core/dom/RangeTest.cpp
index 64ca6ff..34d94d7 100644
--- a/third_party/WebKit/Source/core/dom/RangeTest.cpp
+++ b/third_party/WebKit/Source/core/dom/RangeTest.cpp
@@ -296,4 +296,20 @@
   EXPECT_EQ(rect_before, rect_after);
 }
 
+// Regression test for crbug.com/681536
+TEST_F(RangeTest, BorderAndTextQuadsWithInputInBetween) {
+  GetDocument().body()->setInnerHTML("<div>foo <u><input> bar</u></div>");
+  GetDocument().UpdateStyleAndLayout();
+
+  Node* foo = GetDocument().QuerySelector("div")->firstChild();
+  Node* bar = GetDocument().QuerySelector("u")->lastChild();
+  Range* range = Range::Create(GetDocument(), foo, 2, bar, 2);
+
+  Vector<FloatQuad> quads;
+  range->GetBorderAndTextQuads(quads);
+
+  // Should get one quad for "o ", <input> and " b", respectively.
+  ASSERT_EQ(3u, quads.size());
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/BUILD.gn b/third_party/WebKit/Source/core/editing/BUILD.gn
index 5434e49d..bbdb5c2 100644
--- a/third_party/WebKit/Source/core/editing/BUILD.gn
+++ b/third_party/WebKit/Source/core/editing/BUILD.gn
@@ -9,10 +9,6 @@
   sources = [
     "CaretDisplayItemClient.cpp",
     "CaretDisplayItemClient.h",
-    "CompositionUnderline.cpp",
-    "CompositionUnderline.h",
-    "CompositionUnderlineVectorBuilder.cpp",
-    "CompositionUnderlineVectorBuilder.h",
     "DOMSelection.cpp",
     "DOMSelection.h",
     "DragCaret.cpp",
@@ -42,6 +38,10 @@
     "FrameSelection.h",
     "GranularityStrategy.cpp",
     "GranularityStrategy.h",
+    "ImeTextSpan.cpp",
+    "ImeTextSpan.h",
+    "ImeTextSpanVectorBuilder.cpp",
+    "ImeTextSpanVectorBuilder.h",
     "InlineBoxTraversal.cpp",
     "InlineBoxTraversal.h",
     "InputMethodController.cpp",
@@ -310,7 +310,6 @@
 source_set("unit_tests") {
   testonly = true
   sources = [
-    "CompositionUnderlineTest.cpp",
     "EditingCommandTest.cpp",
     "EditingStrategyTest.cpp",
     "EditingStyleTest.cpp",
@@ -322,6 +321,7 @@
     "FrameCaretTest.cpp",
     "FrameSelectionTest.cpp",
     "GranularityStrategyTest.cpp",
+    "ImeTextSpanTest.cpp",
     "InputMethodControllerTest.cpp",
     "LayoutSelectionTest.cpp",
     "PositionIteratorTest.cpp",
diff --git a/third_party/WebKit/Source/core/editing/CompositionUnderline.cpp b/third_party/WebKit/Source/core/editing/CompositionUnderline.cpp
deleted file mode 100644
index 5bd9d7d..0000000
--- a/third_party/WebKit/Source/core/editing/CompositionUnderline.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "core/editing/CompositionUnderline.h"
-
-#include <algorithm>
-#include "public/web/WebCompositionUnderline.h"
-
-namespace blink {
-
-CompositionUnderline::CompositionUnderline(unsigned start_offset,
-                                           unsigned end_offset,
-                                           const Color& color,
-                                           bool thick,
-                                           const Color& background_color)
-    : color_(color), thick_(thick), background_color_(background_color) {
-  // Sanitize offsets by ensuring a valid range corresponding to the last
-  // possible position.
-  // TODO(wkorman): Consider replacing with DCHECK_LT(startOffset, endOffset).
-  start_offset_ =
-      std::min(start_offset, std::numeric_limits<unsigned>::max() - 1u);
-  end_offset_ = std::max(start_offset_ + 1u, end_offset);
-}
-
-CompositionUnderline::CompositionUnderline(
-    const WebCompositionUnderline& underline)
-    : CompositionUnderline(underline.start_offset,
-                           underline.end_offset,
-                           Color(underline.color),
-                           underline.thick,
-                           Color(underline.background_color)) {}
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/CompositionUnderlineTest.cpp b/third_party/WebKit/Source/core/editing/CompositionUnderlineTest.cpp
deleted file mode 100644
index ef0a2fb..0000000
--- a/third_party/WebKit/Source/core/editing/CompositionUnderlineTest.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "core/editing/CompositionUnderline.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace blink {
-namespace {
-
-CompositionUnderline CreateCompositionUnderline(unsigned start_offset,
-                                                unsigned end_offset) {
-  return CompositionUnderline(start_offset, end_offset, Color::kTransparent,
-                              false, Color::kTransparent);
-}
-
-TEST(CompositionUnderlineTest, OneChar) {
-  CompositionUnderline underline = CreateCompositionUnderline(0, 1);
-  EXPECT_EQ(0u, underline.StartOffset());
-  EXPECT_EQ(1u, underline.EndOffset());
-}
-
-TEST(CompositionUnderlineTest, MultiChar) {
-  CompositionUnderline underline = CreateCompositionUnderline(0, 5);
-  EXPECT_EQ(0u, underline.StartOffset());
-  EXPECT_EQ(5u, underline.EndOffset());
-}
-
-TEST(CompositionUnderlineTest, ZeroLength) {
-  CompositionUnderline underline = CreateCompositionUnderline(0, 0);
-  EXPECT_EQ(0u, underline.StartOffset());
-  EXPECT_EQ(1u, underline.EndOffset());
-}
-
-TEST(CompositionUnderlineTest, ZeroLengthNonZeroStart) {
-  CompositionUnderline underline = CreateCompositionUnderline(3, 3);
-  EXPECT_EQ(3u, underline.StartOffset());
-  EXPECT_EQ(4u, underline.EndOffset());
-}
-
-TEST(CompositionUnderlineTest, EndBeforeStart) {
-  CompositionUnderline underline = CreateCompositionUnderline(1, 0);
-  EXPECT_EQ(1u, underline.StartOffset());
-  EXPECT_EQ(2u, underline.EndOffset());
-}
-
-TEST(CompositionUnderlineTest, LastChar) {
-  CompositionUnderline underline =
-      CreateCompositionUnderline(std::numeric_limits<unsigned>::max() - 1,
-                                 std::numeric_limits<unsigned>::max());
-  EXPECT_EQ(std::numeric_limits<unsigned>::max() - 1, underline.StartOffset());
-  EXPECT_EQ(std::numeric_limits<unsigned>::max(), underline.EndOffset());
-}
-
-TEST(CompositionUnderlineTest, LastCharEndBeforeStart) {
-  CompositionUnderline underline =
-      CreateCompositionUnderline(std::numeric_limits<unsigned>::max(),
-                                 std::numeric_limits<unsigned>::max() - 1);
-  EXPECT_EQ(std::numeric_limits<unsigned>::max() - 1, underline.StartOffset());
-  EXPECT_EQ(std::numeric_limits<unsigned>::max(), underline.EndOffset());
-}
-
-TEST(CompositionUnderlineTest, LastCharEndBeforeStartZeroEnd) {
-  CompositionUnderline underline =
-      CreateCompositionUnderline(std::numeric_limits<unsigned>::max(), 0);
-  EXPECT_EQ(std::numeric_limits<unsigned>::max() - 1, underline.StartOffset());
-  EXPECT_EQ(std::numeric_limits<unsigned>::max(), underline.EndOffset());
-}
-
-}  // namespace
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/ImeTextSpan.cpp b/third_party/WebKit/Source/core/editing/ImeTextSpan.cpp
new file mode 100644
index 0000000..e337a2ee2
--- /dev/null
+++ b/third_party/WebKit/Source/core/editing/ImeTextSpan.cpp
@@ -0,0 +1,33 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/editing/ImeTextSpan.h"
+
+#include <algorithm>
+#include "public/web/WebImeTextSpan.h"
+
+namespace blink {
+
+ImeTextSpan::ImeTextSpan(unsigned start_offset,
+                         unsigned end_offset,
+                         const Color& color,
+                         bool thick,
+                         const Color& background_color)
+    : color_(color), thick_(thick), background_color_(background_color) {
+  // Sanitize offsets by ensuring a valid range corresponding to the last
+  // possible position.
+  // TODO(wkorman): Consider replacing with DCHECK_LT(startOffset, endOffset).
+  start_offset_ =
+      std::min(start_offset, std::numeric_limits<unsigned>::max() - 1u);
+  end_offset_ = std::max(start_offset_ + 1u, end_offset);
+}
+
+ImeTextSpan::ImeTextSpan(const WebImeTextSpan& ime_text_span)
+    : ImeTextSpan(ime_text_span.start_offset,
+                  ime_text_span.end_offset,
+                  Color(ime_text_span.color),
+                  ime_text_span.thick,
+                  Color(ime_text_span.background_color)) {}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/CompositionUnderline.h b/third_party/WebKit/Source/core/editing/ImeTextSpan.h
similarity index 81%
rename from third_party/WebKit/Source/core/editing/CompositionUnderline.h
rename to third_party/WebKit/Source/core/editing/ImeTextSpan.h
index cb7d7b4ec..8f50f3b 100644
--- a/third_party/WebKit/Source/core/editing/CompositionUnderline.h
+++ b/third_party/WebKit/Source/core/editing/ImeTextSpan.h
@@ -23,8 +23,8 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef CompositionUnderline_h
-#define CompositionUnderline_h
+#ifndef ImeTextSpan_h
+#define ImeTextSpan_h
 
 #include "core/CoreExport.h"
 #include "platform/graphics/Color.h"
@@ -32,19 +32,19 @@
 
 namespace blink {
 
-struct WebCompositionUnderline;
+struct WebImeTextSpan;
 
-class CORE_EXPORT CompositionUnderline {
+class CORE_EXPORT ImeTextSpan {
   DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
 
  public:
-  CompositionUnderline(unsigned start_offset,
-                       unsigned end_offset,
-                       const Color&,
-                       bool thick,
-                       const Color& background_color);
+  ImeTextSpan(unsigned start_offset,
+              unsigned end_offset,
+              const Color&,
+              bool thick,
+              const Color& background_color);
 
-  CompositionUnderline(const WebCompositionUnderline&);
+  ImeTextSpan(const WebImeTextSpan&);
 
   unsigned StartOffset() const { return start_offset_; }
   unsigned EndOffset() const { return end_offset_; }
@@ -62,4 +62,4 @@
 
 }  // namespace blink
 
-#endif  // CompositionUnderline_h
+#endif  // ImeTextSpan_h
diff --git a/third_party/WebKit/Source/core/editing/ImeTextSpanTest.cpp b/third_party/WebKit/Source/core/editing/ImeTextSpanTest.cpp
new file mode 100644
index 0000000..858b055
--- /dev/null
+++ b/third_party/WebKit/Source/core/editing/ImeTextSpanTest.cpp
@@ -0,0 +1,74 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/editing/ImeTextSpan.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace blink {
+namespace {
+
+ImeTextSpan CreateImeTextSpan(unsigned start_offset, unsigned end_offset) {
+  return ImeTextSpan(start_offset, end_offset, Color::kTransparent, false,
+                     Color::kTransparent);
+}
+
+TEST(ImeTextSpanTest, OneChar) {
+  ImeTextSpan ime_text_span = CreateImeTextSpan(0, 1);
+  EXPECT_EQ(0u, ime_text_span.StartOffset());
+  EXPECT_EQ(1u, ime_text_span.EndOffset());
+}
+
+TEST(ImeTextSpanTest, MultiChar) {
+  ImeTextSpan ime_text_span = CreateImeTextSpan(0, 5);
+  EXPECT_EQ(0u, ime_text_span.StartOffset());
+  EXPECT_EQ(5u, ime_text_span.EndOffset());
+}
+
+TEST(ImeTextSpanTest, ZeroLength) {
+  ImeTextSpan ime_text_span = CreateImeTextSpan(0, 0);
+  EXPECT_EQ(0u, ime_text_span.StartOffset());
+  EXPECT_EQ(1u, ime_text_span.EndOffset());
+}
+
+TEST(ImeTextSpanTest, ZeroLengthNonZeroStart) {
+  ImeTextSpan ime_text_span = CreateImeTextSpan(3, 3);
+  EXPECT_EQ(3u, ime_text_span.StartOffset());
+  EXPECT_EQ(4u, ime_text_span.EndOffset());
+}
+
+TEST(ImeTextSpanTest, EndBeforeStart) {
+  ImeTextSpan ime_text_span = CreateImeTextSpan(1, 0);
+  EXPECT_EQ(1u, ime_text_span.StartOffset());
+  EXPECT_EQ(2u, ime_text_span.EndOffset());
+}
+
+TEST(ImeTextSpanTest, LastChar) {
+  ImeTextSpan ime_text_span =
+      CreateImeTextSpan(std::numeric_limits<unsigned>::max() - 1,
+                        std::numeric_limits<unsigned>::max());
+  EXPECT_EQ(std::numeric_limits<unsigned>::max() - 1,
+            ime_text_span.StartOffset());
+  EXPECT_EQ(std::numeric_limits<unsigned>::max(), ime_text_span.EndOffset());
+}
+
+TEST(ImeTextSpanTest, LastCharEndBeforeStart) {
+  ImeTextSpan ime_text_span =
+      CreateImeTextSpan(std::numeric_limits<unsigned>::max(),
+                        std::numeric_limits<unsigned>::max() - 1);
+  EXPECT_EQ(std::numeric_limits<unsigned>::max() - 1,
+            ime_text_span.StartOffset());
+  EXPECT_EQ(std::numeric_limits<unsigned>::max(), ime_text_span.EndOffset());
+}
+
+TEST(ImeTextSpanTest, LastCharEndBeforeStartZeroEnd) {
+  ImeTextSpan ime_text_span =
+      CreateImeTextSpan(std::numeric_limits<unsigned>::max(), 0);
+  EXPECT_EQ(std::numeric_limits<unsigned>::max() - 1,
+            ime_text_span.StartOffset());
+  EXPECT_EQ(std::numeric_limits<unsigned>::max(), ime_text_span.EndOffset());
+}
+
+}  // namespace
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/CompositionUnderlineVectorBuilder.cpp b/third_party/WebKit/Source/core/editing/ImeTextSpanVectorBuilder.cpp
similarity index 84%
rename from third_party/WebKit/Source/core/editing/CompositionUnderlineVectorBuilder.cpp
rename to third_party/WebKit/Source/core/editing/ImeTextSpanVectorBuilder.cpp
index cccfebbb..d312a263 100644
--- a/third_party/WebKit/Source/core/editing/CompositionUnderlineVectorBuilder.cpp
+++ b/third_party/WebKit/Source/core/editing/ImeTextSpanVectorBuilder.cpp
@@ -28,17 +28,17 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include "core/editing/CompositionUnderlineVectorBuilder.h"
+#include "core/editing/ImeTextSpanVectorBuilder.h"
 
 namespace blink {
 
-Vector<CompositionUnderline> CompositionUnderlineVectorBuilder::Build(
-    const WebVector<WebCompositionUnderline>& underlines) {
-  Vector<CompositionUnderline> result;
-  size_t size = underlines.size();
+Vector<ImeTextSpan> ImeTextSpanVectorBuilder::Build(
+    const WebVector<WebImeTextSpan>& ime_text_spans) {
+  Vector<ImeTextSpan> result;
+  size_t size = ime_text_spans.size();
   result.ReserveCapacity(size);
   for (size_t i = 0; i < size; ++i)
-    result.push_back(underlines[i]);
+    result.push_back(ime_text_spans[i]);
   return result;
 }
 
diff --git a/third_party/WebKit/Source/core/editing/CompositionUnderlineVectorBuilder.h b/third_party/WebKit/Source/core/editing/ImeTextSpanVectorBuilder.h
similarity index 77%
rename from third_party/WebKit/Source/core/editing/CompositionUnderlineVectorBuilder.h
rename to third_party/WebKit/Source/core/editing/ImeTextSpanVectorBuilder.h
index 9b44790..fc658ec 100644
--- a/third_party/WebKit/Source/core/editing/CompositionUnderlineVectorBuilder.h
+++ b/third_party/WebKit/Source/core/editing/ImeTextSpanVectorBuilder.h
@@ -28,26 +28,26 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef CompositionUnderlineVectorBuilder_h
-#define CompositionUnderlineVectorBuilder_h
+#ifndef ImeTextSpanVectorBuilder_h
+#define ImeTextSpanVectorBuilder_h
 
 #include "core/CoreExport.h"
-#include "core/editing/CompositionUnderline.h"
+#include "core/editing/ImeTextSpan.h"
 #include "platform/wtf/Vector.h"
 #include "public/platform/WebVector.h"
-#include "public/web/WebCompositionUnderline.h"
+#include "public/web/WebImeTextSpan.h"
 
 namespace blink {
 
-// This class is used for converting from WebVector<WebCompositionUnderline>
-// to Vector<CompositionUnderline>.
+// This class is used for converting from WebVector<WebImeTextSpan>
+// to Vector<ImeTextSpan>.
 
-class CompositionUnderlineVectorBuilder {
-  STATIC_ONLY(CompositionUnderlineVectorBuilder);
+class ImeTextSpanVectorBuilder {
+  STATIC_ONLY(ImeTextSpanVectorBuilder);
 
  public:
-  CORE_EXPORT static Vector<CompositionUnderline> Build(
-      const WebVector<WebCompositionUnderline>&);
+  CORE_EXPORT static Vector<ImeTextSpan> Build(
+      const WebVector<WebImeTextSpan>&);
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/InputMethodController.cpp b/third_party/WebKit/Source/core/editing/InputMethodController.cpp
index 853f3d59..c78c81c 100644
--- a/third_party/WebKit/Source/core/editing/InputMethodController.cpp
+++ b/third_party/WebKit/Source/core/editing/InputMethodController.cpp
@@ -432,14 +432,14 @@
 
 bool InputMethodController::CommitText(
     const String& text,
-    const Vector<CompositionUnderline>& underlines,
+    const Vector<ImeTextSpan>& ime_text_spans,
     int relative_caret_position) {
   if (HasComposition()) {
     return ReplaceCompositionAndMoveCaret(text, relative_caret_position,
-                                          underlines);
+                                          ime_text_spans);
   }
 
-  return InsertTextAndMoveCaret(text, relative_caret_position, underlines);
+  return InsertTextAndMoveCaret(text, relative_caret_position, ime_text_spans);
 }
 
 bool InputMethodController::ReplaceComposition(const String& text) {
@@ -480,32 +480,34 @@
   return text_start + text_length + relative_caret_position;
 }
 
-void InputMethodController::AddCompositionUnderlines(
-    const Vector<CompositionUnderline>& underlines,
+void InputMethodController::AddImeTextSpans(
+    const Vector<ImeTextSpan>& ime_text_spans,
     ContainerNode* base_element,
     unsigned offset_in_plain_chars) {
-  for (const auto& underline : underlines) {
-    unsigned underline_start = offset_in_plain_chars + underline.StartOffset();
-    unsigned underline_end = offset_in_plain_chars + underline.EndOffset();
+  for (const auto& ime_text_span : ime_text_spans) {
+    unsigned ime_text_span_start =
+        offset_in_plain_chars + ime_text_span.StartOffset();
+    unsigned ime_text_span_end =
+        offset_in_plain_chars + ime_text_span.EndOffset();
 
     EphemeralRange ephemeral_line_range =
-        PlainTextRange(underline_start, underline_end)
+        PlainTextRange(ime_text_span_start, ime_text_span_end)
             .CreateRange(*base_element);
     if (ephemeral_line_range.IsNull())
       continue;
 
     GetDocument().Markers().AddCompositionMarker(
-        ephemeral_line_range, underline.GetColor(),
-        underline.Thick() ? StyleableMarker::Thickness::kThick
-                          : StyleableMarker::Thickness::kThin,
-        underline.BackgroundColor());
+        ephemeral_line_range, ime_text_span.GetColor(),
+        ime_text_span.Thick() ? StyleableMarker::Thickness::kThick
+                              : StyleableMarker::Thickness::kThin,
+        ime_text_span.BackgroundColor());
   }
 }
 
 bool InputMethodController::ReplaceCompositionAndMoveCaret(
     const String& text,
     int relative_caret_position,
-    const Vector<CompositionUnderline>& underlines) {
+    const Vector<ImeTextSpan>& ime_text_spans) {
   Element* root_editable_element =
       GetFrame()
           .Selection()
@@ -527,7 +529,7 @@
   // needs to be audited. see http://crbug.com/590369 for more details.
   GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheets();
 
-  AddCompositionUnderlines(underlines, root_editable_element, text_start);
+  AddImeTextSpans(ime_text_spans, root_editable_element, text_start);
 
   int absolute_caret_position = ComputeAbsoluteCaretPosition(
       text_start, text.length(), relative_caret_position);
@@ -545,7 +547,7 @@
 bool InputMethodController::InsertTextAndMoveCaret(
     const String& text,
     int relative_caret_position,
-    const Vector<CompositionUnderline>& underlines) {
+    const Vector<ImeTextSpan>& ime_text_spans) {
   PlainTextRange selection_range = GetSelectionOffsets();
   if (selection_range.IsNull())
     return false;
@@ -559,7 +561,7 @@
           .ComputeVisibleSelectionInDOMTreeDeprecated()
           .RootEditableElement();
   if (root_editable_element) {
-    AddCompositionUnderlines(underlines, root_editable_element, text_start);
+    AddImeTextSpans(ime_text_spans, root_editable_element, text_start);
   }
 
   int absolute_caret_position = ComputeAbsoluteCaretPosition(
@@ -598,7 +600,7 @@
 
 void InputMethodController::SetComposition(
     const String& text,
-    const Vector<CompositionUnderline>& underlines,
+    const Vector<ImeTextSpan>& ime_text_spans,
     int selection_start,
     int selection_end) {
   Editor::RevealSelectionScope reveal_selection_scope(&GetEditor());
@@ -719,7 +721,7 @@
   // We shouldn't close typing in the middle of setComposition.
   SetEditableSelectionOffsets(selected_range, TypingContinuation::kContinue);
 
-  if (underlines.IsEmpty()) {
+  if (ime_text_spans.IsEmpty()) {
     GetDocument().Markers().AddCompositionMarker(
         EphemeralRange(composition_range_), Color::kBlack,
         StyleableMarker::Thickness::kThin,
@@ -729,8 +731,8 @@
 
   const PlainTextRange composition_plain_text_range =
       PlainTextRange::Create(*base_node->parentNode(), *composition_range_);
-  AddCompositionUnderlines(underlines, base_node->parentNode(),
-                           composition_plain_text_range.Start());
+  AddImeTextSpans(ime_text_spans, base_node->parentNode(),
+                  composition_plain_text_range.Start());
 }
 
 PlainTextRange InputMethodController::CreateSelectionRangeForSetComposition(
@@ -745,7 +747,7 @@
 }
 
 void InputMethodController::SetCompositionFromExistingText(
-    const Vector<CompositionUnderline>& underlines,
+    const Vector<ImeTextSpan>& ime_text_spans,
     unsigned composition_start,
     unsigned composition_end) {
   Element* editable = GetFrame()
@@ -772,7 +774,7 @@
 
   Clear();
 
-  AddCompositionUnderlines(underlines, editable, composition_start);
+  AddImeTextSpans(ime_text_spans, editable, composition_start);
 
   has_composition_ = true;
   if (!composition_range_)
diff --git a/third_party/WebKit/Source/core/editing/InputMethodController.h b/third_party/WebKit/Source/core/editing/InputMethodController.h
index 88f1f25..40e62b2c 100644
--- a/third_party/WebKit/Source/core/editing/InputMethodController.h
+++ b/third_party/WebKit/Source/core/editing/InputMethodController.h
@@ -29,8 +29,8 @@
 #include "base/gtest_prod_util.h"
 #include "core/CoreExport.h"
 #include "core/dom/SynchronousMutationObserver.h"
-#include "core/editing/CompositionUnderline.h"
 #include "core/editing/EphemeralRange.h"
+#include "core/editing/ImeTextSpan.h"
 #include "core/editing/PlainTextRange.h"
 #include "platform/heap/Handle.h"
 #include "platform/wtf/Vector.h"
@@ -63,10 +63,10 @@
   // international text input composition
   bool HasComposition() const;
   void SetComposition(const String& text,
-                      const Vector<CompositionUnderline>& underlines,
+                      const Vector<ImeTextSpan>& ime_text_spans,
                       int selection_start,
                       int selection_end);
-  void SetCompositionFromExistingText(const Vector<CompositionUnderline>& text,
+  void SetCompositionFromExistingText(const Vector<ImeTextSpan>& ime_text_spans,
                                       unsigned composition_start,
                                       unsigned composition_end);
 
@@ -74,7 +74,7 @@
   // changes the selection according to relativeCaretPosition, which is
   // relative to the end of the inserting text.
   bool CommitText(const String& text,
-                  const Vector<CompositionUnderline>& underlines,
+                  const Vector<ImeTextSpan>& ime_text_spans,
                   int relative_caret_position);
 
   // Inserts ongoing composing text; changes the selection to the end of
@@ -134,14 +134,14 @@
   // Returns true if selection offsets were successfully set.
   bool SetSelectionOffsets(const PlainTextRange&);
 
-  void AddCompositionUnderlines(const Vector<CompositionUnderline>& underlines,
-                                ContainerNode* base_element,
-                                unsigned offset_in_plain_chars);
+  void AddImeTextSpans(const Vector<ImeTextSpan>& ime_text_spans,
+                       ContainerNode* base_element,
+                       unsigned offset_in_plain_chars);
 
   bool InsertText(const String&);
   bool InsertTextAndMoveCaret(const String&,
                               int relative_caret_position,
-                              const Vector<CompositionUnderline>& underlines);
+                              const Vector<ImeTextSpan>& ime_text_spans);
 
   // Inserts the given text string in the place of the existing composition.
   // Returns true if did replace.
@@ -151,7 +151,7 @@
   bool ReplaceCompositionAndMoveCaret(
       const String&,
       int relative_caret_position,
-      const Vector<CompositionUnderline>& underlines);
+      const Vector<ImeTextSpan>& ime_text_spans);
 
   // Returns true if moved caret successfully.
   bool MoveCaret(int new_caret_position);
diff --git a/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp b/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp
index c368cc3..f9b5775 100644
--- a/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp
+++ b/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp
@@ -171,9 +171,9 @@
   Element* div = InsertHTMLElement(
       "<div id='sample' contenteditable>hello world</div>", "sample");
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0));
-  Controller().SetCompositionFromExistingText(underlines, 0, 5);
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0));
+  Controller().SetCompositionFromExistingText(ime_text_spans, 0, 5);
 
   Range* range = Controller().CompositionRange();
   EXPECT_EQ(0u, range->startOffset());
@@ -189,8 +189,8 @@
   Element* div = InsertHTMLElement(
       "<div id='sample' contenteditable>&#x1f3c6</div>", "sample");
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0));
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 2, Color(255, 0, 0), false, 0));
 
   GetDocument().UpdateStyleAndLayout();
   Controller().SetEditableSelectionOffsets(PlainTextRange(2, 2));
@@ -205,25 +205,25 @@
                    .Extent()
                    .ComputeOffsetInContainerNode());
 
-  Controller().SetComposition(String("a"), underlines, 1, 1);
+  Controller().SetComposition(String("a"), ime_text_spans, 1, 1);
   EXPECT_STREQ("\xF0\x9F\x8F\x86\x61", div->innerText().Utf8().data());
 
-  Controller().SetComposition(String("ab"), underlines, 2, 2);
+  Controller().SetComposition(String("ab"), ime_text_spans, 2, 2);
   EXPECT_STREQ("\xF0\x9F\x8F\x86\x61\x62", div->innerText().Utf8().data());
 }
 
 TEST_F(InputMethodControllerTest, SetCompositionWithGraphemeCluster) {
   InsertHTMLElement("<div id='sample' contenteditable></div>", "sample");
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(6, 6, Color(255, 0, 0), false, 0));
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(6, 6, Color(255, 0, 0), false, 0));
   GetDocument().UpdateStyleAndLayout();
 
   // UTF16 = 0x0939 0x0947 0x0932 0x0932. Note that 0x0932 0x0932 is a grapheme
   // cluster.
   Controller().SetComposition(
       String::FromUTF8("\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA4\xB2"),
-      underlines, 4, 4);
+      ime_text_spans, 4, 4);
   EXPECT_EQ(4u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(4u, Controller().GetSelectionOffsets().End());
 
@@ -231,7 +231,7 @@
   Controller().SetComposition(
       String::FromUTF8("\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA5\x8D\xE0"
                        "\xA4\xB2\xE0\xA5\x8B"),
-      underlines, 6, 6);
+      ime_text_spans, 6, 6);
   EXPECT_EQ(6u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(6u, Controller().GetSelectionOffsets().End());
 }
@@ -241,9 +241,8 @@
   Element* div =
       InsertHTMLElement("<div id='sample' contenteditable></div>", "sample");
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(
-      CompositionUnderline(12, 12, Color(255, 0, 0), false, 0));
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(12, 12, Color(255, 0, 0), false, 0));
   GetDocument().UpdateStyleAndLayout();
 
   // UTF16 = 0x0939 0x0947 0x0932 0x094D 0x0932 0x094B. 0x0939 0x0947 0x0932 is
@@ -251,9 +250,9 @@
   Controller().CommitText(
       String::FromUTF8("\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA5\x8D\xE0"
                        "\xA4\xB2\xE0\xA5\x8B"),
-      underlines, 1);
-  Controller().CommitText("\nab ", underlines, 1);
-  Controller().SetComposition(String("c"), underlines, 1, 1);
+      ime_text_spans, 1);
+  Controller().CommitText("\nab ", ime_text_spans, 1);
+  Controller().SetComposition(String("c"), ime_text_spans, 1, 1);
   EXPECT_STREQ(
       "\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA5\x8D\xE0\xA4\xB2\xE0\xA5"
       "\x8B\nab c",
@@ -261,7 +260,7 @@
   EXPECT_EQ(11u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(11u, Controller().GetSelectionOffsets().End());
 
-  Controller().SetComposition(String("cd"), underlines, 2, 2);
+  Controller().SetComposition(String("cd"), ime_text_spans, 2, 2);
   EXPECT_STREQ(
       "\xE0\xA4\xB9\xE0\xA5\x87\xE0\xA4\xB2\xE0\xA5\x8D\xE0\xA4\xB2\xE0\xA5"
       "\x8B\nab cd",
@@ -276,26 +275,26 @@
       "contenteditable>abc1<b>2</b>34567<b>8</b>9d<b>e</b>f</div>",
       "sample");
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(3, 12, Color(255, 0, 0), false, 0));
-  Controller().SetCompositionFromExistingText(underlines, 3, 12);
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(3, 12, Color(255, 0, 0), false, 0));
+  Controller().SetCompositionFromExistingText(ime_text_spans, 3, 12);
 
   // Subtract a character.
-  Controller().SetComposition(String("12345789"), underlines, 8, 8);
+  Controller().SetComposition(String("12345789"), ime_text_spans, 8, 8);
   EXPECT_STREQ("abc1<b>2</b>3457<b>8</b>9d<b>e</b>f",
                div->innerHTML().Utf8().data());
   EXPECT_EQ(11u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(11u, Controller().GetSelectionOffsets().End());
 
   // Append a character.
-  Controller().SetComposition(String("123456789"), underlines, 9, 9);
+  Controller().SetComposition(String("123456789"), ime_text_spans, 9, 9);
   EXPECT_STREQ("abc1<b>2</b>34567<b>8</b>9d<b>e</b>f",
                div->innerHTML().Utf8().data());
   EXPECT_EQ(12u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(12u, Controller().GetSelectionOffsets().End());
 
   // Subtract and append characters.
-  Controller().SetComposition(String("123hello789"), underlines, 11, 11);
+  Controller().SetComposition(String("123hello789"), ime_text_spans, 11, 11);
   EXPECT_STREQ("abc1<b>2</b>3hello7<b>8</b>9d<b>e</b>f",
                div->innerHTML().Utf8().data());
 }
@@ -305,19 +304,19 @@
   Element* div = InsertHTMLElement(
       "<div id='sample' contenteditable><b>&#x1f3e0</b></div>", "sample");
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0));
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 2, Color(255, 0, 0), false, 0));
 
-  Controller().SetCompositionFromExistingText(underlines, 0, 2);
+  Controller().SetCompositionFromExistingText(ime_text_spans, 0, 2);
 
   // 0xF0 0x9F 0x8F 0xAB is also an emoji character, with the same leading
   // surrogate pair to the previous one.
-  Controller().SetComposition(String::FromUTF8("\xF0\x9F\x8F\xAB"), underlines,
-                              2, 2);
+  Controller().SetComposition(String::FromUTF8("\xF0\x9F\x8F\xAB"),
+                              ime_text_spans, 2, 2);
   EXPECT_STREQ("<b>\xF0\x9F\x8F\xAB</b>", div->innerHTML().Utf8().data());
 
-  Controller().SetComposition(String::FromUTF8("\xF0\x9F\x8F\xA0"), underlines,
-                              2, 2);
+  Controller().SetComposition(String::FromUTF8("\xF0\x9F\x8F\xA0"),
+                              ime_text_spans, 2, 2);
   EXPECT_STREQ("<b>\xF0\x9F\x8F\xA0</b>", div->innerHTML().Utf8().data());
 }
 
@@ -329,19 +328,19 @@
   Element* div = InsertHTMLElement(
       "<div id='sample' contenteditable><b>&#xc03</b></div>", "sample");
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0));
-  Controller().SetCompositionFromExistingText(underlines, 0, 1);
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 2, Color(255, 0, 0), false, 0));
+  Controller().SetCompositionFromExistingText(ime_text_spans, 0, 1);
 
   // 0xE0 0xB0 0x83 0xE0 0xB0 0x83, a telugu character with 2 code points in
   // 1 grapheme cluster.
   Controller().SetComposition(String::FromUTF8("\xE0\xB0\x83\xE0\xB0\x83"),
-                              underlines, 2, 2);
+                              ime_text_spans, 2, 2);
   EXPECT_STREQ("<b>\xE0\xB0\x83\xE0\xB0\x83</b>",
                div->innerHTML().Utf8().data());
 
-  Controller().SetComposition(String::FromUTF8("\xE0\xB0\x83"), underlines, 1,
-                              1);
+  Controller().SetComposition(String::FromUTF8("\xE0\xB0\x83"), ime_text_spans,
+                              1, 1);
   EXPECT_STREQ("<b>\xE0\xB0\x83</b>", div->innerHTML().Utf8().data());
 }
 
@@ -351,11 +350,11 @@
       "contenteditable>abc1<b>2</b>34567<b>8</b>9</div>",
       "sample");
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(3, 12, Color(255, 0, 0), false, 0));
-  Controller().SetCompositionFromExistingText(underlines, 3, 12);
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(3, 12, Color(255, 0, 0), false, 0));
+  Controller().SetCompositionFromExistingText(ime_text_spans, 3, 12);
 
-  Controller().SetComposition(String("123hello789"), underlines, 11, 11);
+  Controller().SetComposition(String("123hello789"), ime_text_spans, 11, 11);
   EXPECT_STREQ("abc1<b>2</b>3hello7<b>8</b>9", div->innerHTML().Utf8().data());
 
   Controller().FinishComposingText(InputMethodController::kKeepSelection);
@@ -368,21 +367,21 @@
       "contenteditable>abc1<b>2</b>34567<b>8</b>9</div>",
       "sample");
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(3, 12, Color(255, 0, 0), false, 0));
-  Controller().SetCompositionFromExistingText(underlines, 3, 12);
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(3, 12, Color(255, 0, 0), false, 0));
+  Controller().SetCompositionFromExistingText(ime_text_spans, 3, 12);
 
-  Controller().CommitText(String("123789"), underlines, 0);
+  Controller().CommitText(String("123789"), ime_text_spans, 0);
   EXPECT_STREQ("abc1<b>2</b>37<b>8</b>9", div->innerHTML().Utf8().data());
 }
 
 TEST_F(InputMethodControllerTest, InsertTextWithNewLine) {
   Element* div =
       InsertHTMLElement("<div id='sample' contenteditable></div>", "sample");
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 11, Color(255, 0, 0), false, 0));
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 11, Color(255, 0, 0), false, 0));
 
-  Controller().CommitText(String("hello\nworld"), underlines, 0);
+  Controller().CommitText(String("hello\nworld"), ime_text_spans, 0);
   EXPECT_STREQ("hello<div>world</div>", div->innerHTML().Utf8().data());
 }
 
@@ -390,12 +389,12 @@
   Element* div =
       InsertHTMLElement("<div id='sample' contenteditable></div>", "sample");
 
-  Vector<CompositionUnderline> underlines;
-  Controller().CommitText("a", underlines, 0);
-  Controller().SetComposition("bcd", underlines, 0, 2);
+  Vector<ImeTextSpan> ime_text_spans;
+  Controller().CommitText("a", ime_text_spans, 0);
+  Controller().SetComposition("bcd", ime_text_spans, 0, 2);
   EXPECT_STREQ("abcd", div->innerHTML().Utf8().data());
 
-  Controller().CommitText(String("bcd\nefgh\nijkl"), underlines, 0);
+  Controller().CommitText(String("bcd\nefgh\nijkl"), ime_text_spans, 0);
   EXPECT_STREQ("abcd<div>efgh</div><div>ijkl</div>",
                div->innerHTML().Utf8().data());
 }
@@ -404,9 +403,9 @@
   InsertHTMLElement("<div id='sample' contenteditable>hello world</div>",
                     "sample");
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0));
-  Controller().SetCompositionFromExistingText(underlines, 0, 5);
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0));
+  Controller().SetCompositionFromExistingText(ime_text_spans, 0, 5);
 
   Controller().FinishComposingText(InputMethodController::kKeepSelection);
   EXPECT_EQ(0, GetFrame()
@@ -439,11 +438,11 @@
   Controller().ExtendSelectionAndDelete(1, 0);
   EXPECT_STREQ("foo", input->value().Utf8().data());
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 3, Color(255, 0, 0), false, 0));
-  Controller().SetCompositionFromExistingText(underlines, 0, 3);
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 3, Color(255, 0, 0), false, 0));
+  Controller().SetCompositionFromExistingText(ime_text_spans, 0, 3);
 
-  Controller().SetComposition(String(""), underlines, 0, 3);
+  Controller().SetComposition(String(""), ime_text_spans, 0, 3);
 
   EXPECT_STREQ("", input->value().Utf8().data());
 }
@@ -455,9 +454,9 @@
   Element* div = InsertHTMLElement(
       "<div id='sample' contenteditable>\nhello world</div>", "sample");
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0));
-  Controller().SetCompositionFromExistingText(underlines, 0, 5);
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0));
+  Controller().SetCompositionFromExistingText(ime_text_spans, 0, 5);
 
   Range* range = Controller().CompositionRange();
   EXPECT_EQ(1u, range->startOffset());
@@ -472,9 +471,9 @@
        SetCompositionFromExistingTextWithInvalidOffsets) {
   InsertHTMLElement("<div id='sample' contenteditable>test</div>", "sample");
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(7, 8, Color(255, 0, 0), false, 0));
-  Controller().SetCompositionFromExistingText(underlines, 7, 8);
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(7, 8, Color(255, 0, 0), false, 0));
+  Controller().SetCompositionFromExistingText(ime_text_spans, 7, 8);
 
   EXPECT_FALSE(Controller().CompositionRange());
 }
@@ -483,9 +482,9 @@
   HTMLInputElement* input = toHTMLInputElement(InsertHTMLElement(
       "<input id='sample' type='password' size='24'>", "sample"));
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0));
-  Controller().SetComposition("foo", underlines, 0, 3);
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0));
+  Controller().SetComposition("foo", ime_text_spans, 0, 3);
   Controller().FinishComposingText(InputMethodController::kKeepSelection);
 
   EXPECT_STREQ("foo", input->value().Utf8().data());
@@ -936,47 +935,47 @@
   EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(2u, Controller().GetSelectionOffsets().End());
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0));
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 2, Color(255, 0, 0), false, 0));
 
   // The caret exceeds left boundary.
   // "*heABllo", where * stands for caret.
-  Controller().SetComposition("AB", underlines, -100, -100);
+  Controller().SetComposition("AB", ime_text_spans, -100, -100);
   EXPECT_STREQ("heABllo", input->value().Utf8().data());
   EXPECT_EQ(0u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(0u, Controller().GetSelectionOffsets().End());
 
   // The caret is on left boundary.
   // "*heABllo".
-  Controller().SetComposition("AB", underlines, -2, -2);
+  Controller().SetComposition("AB", ime_text_spans, -2, -2);
   EXPECT_STREQ("heABllo", input->value().Utf8().data());
   EXPECT_EQ(0u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(0u, Controller().GetSelectionOffsets().End());
 
   // The caret is before the composing text.
   // "he*ABllo".
-  Controller().SetComposition("AB", underlines, 0, 0);
+  Controller().SetComposition("AB", ime_text_spans, 0, 0);
   EXPECT_STREQ("heABllo", input->value().Utf8().data());
   EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(2u, Controller().GetSelectionOffsets().End());
 
   // The caret is after the composing text.
   // "heAB*llo".
-  Controller().SetComposition("AB", underlines, 2, 2);
+  Controller().SetComposition("AB", ime_text_spans, 2, 2);
   EXPECT_STREQ("heABllo", input->value().Utf8().data());
   EXPECT_EQ(4u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(4u, Controller().GetSelectionOffsets().End());
 
   // The caret is on right boundary.
   // "heABllo*".
-  Controller().SetComposition("AB", underlines, 5, 5);
+  Controller().SetComposition("AB", ime_text_spans, 5, 5);
   EXPECT_STREQ("heABllo", input->value().Utf8().data());
   EXPECT_EQ(7u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(7u, Controller().GetSelectionOffsets().End());
 
   // The caret exceeds right boundary.
   // "heABllo*".
-  Controller().SetComposition("AB", underlines, 100, 100);
+  Controller().SetComposition("AB", ime_text_spans, 100, 100);
   EXPECT_STREQ("heABllo", input->value().Utf8().data());
   EXPECT_EQ(7u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(7u, Controller().GetSelectionOffsets().End());
@@ -1000,82 +999,82 @@
   EXPECT_EQ(17u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(17u, Controller().GetSelectionOffsets().End());
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0));
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 2, Color(255, 0, 0), false, 0));
 
   // The caret exceeds left boundary.
   // "*hello\nworld\n01234AB56789", where * stands for caret.
-  Controller().SetComposition("AB", underlines, -100, -100);
+  Controller().SetComposition("AB", ime_text_spans, -100, -100);
   EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data());
   EXPECT_EQ(0u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(0u, Controller().GetSelectionOffsets().End());
 
   // The caret is on left boundary.
   // "*hello\nworld\n01234AB56789".
-  Controller().SetComposition("AB", underlines, -17, -17);
+  Controller().SetComposition("AB", ime_text_spans, -17, -17);
   EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data());
   EXPECT_EQ(0u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(0u, Controller().GetSelectionOffsets().End());
 
   // The caret is in the 1st node.
   // "he*llo\nworld\n01234AB56789".
-  Controller().SetComposition("AB", underlines, -15, -15);
+  Controller().SetComposition("AB", ime_text_spans, -15, -15);
   EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data());
   EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(2u, Controller().GetSelectionOffsets().End());
 
   // The caret is on right boundary of the 1st node.
   // "hello*\nworld\n01234AB56789".
-  Controller().SetComposition("AB", underlines, -12, -12);
+  Controller().SetComposition("AB", ime_text_spans, -12, -12);
   EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data());
   EXPECT_EQ(5u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(5u, Controller().GetSelectionOffsets().End());
 
   // The caret is on right boundary of the 2nd node.
   // "hello\n*world\n01234AB56789".
-  Controller().SetComposition("AB", underlines, -11, -11);
+  Controller().SetComposition("AB", ime_text_spans, -11, -11);
   EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data());
   EXPECT_EQ(6u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(6u, Controller().GetSelectionOffsets().End());
 
   // The caret is on right boundary of the 3rd node.
   // "hello\nworld*\n01234AB56789".
-  Controller().SetComposition("AB", underlines, -6, -6);
+  Controller().SetComposition("AB", ime_text_spans, -6, -6);
   EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data());
   EXPECT_EQ(11u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(11u, Controller().GetSelectionOffsets().End());
 
   // The caret is on right boundary of the 4th node.
   // "hello\nworld\n*01234AB56789".
-  Controller().SetComposition("AB", underlines, -5, -5);
+  Controller().SetComposition("AB", ime_text_spans, -5, -5);
   EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data());
   EXPECT_EQ(12u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(12u, Controller().GetSelectionOffsets().End());
 
   // The caret is before the composing text.
   // "hello\nworld\n01234*AB56789".
-  Controller().SetComposition("AB", underlines, 0, 0);
+  Controller().SetComposition("AB", ime_text_spans, 0, 0);
   EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data());
   EXPECT_EQ(17u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(17u, Controller().GetSelectionOffsets().End());
 
   // The caret is after the composing text.
   // "hello\nworld\n01234AB*56789".
-  Controller().SetComposition("AB", underlines, 2, 2);
+  Controller().SetComposition("AB", ime_text_spans, 2, 2);
   EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data());
   EXPECT_EQ(19u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(19u, Controller().GetSelectionOffsets().End());
 
   // The caret is on right boundary.
   // "hello\nworld\n01234AB56789*".
-  Controller().SetComposition("AB", underlines, 7, 7);
+  Controller().SetComposition("AB", ime_text_spans, 7, 7);
   EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data());
   EXPECT_EQ(24u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(24u, Controller().GetSelectionOffsets().End());
 
   // The caret exceeds right boundary.
   // "hello\nworld\n01234AB56789*".
-  Controller().SetComposition("AB", underlines, 100, 100);
+  Controller().SetComposition("AB", ime_text_spans, 100, 100);
   EXPECT_STREQ("hello\nworld\n01234AB56789", div->innerText().Utf8().data());
   EXPECT_EQ(24u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(24u, Controller().GetSelectionOffsets().End());
@@ -1090,20 +1089,20 @@
   EXPECT_EQ(2u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(2u, Controller().GetSelectionOffsets().End());
 
-  Vector<CompositionUnderline> underlines0;
-  underlines0.push_back(CompositionUnderline(0, 0, Color(255, 0, 0), false, 0));
-  Vector<CompositionUnderline> underlines2;
-  underlines2.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0));
+  Vector<ImeTextSpan> ime_text_spans0;
+  ime_text_spans0.push_back(ImeTextSpan(0, 0, Color(255, 0, 0), false, 0));
+  Vector<ImeTextSpan> ime_text_spans2;
+  ime_text_spans2.push_back(ImeTextSpan(0, 2, Color(255, 0, 0), false, 0));
 
-  Controller().SetComposition("AB", underlines2, 2, 2);
+  Controller().SetComposition("AB", ime_text_spans2, 2, 2);
   // With previous composition.
-  Controller().SetComposition("", underlines0, 2, 2);
+  Controller().SetComposition("", ime_text_spans0, 2, 2);
   EXPECT_STREQ("hello", div->innerText().Utf8().data());
   EXPECT_EQ(4u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(4u, Controller().GetSelectionOffsets().End());
 
   // Without previous composition.
-  Controller().SetComposition("", underlines0, -1, -1);
+  Controller().SetComposition("", ime_text_spans0, -1, -1);
   EXPECT_STREQ("hello", div->innerText().Utf8().data());
   EXPECT_EQ(3u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(3u, Controller().GetSelectionOffsets().End());
@@ -1113,9 +1112,9 @@
   Element* div =
       InsertHTMLElement("<div id='sample' contenteditable></div>", "sample");
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0));
-  Controller().SetComposition("hello", underlines, 5, 5);
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0));
+  Controller().SetComposition("hello", ime_text_spans, 5, 5);
   EXPECT_STREQ("hello", div->innerText().Utf8().data());
   EXPECT_EQ(5u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(5u, Controller().GetSelectionOffsets().End());
@@ -1130,9 +1129,9 @@
   Element* div =
       InsertHTMLElement("<div id='sample' contenteditable></div>", "sample");
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 2, Color(255, 0, 0), false, 0));
-  Controller().CommitText("hello", underlines, 0);
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 2, Color(255, 0, 0), false, 0));
+  Controller().CommitText("hello", ime_text_spans, 0);
   EXPECT_STREQ("hello", div->innerText().Utf8().data());
 
   Controller().SetEditableSelectionOffsets(PlainTextRange(2, 2));
@@ -1161,17 +1160,17 @@
   GetDocument().View()->UpdateAllLifecyclePhases();
 
   // Simulate composition in the |contentEditable|.
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0));
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0));
   editable->focus();
 
   GetDocument().setTitle(g_empty_string);
-  Controller().SetComposition("foo", underlines, 0, 3);
+  Controller().SetComposition("foo", ime_text_spans, 0, 3);
   EXPECT_STREQ("beforeinput.isComposing:true;input.isComposing:true;",
                GetDocument().title().Utf8().data());
 
   GetDocument().setTitle(g_empty_string);
-  Controller().CommitText("bar", underlines, 0);
+  Controller().CommitText("bar", ime_text_spans, 0);
   // Last pair of InputEvent should also be inside composition scope.
   EXPECT_STREQ("beforeinput.isComposing:true;input.isComposing:true;",
                GetDocument().title().Utf8().data());
@@ -1181,17 +1180,17 @@
   CreateHTMLWithCompositionInputEventListeners();
 
   // Simulate composition in the |contentEditable|.
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0));
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0));
 
   GetDocument().setTitle(g_empty_string);
-  Controller().SetComposition("hell", underlines, 4, 4);
+  Controller().SetComposition("hell", ime_text_spans, 4, 4);
   EXPECT_STREQ("beforeinput.data:hell;input.data:hell;",
                GetDocument().title().Utf8().data());
 
   // Replace the existing composition.
   GetDocument().setTitle(g_empty_string);
-  Controller().SetComposition("hello", underlines, 0, 0);
+  Controller().SetComposition("hello", ime_text_spans, 0, 0);
   EXPECT_STREQ("beforeinput.data:hello;input.data:hello;",
                GetDocument().title().Utf8().data());
 }
@@ -1200,11 +1199,11 @@
   CreateHTMLWithCompositionInputEventListeners();
 
   // Simulate composition in the |contentEditable|.
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0));
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0));
 
   GetDocument().setTitle(g_empty_string);
-  Controller().SetComposition("hello", underlines, 5, 5);
+  Controller().SetComposition("hello", ime_text_spans, 5, 5);
   EXPECT_STREQ("beforeinput.data:hello;input.data:hello;",
                GetDocument().title().Utf8().data());
 
@@ -1219,17 +1218,17 @@
   CreateHTMLWithCompositionInputEventListeners();
 
   // Simulate composition in the |contentEditable|.
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0));
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0));
 
   GetDocument().setTitle(g_empty_string);
-  Controller().SetComposition("hello", underlines, 5, 5);
+  Controller().SetComposition("hello", ime_text_spans, 5, 5);
   EXPECT_STREQ("beforeinput.data:hello;input.data:hello;",
                GetDocument().title().Utf8().data());
 
   // Delete the existing composition.
   GetDocument().setTitle(g_empty_string);
-  Controller().SetComposition("", underlines, 0, 0);
+  Controller().SetComposition("", ime_text_spans, 0, 0);
   EXPECT_STREQ("beforeinput.data:;input.data:null;compositionend.data:;",
                GetDocument().title().Utf8().data());
 }
@@ -1238,25 +1237,25 @@
   CreateHTMLWithCompositionInputEventListeners();
 
   // Simulate composition in the |contentEditable|.
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0));
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0));
 
   // Insert new text without previous composition.
   GetDocument().setTitle(g_empty_string);
   GetDocument().UpdateStyleAndLayout();
-  Controller().CommitText("hello", underlines, 0);
+  Controller().CommitText("hello", ime_text_spans, 0);
   EXPECT_STREQ("beforeinput.data:hello;input.data:hello;",
                GetDocument().title().Utf8().data());
 
   GetDocument().setTitle(g_empty_string);
-  Controller().SetComposition("n", underlines, 1, 1);
+  Controller().SetComposition("n", ime_text_spans, 1, 1);
   EXPECT_STREQ("beforeinput.data:n;input.data:n;",
                GetDocument().title().Utf8().data());
 
   // Insert new text with previous composition.
   GetDocument().setTitle(g_empty_string);
   GetDocument().UpdateStyleAndLayout();
-  Controller().CommitText("hello", underlines, 1);
+  Controller().CommitText("hello", ime_text_spans, 1);
   EXPECT_STREQ(
       "beforeinput.data:hello;input.data:hello;compositionend.data:hello;",
       GetDocument().title().Utf8().data());
@@ -1266,24 +1265,24 @@
   CreateHTMLWithCompositionInputEventListeners();
 
   // Simulate composition in the |contentEditable|.
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0));
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0));
 
   // Insert empty text without previous composition.
   GetDocument().setTitle(g_empty_string);
   GetDocument().UpdateStyleAndLayout();
-  Controller().CommitText("", underlines, 0);
+  Controller().CommitText("", ime_text_spans, 0);
   EXPECT_STREQ("beforeinput.data:;", GetDocument().title().Utf8().data());
 
   GetDocument().setTitle(g_empty_string);
-  Controller().SetComposition("n", underlines, 1, 1);
+  Controller().SetComposition("n", ime_text_spans, 1, 1);
   EXPECT_STREQ("beforeinput.data:n;input.data:n;",
                GetDocument().title().Utf8().data());
 
   // Insert empty text with previous composition.
   GetDocument().setTitle(g_empty_string);
   GetDocument().UpdateStyleAndLayout();
-  Controller().CommitText("", underlines, 1);
+  Controller().CommitText("", ime_text_spans, 1);
   EXPECT_STREQ("beforeinput.data:;input.data:null;compositionend.data:;",
                GetDocument().title().Utf8().data());
 }
@@ -1292,10 +1291,10 @@
   CreateHTMLWithCompositionEndEventListener(kNoSelection);
 
   // Simulate composition in the |contentEditable|.
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0));
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0));
 
-  Controller().SetComposition("hello", underlines, 1, 1);
+  Controller().SetComposition("hello", ime_text_spans, 1, 1);
   GetDocument().UpdateStyleAndLayout();
   EXPECT_EQ(1u, Controller().GetSelectionOffsets().Start());
   EXPECT_EQ(1u, Controller().GetSelectionOffsets().End());
@@ -1314,7 +1313,7 @@
   EXPECT_EQ(kWebTextInputTypeText, Controller().TextInputType());
 
   // The test requires non-empty composition.
-  Controller().SetComposition("hello", Vector<CompositionUnderline>(), 5, 5);
+  Controller().SetComposition("hello", Vector<ImeTextSpan>(), 5, 5);
   EXPECT_EQ(kWebTextInputTypeText, Controller().TextInputType());
 
   // Remove element 'a'.
@@ -1331,8 +1330,8 @@
 TEST_F(InputMethodControllerTest, ReflectsSpaceWithoutNbspMangling) {
   InsertHTMLElement("<div id='sample' contenteditable></div>", "sample");
 
-  Vector<CompositionUnderline> underlines;
-  Controller().CommitText(String("  "), underlines, 0);
+  Vector<ImeTextSpan> ime_text_spans;
+  Controller().CommitText(String("  "), ime_text_spans, 0);
 
   // In a contenteditable, multiple spaces or a space at the edge needs to be
   // nbsp to affect layout properly, but it confuses some IMEs (particularly
@@ -1342,13 +1341,13 @@
   EXPECT_EQ(' ', Controller().TextInputInfo().value.Ascii()[1]);
 }
 
-TEST_F(InputMethodControllerTest, SetCompositionPlainTextWithUnderline) {
+TEST_F(InputMethodControllerTest, SetCompositionPlainTextWithIme_Span) {
   InsertHTMLElement("<div id='sample' contenteditable></div>", "sample");
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 1, Color(255, 0, 0), false, 0));
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 1, Color(255, 0, 0), false, 0));
 
-  Controller().SetComposition(" ", underlines, 1, 1);
+  Controller().SetComposition(" ", ime_text_spans, 1, 1);
 
   ASSERT_EQ(1u, GetDocument().Markers().Markers().size());
 
@@ -1356,17 +1355,17 @@
   EXPECT_EQ(1u, GetDocument().Markers().Markers()[0]->EndOffset());
 }
 
-TEST_F(InputMethodControllerTest, CommitPlainTextWithUnderlineInsert) {
+TEST_F(InputMethodControllerTest, CommitPlainTextWithIme_SpanInsert) {
   InsertHTMLElement("<div id='sample' contenteditable>Initial text.</div>",
                     "sample");
 
-  Vector<CompositionUnderline> underlines;
+  Vector<ImeTextSpan> ime_text_spans;
 
   Controller().SetEditableSelectionOffsets(PlainTextRange(8, 8));
 
-  underlines.push_back(CompositionUnderline(1, 11, Color(255, 0, 0), false, 0));
+  ime_text_spans.push_back(ImeTextSpan(1, 11, Color(255, 0, 0), false, 0));
 
-  Controller().CommitText(String("underlined"), underlines, 0);
+  Controller().CommitText(String("ime_text_spand"), ime_text_spans, 0);
 
   ASSERT_EQ(1u, GetDocument().Markers().Markers().size());
 
@@ -1374,17 +1373,17 @@
   EXPECT_EQ(19u, GetDocument().Markers().Markers()[0]->EndOffset());
 }
 
-TEST_F(InputMethodControllerTest, CommitPlainTextWithUnderlineReplace) {
+TEST_F(InputMethodControllerTest, CommitPlainTextWithIme_SpanReplace) {
   InsertHTMLElement("<div id='sample' contenteditable>Initial text.</div>",
                     "sample");
 
-  Vector<CompositionUnderline> underlines;
+  Vector<ImeTextSpan> ime_text_spans;
 
-  Controller().SetCompositionFromExistingText(underlines, 8, 12);
+  Controller().SetCompositionFromExistingText(ime_text_spans, 8, 12);
 
-  underlines.push_back(CompositionUnderline(1, 11, Color(255, 0, 0), false, 0));
+  ime_text_spans.push_back(ImeTextSpan(1, 11, Color(255, 0, 0), false, 0));
 
-  Controller().CommitText(String("string"), underlines, 0);
+  Controller().CommitText(String("string"), ime_text_spans, 0);
 
   ASSERT_EQ(1u, GetDocument().Markers().Markers().size());
 
@@ -1392,23 +1391,22 @@
   EXPECT_EQ(15u, GetDocument().Markers().Markers()[0]->EndOffset());
 }
 
-TEST_F(InputMethodControllerTest,
-       CompositionUnderlineAppearsCorrectlyAfterNewline) {
+TEST_F(InputMethodControllerTest, ImeTextSpanAppearsCorrectlyAfterNewline) {
   Element* div =
       InsertHTMLElement("<div id='sample' contenteditable></div>", "sample");
 
-  Vector<CompositionUnderline> underlines;
-  Controller().SetComposition(String("hello"), underlines, 6, 6);
+  Vector<ImeTextSpan> ime_text_spans;
+  Controller().SetComposition(String("hello"), ime_text_spans, 6, 6);
   Controller().FinishComposingText(InputMethodController::kKeepSelection);
   GetFrame().GetEditor().InsertLineBreak();
 
-  Controller().SetCompositionFromExistingText(underlines, 8, 8);
+  Controller().SetCompositionFromExistingText(ime_text_spans, 8, 8);
 
-  underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0));
-  Controller().SetComposition(String("world"), underlines, 0, 0);
+  ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0));
+  Controller().SetComposition(String("world"), ime_text_spans, 0, 0);
   ASSERT_EQ(1u, GetDocument().Markers().Markers().size());
 
-  // Verify composition underline shows up on the second line, not the first
+  // Verify composition marker shows up on the second line, not the first
   ASSERT_FALSE(GetDocument().Markers().MarkerAtPosition(
       PlainTextRange(2).CreateRange(*div).StartPosition(),
       DocumentMarker::AllMarkers()));
@@ -1429,9 +1427,9 @@
   editable->focus();
 
   // Simulate composition in the |contentEditable|.
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 5, Color(255, 0, 0), false, 0));
-  Controller().SetComposition("foo", underlines, 3, 3);
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 5, Color(255, 0, 0), false, 0));
+  Controller().SetComposition("foo", ime_text_spans, 3, 3);
 
   EXPECT_TRUE(Controller().HasComposition());
   EXPECT_EQ(0u, Controller().CompositionRange()->startOffset());
@@ -1474,11 +1472,11 @@
   GetDocument().UpdateStyleAndLayout();
   Controller().SetEditableSelectionOffsets(PlainTextRange(4, 4));
 
-  Vector<CompositionUnderline> underlines;
-  underlines.push_back(CompositionUnderline(0, 3, Color(255, 0, 0), false, 0));
-  Controller().SetComposition(String("def"), underlines, 0, 3);
-  Controller().SetComposition(String(""), underlines, 0, 3);
-  Controller().CommitText(String("def"), underlines, 0);
+  Vector<ImeTextSpan> ime_text_spans;
+  ime_text_spans.push_back(ImeTextSpan(0, 3, Color(255, 0, 0), false, 0));
+  Controller().SetComposition(String("def"), ime_text_spans, 0, 3);
+  Controller().SetComposition(String(""), ime_text_spans, 0, 3);
+  Controller().CommitText(String("def"), ime_text_spans, 0);
 
   EXPECT_STREQ("abc\ndef", textarea->value().Utf8().data());
 }
@@ -1488,17 +1486,17 @@
       "<div id='sample' contenteditable>Initial text blah</div>", "sample");
 
   // Delete "Initial"
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 0, 7);
-  Controller().CommitText(String(""), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 7);
+  Controller().CommitText(String(""), empty_ime_text_spans, 0);
 
   // The space at the beginning of the string should have been converted to an
   // nbsp
   EXPECT_STREQ("&nbsp;text blah", div->innerHTML().Utf8().data());
 
   // Delete "blah"
-  Controller().SetCompositionFromExistingText(empty_underlines, 6, 10);
-  Controller().CommitText(String(""), empty_underlines, 0);
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 6, 10);
+  Controller().CommitText(String(""), empty_ime_text_spans, 0);
 
   // The space at the end of the string should have been converted to an nbsp
   EXPECT_STREQ("&nbsp;text&nbsp;", div->innerHTML().Utf8().data());
@@ -1510,13 +1508,13 @@
 
   input->setValue("Abc Def Ghi");
   GetDocument().UpdateStyleAndLayout();
-  Vector<CompositionUnderline> empty_underlines;
+  Vector<ImeTextSpan> empty_ime_text_spans;
   Controller().SetEditableSelectionOffsets(PlainTextRange(4, 8));
-  Controller().CommitText(String(""), empty_underlines, 0);
+  Controller().CommitText(String(""), empty_ime_text_spans, 0);
   EXPECT_STREQ("Abc Ghi", input->value().Utf8().data());
 
   Controller().SetEditableSelectionOffsets(PlainTextRange(4, 7));
-  Controller().CommitText(String("1"), empty_underlines, 0);
+  Controller().CommitText(String("1"), empty_ime_text_spans, 0);
   EXPECT_STREQ("Abc 1", input->value().Utf8().data());
 }
 
@@ -1541,13 +1539,13 @@
       marker_range, Color::kBlack, StyleableMarker::Thickness::kThin,
       Color::kBlack);
   // Delete "Initial"
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 0, 7);
-  Controller().CommitText(String(""), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 7);
+  Controller().CommitText(String(""), empty_ime_text_spans, 0);
 
   // Delete "blah"
-  Controller().SetCompositionFromExistingText(empty_underlines, 6, 10);
-  Controller().CommitText(String(""), empty_underlines, 0);
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 6, 10);
+  Controller().CommitText(String(""), empty_ime_text_spans, 0);
 
   // Check that the marker is still attached to "text" and doesn't include
   // either space around it
@@ -1570,13 +1568,13 @@
       marker_range, Color::kBlack, StyleableMarker::Thickness::kThin,
       Color::kBlack);
   // Delete "Initial"
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 0, 7);
-  Controller().CommitText(String(""), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 7);
+  Controller().CommitText(String(""), empty_ime_text_spans, 0);
 
   // Delete "blah"
-  Controller().SetCompositionFromExistingText(empty_underlines, 6, 10);
-  Controller().CommitText(String(""), empty_underlines, 0);
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 6, 10);
+  Controller().CommitText(String(""), empty_ime_text_spans, 0);
 
   // Check that the marker is still attached to " text" and includes the space
   // before "text" but not the space after
@@ -1599,13 +1597,13 @@
       marker_range, Color::kBlack, StyleableMarker::Thickness::kThin,
       Color::kBlack);
   // Delete "Initial"
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 0, 7);
-  Controller().CommitText(String(""), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 7);
+  Controller().CommitText(String(""), empty_ime_text_spans, 0);
 
   // Delete "blah"
-  Controller().SetCompositionFromExistingText(empty_underlines, 6, 10);
-  Controller().CommitText(String(""), empty_underlines, 0);
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 6, 10);
+  Controller().CommitText(String(""), empty_ime_text_spans, 0);
 
   // Check that the marker is still attached to "text " and includes the space
   // after "text" but not the space before
@@ -1630,13 +1628,13 @@
       Color::kBlack);
 
   // Delete "Initial"
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 0, 7);
-  Controller().CommitText(String(""), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 7);
+  Controller().CommitText(String(""), empty_ime_text_spans, 0);
 
   // Delete "blah"
-  Controller().SetCompositionFromExistingText(empty_underlines, 6, 10);
-  Controller().CommitText(String(""), empty_underlines, 0);
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 6, 10);
+  Controller().CommitText(String(""), empty_ime_text_spans, 0);
 
   // Check that the marker is still attached to " text " and includes both the
   // space before "text" and the space after
@@ -1657,9 +1655,9 @@
       marker_range, TextMatchMarker::MatchStatus::kInactive);
 
   // Replace "Initial" with "Original"
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 0, 7);
-  Controller().CommitText(String("Original"), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 7);
+  Controller().CommitText(String("Original"), empty_ime_text_spans, 0);
 
   // Verify marker was removed
   EXPECT_EQ(0u, GetDocument().Markers().Markers().size());
@@ -1677,9 +1675,9 @@
       Color::kBlack);
 
   // Replace "Initial" with "Original"
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 0, 7);
-  Controller().CommitText(String("Original"), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 7);
+  Controller().CommitText(String("Original"), empty_ime_text_spans, 0);
 
   // Verify marker is under "Original text"
   EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
@@ -1701,9 +1699,9 @@
       marker_range, TextMatchMarker::MatchStatus::kInactive);
 
   // Replace "some initial" with "boring"
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 8, 20);
-  Controller().CommitText(String("boring"), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 8, 20);
+  Controller().CommitText(String("boring"), empty_ime_text_spans, 0);
 
   // Verify marker was removed
   EXPECT_EQ(0u, GetDocument().Markers().Markers().size());
@@ -1722,9 +1720,9 @@
       Color::kBlack);
 
   // Replace "some initial" with "boring"
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 8, 20);
-  Controller().CommitText(String("boring"), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 8, 20);
+  Controller().CommitText(String("boring"), empty_ime_text_spans, 0);
 
   // Verify marker is under " text"
   EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
@@ -1744,9 +1742,9 @@
       marker_range, TextMatchMarker::MatchStatus::kInactive);
 
   // Replace "text" with "string"
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 8, 12);
-  Controller().CommitText(String("string"), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 8, 12);
+  Controller().CommitText(String("string"), empty_ime_text_spans, 0);
 
   // Verify marker was removed
   EXPECT_EQ(0u, GetDocument().Markers().Markers().size());
@@ -1763,9 +1761,9 @@
       Color::kBlack);
 
   // Replace "text" with "string"
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 8, 12);
-  Controller().CommitText(String("string"), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 8, 12);
+  Controller().CommitText(String("string"), empty_ime_text_spans, 0);
 
   // Verify marker is under "Initial string"
   EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
@@ -1787,9 +1785,9 @@
       marker_range, TextMatchMarker::MatchStatus::kInactive);
 
   // Replace "initial text" with "content"
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 13, 25);
-  Controller().CommitText(String("content"), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 13, 25);
+  Controller().CommitText(String("content"), empty_ime_text_spans, 0);
 
   EXPECT_STREQ("This is some content", div->innerHTML().Utf8().data());
 
@@ -1810,9 +1808,9 @@
       Color::kBlack);
 
   // Replace "initial text" with "content"
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 13, 25);
-  Controller().CommitText(String("content"), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 13, 25);
+  Controller().CommitText(String("content"), empty_ime_text_spans, 0);
 
   EXPECT_STREQ("This is some content", div->innerHTML().Utf8().data());
 
@@ -1834,9 +1832,9 @@
       marker_range, TextMatchMarker::MatchStatus::kInactive);
 
   // Replace "text" with "string"
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 8, 12);
-  Controller().CommitText(String("string"), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 8, 12);
+  Controller().CommitText(String("string"), empty_ime_text_spans, 0);
 
   // Verify marker was removed
   EXPECT_EQ(0u, GetDocument().Markers().Markers().size());
@@ -1854,9 +1852,9 @@
       Color::kBlack);
 
   // Replace "text" with "string"
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 8, 12);
-  Controller().CommitText(String("string"), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 8, 12);
+  Controller().CommitText(String("string"), empty_ime_text_spans, 0);
 
   // Verify marker is under "string"
   EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
@@ -1879,9 +1877,9 @@
   EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
 
   // Replace "Initial text" with "New string"
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 0, 12);
-  Controller().CommitText(String("New string"), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 12);
+  Controller().CommitText(String("New string"), empty_ime_text_spans, 0);
 
   // Verify marker was removed
   EXPECT_EQ(0u, GetDocument().Markers().Markers().size());
@@ -1901,9 +1899,9 @@
   EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
 
   // Replace "Initial text" with "New string"
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 0, 12);
-  Controller().CommitText(String("New string"), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 12);
+  Controller().CommitText(String("New string"), empty_ime_text_spans, 0);
 
   // Verify marker was removed
   EXPECT_EQ(0u, GetDocument().Markers().Markers().size());
@@ -1922,9 +1920,9 @@
   EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
 
   // Replace "Initial text" with "New string"
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 0, 12);
-  Controller().CommitText(String("New string"), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 12);
+  Controller().CommitText(String("New string"), empty_ime_text_spans, 0);
 
   // Verify marker was removed
   EXPECT_EQ(0u, GetDocument().Markers().Markers().size());
@@ -1944,9 +1942,9 @@
   EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
 
   // Replace "Initial text" with "New string"
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 0, 12);
-  Controller().CommitText(String("New string"), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 0, 12);
+  Controller().CommitText(String("New string"), empty_ime_text_spans, 0);
 
   // Verify marker was removed
   EXPECT_EQ(0u, GetDocument().Markers().Markers().size());
@@ -1980,9 +1978,9 @@
   EXPECT_EQ(5u, GetDocument().Markers().Markers().size());
 
   // Delete third marker and portions of second and fourth
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 8, 17);
-  Controller().CommitText(String(""), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 8, 17);
+  Controller().CommitText(String(""), empty_ime_text_spans, 0);
 
   // Verify markers were updated correctly
   EXPECT_EQ(2u, GetDocument().Markers().Markers().size());
@@ -2027,9 +2025,9 @@
   EXPECT_EQ(5u, GetDocument().Markers().Markers().size());
 
   // Delete third marker and portions of second and fourth
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 8, 17);
-  Controller().CommitText(String(""), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 8, 17);
+  Controller().CommitText(String(""), empty_ime_text_spans, 0);
 
   // Verify markers were updated correctly
   EXPECT_EQ(4u, GetDocument().Markers().Markers().size());
@@ -2060,9 +2058,9 @@
   EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
 
   // Delete exactly on the marker
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 5, 10);
-  Controller().CommitText(String(""), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 5, 10);
+  Controller().CommitText(String(""), empty_ime_text_spans, 0);
   EXPECT_EQ(0u, GetDocument().Markers().Markers().size());
 }
 
@@ -2080,9 +2078,9 @@
   EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
 
   // Delete exactly on the marker
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 5, 10);
-  Controller().CommitText(String(""), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 5, 10);
+  Controller().CommitText(String(""), empty_ime_text_spans, 0);
   EXPECT_EQ(0u, GetDocument().Markers().Markers().size());
 }
 
@@ -2096,9 +2094,9 @@
       marker_range, TextMatchMarker::MatchStatus::kInactive);
 
   // Delete middle of marker
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 6, 9);
-  Controller().CommitText(String(""), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 6, 9);
+  Controller().CommitText(String(""), empty_ime_text_spans, 0);
 
   // Verify marker was removed
   EXPECT_EQ(0u, GetDocument().Markers().Markers().size());
@@ -2116,9 +2114,9 @@
       Color::kBlack);
 
   // Delete middle of marker
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetCompositionFromExistingText(empty_underlines, 6, 9);
-  Controller().CommitText(String(""), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetCompositionFromExistingText(empty_ime_text_spans, 6, 9);
+  Controller().CommitText(String(""), empty_ime_text_spans, 0);
 
   EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
 
@@ -2147,9 +2145,9 @@
   EXPECT_EQ(3u, GetDocument().Markers().Markers().size());
 
   // insert in middle of second marker
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetComposition("", empty_underlines, 7, 7);
-  Controller().CommitText(String("66666"), empty_underlines, -7);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetComposition("", empty_ime_text_spans, 7, 7);
+  Controller().CommitText(String("66666"), empty_ime_text_spans, -7);
 
   EXPECT_EQ(2u, GetDocument().Markers().Markers().size());
 
@@ -2184,9 +2182,9 @@
   EXPECT_EQ(3u, GetDocument().Markers().Markers().size());
 
   // insert in middle of second marker
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetComposition("", empty_underlines, 7, 7);
-  Controller().CommitText(String("66666"), empty_underlines, -7);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetComposition("", empty_ime_text_spans, 7, 7);
+  Controller().CommitText(String("66666"), empty_ime_text_spans, -7);
 
   EXPECT_EQ(3u, GetDocument().Markers().Markers().size());
 
@@ -2219,9 +2217,9 @@
 
   EXPECT_EQ(3u, GetDocument().Markers().Markers().size());
 
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetComposition("", empty_underlines, 5, 5);
-  Controller().CommitText(String("77777"), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetComposition("", empty_ime_text_spans, 5, 5);
+  Controller().CommitText(String("77777"), empty_ime_text_spans, 0);
 
   EXPECT_EQ(3u, GetDocument().Markers().Markers().size());
 
@@ -2258,9 +2256,9 @@
 
   EXPECT_EQ(3u, GetDocument().Markers().Markers().size());
 
-  Vector<CompositionUnderline> empty_underlines;
-  Controller().SetComposition("", empty_underlines, 5, 5);
-  Controller().CommitText(String("77777"), empty_underlines, 0);
+  Vector<ImeTextSpan> empty_ime_text_spans;
+  Controller().SetComposition("", empty_ime_text_spans, 5, 5);
+  Controller().CommitText(String("77777"), empty_ime_text_spans, 0);
 
   EXPECT_EQ(3u, GetDocument().Markers().Markers().size());
 
@@ -2295,7 +2293,7 @@
 
   EXPECT_EQ(kWebTextInputTypeText, Controller().TextInputType());
 
-  Controller().SetComposition("abcde", Vector<CompositionUnderline>(), 4, 4);
+  Controller().SetComposition("abcde", Vector<ImeTextSpan>(), 4, 4);
   EXPECT_STREQ("abcde", input->value().Utf8().data());
 
   Controller().FinishComposingText(InputMethodController::kKeepSelection);
diff --git a/third_party/WebKit/Source/core/editing/TextFinder.cpp b/third_party/WebKit/Source/core/editing/TextFinder.cpp
index a796228..c0b695ac 100644
--- a/third_party/WebKit/Source/core/editing/TextFinder.cpp
+++ b/third_party/WebKit/Source/core/editing/TextFinder.cpp
@@ -373,7 +373,6 @@
   // Clear the counters from last operation.
   last_match_count_ = 0;
   next_invalidate_after_ = 0;
-  resume_scoping_from_range_ = nullptr;
 
   // The view might be null on detached frames.
   LocalFrame* frame = OwnerFrame().GetFrame();
@@ -558,6 +557,8 @@
     last_find_request_completed_with_no_matches_ = false;
 
   scoping_in_progress_ = false;
+
+  resume_scoping_from_range_ = nullptr;
 }
 
 void TextFinder::IncreaseMatchCount(int identifier, int count) {
diff --git a/third_party/WebKit/Source/core/exported/LocalFrameClientImpl.cpp b/third_party/WebKit/Source/core/exported/LocalFrameClientImpl.cpp
index 975876e..2a59341 100644
--- a/third_party/WebKit/Source/core/exported/LocalFrameClientImpl.cpp
+++ b/third_party/WebKit/Source/core/exported/LocalFrameClientImpl.cpp
@@ -913,7 +913,7 @@
           frame_element->ScrollingMode(), frame_element->MarginWidth(),
           frame_element->MarginHeight(), frame_element->AllowFullscreen(),
           frame_element->AllowPaymentRequest(), frame_element->IsDisplayNone(),
-          frame_element->Csp(), frame_element->AllowedFeatures()));
+          frame_element->Csp()));
 }
 
 void LocalFrameClientImpl::DispatchWillStartUsingPeerConnectionHandler(
diff --git a/third_party/WebKit/Source/core/exported/WebFrame.cpp b/third_party/WebKit/Source/core/exported/WebFrame.cpp
index 25a7f83..494a213 100644
--- a/third_party/WebKit/Source/core/exported/WebFrame.cpp
+++ b/third_party/WebKit/Source/core/exported/WebFrame.cpp
@@ -180,7 +180,6 @@
   owner->SetAllowPaymentRequest(properties.allow_payment_request);
   owner->SetIsDisplayNone(properties.is_display_none);
   owner->SetCsp(properties.required_csp);
-  owner->SetAllowedFeatures(properties.allowed_features);
 }
 
 void WebFrame::Collapse(bool collapsed) {
diff --git a/third_party/WebKit/Source/core/exported/WebInputMethodControllerImpl.cpp b/third_party/WebKit/Source/core/exported/WebInputMethodControllerImpl.cpp
index 0a7f545..ec3ab31ac 100644
--- a/third_party/WebKit/Source/core/exported/WebInputMethodControllerImpl.cpp
+++ b/third_party/WebKit/Source/core/exported/WebInputMethodControllerImpl.cpp
@@ -7,11 +7,11 @@
 #include "core/InputTypeNames.h"
 #include "core/dom/Document.h"
 #include "core/dom/UserGestureIndicator.h"
-#include "core/editing/CompositionUnderlineVectorBuilder.h"
 #include "core/editing/EditingUtilities.h"
 #include "core/editing/Editor.h"
 #include "core/editing/EphemeralRange.h"
 #include "core/editing/FrameSelection.h"
+#include "core/editing/ImeTextSpanVectorBuilder.h"
 #include "core/editing/InputMethodController.h"
 #include "core/editing/PlainTextRange.h"
 #include "core/exported/WebPluginContainerImpl.h"
@@ -37,12 +37,12 @@
 
 bool WebInputMethodControllerImpl::SetComposition(
     const WebString& text,
-    const WebVector<WebCompositionUnderline>& underlines,
+    const WebVector<WebImeTextSpan>& ime_text_spans,
     const WebRange& replacement_range,
     int selection_start,
     int selection_end) {
   if (WebPlugin* plugin = FocusedPluginIfInputMethodSupported()) {
-    return plugin->SetComposition(text, underlines, replacement_range,
+    return plugin->SetComposition(text, ime_text_spans, replacement_range,
                                   selection_start, selection_end);
   }
 
@@ -72,12 +72,8 @@
   UserGestureIndicator gesture_indicator(UserGestureToken::Create(
       GetFrame()->GetDocument(), UserGestureToken::kNewGesture));
 
-  // When the range of composition underlines overlap with the range between
-  // selectionStart and selectionEnd, WebKit somehow won't paint the selection
-  // at all (see InlineTextBox::paint() function in InlineTextBox.cpp).
-  // But the selection range actually takes effect.
   GetInputMethodController().SetComposition(
-      String(text), CompositionUnderlineVectorBuilder::Build(underlines),
+      String(text), ImeTextSpanVectorBuilder::Build(ime_text_spans),
       selection_start, selection_end);
 
   return text.IsEmpty() || GetInputMethodController().HasComposition();
@@ -107,14 +103,14 @@
 
 bool WebInputMethodControllerImpl::CommitText(
     const WebString& text,
-    const WebVector<WebCompositionUnderline>& underlines,
+    const WebVector<WebImeTextSpan>& ime_text_spans,
     const WebRange& replacement_range,
     int relative_caret_position) {
   UserGestureIndicator gesture_indicator(UserGestureToken::Create(
       GetFrame()->GetDocument(), UserGestureToken::kNewGesture));
 
   if (WebPlugin* plugin = FocusedPluginIfInputMethodSupported()) {
-    return plugin->CommitText(text, underlines, replacement_range,
+    return plugin->CommitText(text, ime_text_spans, replacement_range,
                               relative_caret_position);
   }
 
@@ -127,7 +123,7 @@
   GetFrame()->GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets();
 
   return GetInputMethodController().CommitText(
-      text, CompositionUnderlineVectorBuilder::Build(underlines),
+      text, ImeTextSpanVectorBuilder::Build(ime_text_spans),
       relative_caret_position);
 }
 
diff --git a/third_party/WebKit/Source/core/exported/WebInputMethodControllerImpl.h b/third_party/WebKit/Source/core/exported/WebInputMethodControllerImpl.h
index a2e4219..001d1c6 100644
--- a/third_party/WebKit/Source/core/exported/WebInputMethodControllerImpl.h
+++ b/third_party/WebKit/Source/core/exported/WebInputMethodControllerImpl.h
@@ -8,7 +8,7 @@
 #include "core/CoreExport.h"
 #include "platform/heap/Handle.h"
 #include "platform/wtf/Allocator.h"
-#include "public/web/WebCompositionUnderline.h"
+#include "public/web/WebImeTextSpan.h"
 #include "public/web/WebInputMethodController.h"
 
 namespace blink {
@@ -31,12 +31,12 @@
 
   // WebInputMethodController overrides.
   bool SetComposition(const WebString& text,
-                      const WebVector<WebCompositionUnderline>& underlines,
+                      const WebVector<WebImeTextSpan>& ime_text_spans,
                       const WebRange& replacement_range,
                       int selection_start,
                       int selection_end) override;
   bool CommitText(const WebString& text,
-                  const WebVector<WebCompositionUnderline>& underlines,
+                  const WebVector<WebImeTextSpan>& ime_text_spans,
                   const WebRange& replacement_range,
                   int relative_caret_position) override;
   bool FinishComposingText(
diff --git a/third_party/WebKit/Source/core/exported/WebViewImpl.cpp b/third_party/WebKit/Source/core/exported/WebViewImpl.cpp
index 41353c58..bf69e60 100644
--- a/third_party/WebKit/Source/core/exported/WebViewImpl.cpp
+++ b/third_party/WebKit/Source/core/exported/WebViewImpl.cpp
@@ -1853,11 +1853,8 @@
     // apparent position unchanged.
     ResizeViewportAnchor::ResizeScope resize_scope(*resize_viewport_anchor_);
 
-    float browser_controls_viewport_adjustment =
-        GetBrowserControls().LayoutHeight() -
-        GetBrowserControls().ContentOffset();
     visual_viewport.SetBrowserControlsAdjustment(
-        browser_controls_viewport_adjustment);
+        GetBrowserControls().UnreportedSizeAdjustment());
   }
 }
 
diff --git a/third_party/WebKit/Source/core/exported/WebViewTest.cpp b/third_party/WebKit/Source/core/exported/WebViewTest.cpp
index af31524..cb95a65b 100644
--- a/third_party/WebKit/Source/core/exported/WebViewTest.cpp
+++ b/third_party/WebKit/Source/core/exported/WebViewTest.cpp
@@ -961,9 +961,9 @@
 
   // The test requires non-empty composition.
   std::string composition_text("hello");
-  WebVector<WebCompositionUnderline> empty_underlines;
+  WebVector<WebImeTextSpan> empty_ime_text_spans;
   active_input_method_controller->SetComposition(
-      WebString::FromUTF8(composition_text.c_str()), empty_underlines,
+      WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans,
       WebRange(), 5, 5);
 
   // Do arbitrary change to make layout dirty.
@@ -991,9 +991,9 @@
       web_view->MainFrameImpl()
           ->FrameWidget()
           ->GetActiveWebInputMethodController();
-  WebVector<WebCompositionUnderline> empty_underlines;
+  WebVector<WebImeTextSpan> empty_ime_text_spans;
   active_input_method_controller->SetComposition(
-      WebString::FromUTF8(composition_text.c_str()), empty_underlines,
+      WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans,
       WebRange(), 3, 3);
 
   WebTextInputInfo info = active_input_method_controller->TextInputInfo();
@@ -1012,7 +1012,7 @@
   EXPECT_EQ(-1, info.composition_end);
 
   active_input_method_controller->SetComposition(
-      WebString::FromUTF8(composition_text.c_str()), empty_underlines,
+      WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans,
       WebRange(), 3, 3);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("helhellolo", std::string(info.value.Utf8().data()));
@@ -1040,11 +1040,11 @@
           ->FrameWidget()
           ->GetActiveWebInputMethodController();
 
-  WebVector<WebCompositionUnderline> empty_underlines;
+  WebVector<WebImeTextSpan> empty_ime_text_spans;
 
-  active_input_method_controller->CommitText("hello", empty_underlines,
+  active_input_method_controller->CommitText("hello", empty_ime_text_spans,
                                              WebRange(), 0);
-  active_input_method_controller->CommitText("world", empty_underlines,
+  active_input_method_controller->CommitText("world", empty_ime_text_spans,
                                              WebRange(), -5);
   WebTextInputInfo info = active_input_method_controller->TextInputInfo();
 
@@ -1059,7 +1059,7 @@
 
   // Caret is on the left of composing text.
   active_input_method_controller->SetComposition(
-      WebString::FromUTF8(composition_text.c_str()), empty_underlines,
+      WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans,
       WebRange(), 0, 0);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("helloABCworld", std::string(info.value.Utf8().data()));
@@ -1070,7 +1070,7 @@
 
   // Caret is on the right of composing text.
   active_input_method_controller->SetComposition(
-      WebString::FromUTF8(composition_text.c_str()), empty_underlines,
+      WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans,
       WebRange(), 3, 3);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("helloABCworld", std::string(info.value.Utf8().data()));
@@ -1081,7 +1081,7 @@
 
   // Caret is between composing text and left boundary.
   active_input_method_controller->SetComposition(
-      WebString::FromUTF8(composition_text.c_str()), empty_underlines,
+      WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans,
       WebRange(), -2, -2);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("helloABCworld", std::string(info.value.Utf8().data()));
@@ -1092,7 +1092,7 @@
 
   // Caret is between composing text and right boundary.
   active_input_method_controller->SetComposition(
-      WebString::FromUTF8(composition_text.c_str()), empty_underlines,
+      WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans,
       WebRange(), 5, 5);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("helloABCworld", std::string(info.value.Utf8().data()));
@@ -1103,7 +1103,7 @@
 
   // Caret is on the left boundary.
   active_input_method_controller->SetComposition(
-      WebString::FromUTF8(composition_text.c_str()), empty_underlines,
+      WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans,
       WebRange(), -5, -5);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("helloABCworld", std::string(info.value.Utf8().data()));
@@ -1114,7 +1114,7 @@
 
   // Caret is on the right boundary.
   active_input_method_controller->SetComposition(
-      WebString::FromUTF8(composition_text.c_str()), empty_underlines,
+      WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans,
       WebRange(), 8, 8);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("helloABCworld", std::string(info.value.Utf8().data()));
@@ -1125,7 +1125,7 @@
 
   // Caret exceeds the left boundary.
   active_input_method_controller->SetComposition(
-      WebString::FromUTF8(composition_text.c_str()), empty_underlines,
+      WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans,
       WebRange(), -100, -100);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("helloABCworld", std::string(info.value.Utf8().data()));
@@ -1136,7 +1136,7 @@
 
   // Caret exceeds the right boundary.
   active_input_method_controller->SetComposition(
-      WebString::FromUTF8(composition_text.c_str()), empty_underlines,
+      WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans,
       WebRange(), 100, 100);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("helloABCworld", std::string(info.value.Utf8().data()));
@@ -1156,9 +1156,9 @@
           ->FrameWidget()
           ->GetActiveWebInputMethodController();
 
-  WebVector<WebCompositionUnderline> empty_underlines;
+  WebVector<WebImeTextSpan> empty_ime_text_spans;
 
-  active_input_method_controller->CommitText("hello", empty_underlines,
+  active_input_method_controller->CommitText("hello", empty_ime_text_spans,
                                              WebRange(), 0);
   WebTextInputInfo info = active_input_method_controller->TextInputInfo();
 
@@ -1169,7 +1169,7 @@
   EXPECT_EQ(-1, info.composition_end);
 
   active_input_method_controller->SetComposition(
-      WebString::FromUTF8(""), empty_underlines, WebRange(), 0, 0);
+      WebString::FromUTF8(""), empty_ime_text_spans, WebRange(), 0, 0);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("hello", std::string(info.value.Utf8().data()));
   EXPECT_EQ(5, info.selection_start);
@@ -1178,7 +1178,7 @@
   EXPECT_EQ(-1, info.composition_end);
 
   active_input_method_controller->SetComposition(
-      WebString::FromUTF8(""), empty_underlines, WebRange(), -2, -2);
+      WebString::FromUTF8(""), empty_ime_text_spans, WebRange(), -2, -2);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("hello", std::string(info.value.Utf8().data()));
   EXPECT_EQ(3, info.selection_start);
@@ -1197,11 +1197,11 @@
           ->FrameWidget()
           ->GetActiveWebInputMethodController();
 
-  WebVector<WebCompositionUnderline> empty_underlines;
+  WebVector<WebImeTextSpan> empty_ime_text_spans;
 
   // Caret is on the left of composing text.
-  active_input_method_controller->CommitText("ab", empty_underlines, WebRange(),
-                                             -2);
+  active_input_method_controller->CommitText("ab", empty_ime_text_spans,
+                                             WebRange(), -2);
   WebTextInputInfo info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("ab", std::string(info.value.Utf8().data()));
   EXPECT_EQ(0, info.selection_start);
@@ -1210,8 +1210,8 @@
   EXPECT_EQ(-1, info.composition_end);
 
   // Caret is on the right of composing text.
-  active_input_method_controller->CommitText("c", empty_underlines, WebRange(),
-                                             1);
+  active_input_method_controller->CommitText("c", empty_ime_text_spans,
+                                             WebRange(), 1);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("cab", std::string(info.value.Utf8().data()));
   EXPECT_EQ(2, info.selection_start);
@@ -1220,7 +1220,7 @@
   EXPECT_EQ(-1, info.composition_end);
 
   // Caret is on the left boundary.
-  active_input_method_controller->CommitText("def", empty_underlines,
+  active_input_method_controller->CommitText("def", empty_ime_text_spans,
                                              WebRange(), -5);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("cadefb", std::string(info.value.Utf8().data()));
@@ -1230,8 +1230,8 @@
   EXPECT_EQ(-1, info.composition_end);
 
   // Caret is on the right boundary.
-  active_input_method_controller->CommitText("g", empty_underlines, WebRange(),
-                                             6);
+  active_input_method_controller->CommitText("g", empty_ime_text_spans,
+                                             WebRange(), 6);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("gcadefb", std::string(info.value.Utf8().data()));
   EXPECT_EQ(7, info.selection_start);
@@ -1240,8 +1240,8 @@
   EXPECT_EQ(-1, info.composition_end);
 
   // Caret exceeds the left boundary.
-  active_input_method_controller->CommitText("hi", empty_underlines, WebRange(),
-                                             -100);
+  active_input_method_controller->CommitText("hi", empty_ime_text_spans,
+                                             WebRange(), -100);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("gcadefbhi", std::string(info.value.Utf8().data()));
   EXPECT_EQ(0, info.selection_start);
@@ -1250,8 +1250,8 @@
   EXPECT_EQ(-1, info.composition_end);
 
   // Caret exceeds the right boundary.
-  active_input_method_controller->CommitText("jk", empty_underlines, WebRange(),
-                                             100);
+  active_input_method_controller->CommitText("jk", empty_ime_text_spans,
+                                             WebRange(), 100);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("jkgcadefbhi", std::string(info.value.Utf8().data()));
   EXPECT_EQ(11, info.selection_start);
@@ -1270,9 +1270,9 @@
           ->FrameWidget()
           ->GetActiveWebInputMethodController();
 
-  WebVector<WebCompositionUnderline> empty_underlines;
+  WebVector<WebImeTextSpan> empty_ime_text_spans;
   active_input_method_controller->SetComposition(
-      WebString::FromUTF8("abc"), empty_underlines, WebRange(), 0, 0);
+      WebString::FromUTF8("abc"), empty_ime_text_spans, WebRange(), 0, 0);
   WebTextInputInfo info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("abc", std::string(info.value.Utf8().data()));
   EXPECT_EQ(0, info.selection_start);
@@ -1282,7 +1282,7 @@
 
   // Deletes ongoing composition, inserts the specified text and moves the
   // caret.
-  active_input_method_controller->CommitText("hello", empty_underlines,
+  active_input_method_controller->CommitText("hello", empty_ime_text_spans,
                                              WebRange(), -2);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("hello", std::string(info.value.Utf8().data()));
@@ -1292,7 +1292,7 @@
   EXPECT_EQ(-1, info.composition_end);
 
   active_input_method_controller->SetComposition(
-      WebString::FromUTF8("abc"), empty_underlines, WebRange(), 0, 0);
+      WebString::FromUTF8("abc"), empty_ime_text_spans, WebRange(), 0, 0);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("helabclo", std::string(info.value.Utf8().data()));
   EXPECT_EQ(3, info.selection_start);
@@ -1301,8 +1301,8 @@
   EXPECT_EQ(6, info.composition_end);
 
   // Deletes ongoing composition and moves the caret.
-  active_input_method_controller->CommitText("", empty_underlines, WebRange(),
-                                             2);
+  active_input_method_controller->CommitText("", empty_ime_text_spans,
+                                             WebRange(), 2);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("hello", std::string(info.value.Utf8().data()));
   EXPECT_EQ(5, info.selection_start);
@@ -1311,7 +1311,7 @@
   EXPECT_EQ(-1, info.composition_end);
 
   // Inserts the specified text and moves the caret.
-  active_input_method_controller->CommitText("world", empty_underlines,
+  active_input_method_controller->CommitText("world", empty_ime_text_spans,
                                              WebRange(), -5);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("helloworld", std::string(info.value.Utf8().data()));
@@ -1321,8 +1321,8 @@
   EXPECT_EQ(-1, info.composition_end);
 
   // Only moves the caret.
-  active_input_method_controller->CommitText("", empty_underlines, WebRange(),
-                                             5);
+  active_input_method_controller->CommitText("", empty_ime_text_spans,
+                                             WebRange(), 5);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("helloworld", std::string(info.value.Utf8().data()));
   EXPECT_EQ(10, info.selection_start);
@@ -1341,10 +1341,10 @@
   EXPECT_EQ(0, web_view->MainFrameImpl()->GetScrollOffset().height);
 
   // Set up a composition from existing text that needs to be committed.
-  Vector<CompositionUnderline> empty_underlines;
+  Vector<ImeTextSpan> empty_ime_text_spans;
   WebLocalFrameImpl* frame = web_view->MainFrameImpl();
   frame->GetFrame()->GetInputMethodController().SetCompositionFromExistingText(
-      empty_underlines, 0, 3);
+      empty_ime_text_spans, 0, 3);
 
   // Scroll the input field out of the viewport.
   Element* element = static_cast<Element*>(
@@ -1371,13 +1371,13 @@
       base_url_ + "text_area_populated.html");
   web_view->SetInitialFocus(false);
 
-  WebVector<WebCompositionUnderline> empty_underlines;
+  WebVector<WebImeTextSpan> empty_ime_text_spans;
 
   WebLocalFrameImpl* frame = web_view->MainFrameImpl();
   WebInputMethodController* active_input_method_controller =
       frame->GetInputMethodController();
   frame->SetEditableSelectionOffsets(4, 4);
-  frame->SetCompositionFromExistingText(8, 12, empty_underlines);
+  frame->SetCompositionFromExistingText(8, 12, empty_ime_text_spans);
 
   WebTextInputInfo info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("0123456789abcdefghijklmnopqrstuvwxyz",
@@ -1397,7 +1397,7 @@
 
   std::string composition_text("\n");
   active_input_method_controller->CommitText(
-      WebString::FromUTF8(composition_text.c_str()), empty_underlines,
+      WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans,
       WebRange(), 0);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ(5, info.selection_start);
@@ -1475,20 +1475,20 @@
   WebViewImpl* web_view = web_view_helper_.InitializeAndLoad(
       base_url_ + "input_field_populated.html");
   web_view->SetInitialFocus(false);
-  WebVector<WebCompositionUnderline> underlines(static_cast<size_t>(1));
-  underlines[0] = WebCompositionUnderline(0, 4, 0, false, 0);
+  WebVector<WebImeTextSpan> ime_text_spans(static_cast<size_t>(1));
+  ime_text_spans[0] = WebImeTextSpan(0, 4, 0, false, 0);
   WebLocalFrameImpl* frame = web_view->MainFrameImpl();
   WebInputMethodController* active_input_method_controller =
       frame->GetInputMethodController();
   frame->SetEditableSelectionOffsets(4, 10);
-  frame->SetCompositionFromExistingText(8, 12, underlines);
+  frame->SetCompositionFromExistingText(8, 12, ime_text_spans);
   WebTextInputInfo info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ(4, info.selection_start);
   EXPECT_EQ(10, info.selection_end);
   EXPECT_EQ(8, info.composition_start);
   EXPECT_EQ(12, info.composition_end);
-  WebVector<WebCompositionUnderline> empty_underlines;
-  frame->SetCompositionFromExistingText(0, 0, empty_underlines);
+  WebVector<WebImeTextSpan> empty_ime_text_spans;
+  frame->SetCompositionFromExistingText(0, 0, empty_ime_text_spans);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ(4, info.selection_start);
   EXPECT_EQ(10, info.selection_end);
@@ -1501,23 +1501,23 @@
   WebViewImpl* web_view = web_view_helper_.InitializeAndLoad(
       base_url_ + "text_area_populated.html");
   web_view->SetInitialFocus(false);
-  WebVector<WebCompositionUnderline> underlines(static_cast<size_t>(1));
-  underlines[0] = WebCompositionUnderline(0, 4, 0, false, 0);
+  WebVector<WebImeTextSpan> ime_text_spans(static_cast<size_t>(1));
+  ime_text_spans[0] = WebImeTextSpan(0, 4, 0, false, 0);
   WebLocalFrameImpl* frame = web_view->MainFrameImpl();
   WebInputMethodController* active_input_method_controller =
       frame->FrameWidget()->GetActiveWebInputMethodController();
   frame->SetEditableSelectionOffsets(27, 27);
   std::string new_line_text("\n");
-  WebVector<WebCompositionUnderline> empty_underlines;
+  WebVector<WebImeTextSpan> empty_ime_text_spans;
   active_input_method_controller->CommitText(
-      WebString::FromUTF8(new_line_text.c_str()), empty_underlines, WebRange(),
-      0);
+      WebString::FromUTF8(new_line_text.c_str()), empty_ime_text_spans,
+      WebRange(), 0);
   WebTextInputInfo info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("0123456789abcdefghijklmnopq\nrstuvwxyz",
             std::string(info.value.Utf8().data()));
 
   frame->SetEditableSelectionOffsets(31, 31);
-  frame->SetCompositionFromExistingText(30, 34, underlines);
+  frame->SetCompositionFromExistingText(30, 34, ime_text_spans);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("0123456789abcdefghijklmnopq\nrstuvwxyz",
             std::string(info.value.Utf8().data()));
@@ -1528,7 +1528,7 @@
 
   std::string composition_text("yolo");
   active_input_method_controller->CommitText(
-      WebString::FromUTF8(composition_text.c_str()), empty_underlines,
+      WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans,
       WebRange(), 0);
   info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("0123456789abcdefghijklmnopq\nrsyoloxyz",
@@ -1544,13 +1544,13 @@
   WebViewImpl* web_view = web_view_helper_.InitializeAndLoad(
       base_url_ + "content_editable_rich_text.html");
   web_view->SetInitialFocus(false);
-  WebVector<WebCompositionUnderline> underlines(static_cast<size_t>(1));
-  underlines[0] = WebCompositionUnderline(0, 4, 0, false, 0);
+  WebVector<WebImeTextSpan> ime_text_spans(static_cast<size_t>(1));
+  ime_text_spans[0] = WebImeTextSpan(0, 4, 0, false, 0);
   WebLocalFrameImpl* frame = web_view->MainFrameImpl();
   frame->SetEditableSelectionOffsets(1, 1);
   WebDocument document = web_view->MainFrameImpl()->GetDocument();
   EXPECT_FALSE(document.GetElementById("bold").IsNull());
-  frame->SetCompositionFromExistingText(0, 4, underlines);
+  frame->SetCompositionFromExistingText(0, 4, ime_text_spans);
   EXPECT_FALSE(document.GetElementById("bold").IsNull());
 }
 
@@ -1562,17 +1562,17 @@
 
   std::string composition_text_first("hello ");
   std::string composition_text_second("world");
-  WebVector<WebCompositionUnderline> empty_underlines;
+  WebVector<WebImeTextSpan> empty_ime_text_spans;
   WebInputMethodController* active_input_method_controller =
       web_view->MainFrameImpl()
           ->FrameWidget()
           ->GetActiveWebInputMethodController();
   active_input_method_controller->CommitText(
-      WebString::FromUTF8(composition_text_first.c_str()), empty_underlines,
+      WebString::FromUTF8(composition_text_first.c_str()), empty_ime_text_spans,
       WebRange(), 0);
   active_input_method_controller->SetComposition(
-      WebString::FromUTF8(composition_text_second.c_str()), empty_underlines,
-      WebRange(), 5, 5);
+      WebString::FromUTF8(composition_text_second.c_str()),
+      empty_ime_text_spans, WebRange(), 5, 5);
 
   WebTextInputInfo info = active_input_method_controller->TextInputInfo();
   EXPECT_EQ("hello world", std::string(info.value.Utf8().data()));
@@ -2825,10 +2825,10 @@
   WebInputMethodController* active_input_method_controller =
       frame->FrameWidget()->GetActiveWebInputMethodController();
   EXPECT_TRUE(TapElementById(WebInputEvent::kGestureTap, target));
-  WebVector<WebCompositionUnderline> empty_underlines;
+  WebVector<WebImeTextSpan> empty_ime_text_spans;
   frame->SetEditableSelectionOffsets(8, 8);
   EXPECT_TRUE(active_input_method_controller->SetComposition(
-      "12345", empty_underlines, WebRange(), 8, 13));
+      "12345", empty_ime_text_spans, WebRange(), 8, 13));
   EXPECT_TRUE(frame->GetFrame()->GetInputMethodController().HasComposition());
   EXPECT_EQ("", std::string(frame->SelectionAsText().Utf8().data()));
   EXPECT_FALSE(frame->GetFrame()->Selection().IsHandleVisible());
@@ -3209,9 +3209,9 @@
   web_view->SetInitialFocus(false);
 
   // Set up a composition that needs to be committed.
-  WebVector<WebCompositionUnderline> empty_underlines;
+  WebVector<WebImeTextSpan> empty_ime_text_spans;
   frame->SetEditableSelectionOffsets(4, 10);
-  frame->SetCompositionFromExistingText(8, 12, empty_underlines);
+  frame->SetCompositionFromExistingText(8, 12, empty_ime_text_spans);
   WebTextInputInfo info = frame->GetInputMethodController()->TextInputInfo();
   EXPECT_EQ(4, info.selection_start);
   EXPECT_EQ(10, info.selection_end);
@@ -3253,12 +3253,12 @@
   // Test both input elements.
   for (int i = 0; i < 2; ++i) {
     // Select composition and do sanity check.
-    WebVector<WebCompositionUnderline> empty_underlines;
+    WebVector<WebImeTextSpan> empty_ime_text_spans;
     frame->SetEditableSelectionOffsets(6, 6);
     WebInputMethodController* active_input_method_controller =
         frame->FrameWidget()->GetActiveWebInputMethodController();
     EXPECT_TRUE(active_input_method_controller->SetComposition(
-        "fghij", empty_underlines, WebRange(), 0, 5));
+        "fghij", empty_ime_text_spans, WebRange(), 0, 5));
     frame->SetEditableSelectionOffsets(11, 11);
     VerifySelectionAndComposition(web_view, 11, 11, 6, 11, "initial case");
 
@@ -3273,7 +3273,7 @@
 
     frame->SetEditableSelectionOffsets(6, 6);
     EXPECT_TRUE(active_input_method_controller->SetComposition(
-        "fghi", empty_underlines, WebRange(), 0, 4));
+        "fghi", empty_ime_text_spans, WebRange(), 0, 4));
     frame->SetEditableSelectionOffsets(10, 10);
     VerifySelectionAndComposition(web_view, 10, 10, 6, 10,
                                   "after pressing Backspace");
@@ -3305,9 +3305,9 @@
   // Set up a composition that needs to be committed.
   std::string composition_text("testingtext");
 
-  WebVector<WebCompositionUnderline> empty_underlines;
+  WebVector<WebImeTextSpan> empty_ime_text_spans;
   active_input_method_controller->SetComposition(
-      WebString::FromUTF8(composition_text.c_str()), empty_underlines,
+      WebString::FromUTF8(composition_text.c_str()), empty_ime_text_spans,
       WebRange(), 0, composition_text.length());
 
   WebTextInputInfo info = active_input_method_controller->TextInputInfo();
@@ -3338,10 +3338,10 @@
   frame->SetAutofillClient(&client);
   web_view->SetInitialFocus(false);
 
-  WebVector<WebCompositionUnderline> empty_underlines;
+  WebVector<WebImeTextSpan> empty_ime_text_spans;
 
   client.ClearChangeCounts();
-  frame->SetCompositionFromExistingText(8, 12, empty_underlines);
+  frame->SetCompositionFromExistingText(8, 12, empty_ime_text_spans);
 
   WebTextInputInfo info = frame->GetInputMethodController()->TextInputInfo();
   EXPECT_EQ("0123456789abcdefghijklmnopqrstuvwxyz",
@@ -4079,7 +4079,7 @@
   EXPECT_TRUE(
       frame->FrameWidget()->GetActiveWebInputMethodController()->SetComposition(
           WebString::FromUTF8(std::string("hello").c_str()),
-          WebVector<WebCompositionUnderline>(), WebRange(), 3, 3));
+          WebVector<WebImeTextSpan>(), WebRange(), 3, 3));
   EXPECT_EQ(1, client.TextChangesFromUserGesture());
   EXPECT_FALSE(UserGestureIndicator::ProcessingUserGesture());
   EXPECT_TRUE(frame->HasMarkedText());
@@ -4482,12 +4482,12 @@
   frame->SetAutofillClient(&client);
   web_view->SetInitialFocus(false);
 
-  WebVector<WebCompositionUnderline> empty_underlines;
+  WebVector<WebImeTextSpan> empty_ime_text_spans;
 
   EXPECT_TRUE(
       frame->FrameWidget()->GetActiveWebInputMethodController()->CommitText(
-          WebString::FromUTF8(std::string("hello").c_str()), empty_underlines,
-          WebRange(), 0));
+          WebString::FromUTF8(std::string("hello").c_str()),
+          empty_ime_text_spans, WebRange(), 0));
   EXPECT_EQ(1, client.TextChangesFromUserGesture());
   EXPECT_FALSE(UserGestureIndicator::ProcessingUserGesture());
   frame->SetAutofillClient(0);
diff --git a/third_party/WebKit/Source/core/frame/BrowserControls.cpp b/third_party/WebKit/Source/core/frame/BrowserControls.cpp
index 46a13e38..241b830c 100644
--- a/third_party/WebKit/Source/core/frame/BrowserControls.cpp
+++ b/third_party/WebKit/Source/core/frame/BrowserControls.cpp
@@ -80,8 +80,8 @@
       top_height_ ? ContentOffset() : BottomContentOffset();
 }
 
-float BrowserControls::LayoutHeight() {
-  return shrink_viewport_ ? top_height_ + bottom_height_ : 0;
+float BrowserControls::UnreportedSizeAdjustment() {
+  return (shrink_viewport_ ? top_height_ : 0) - ContentOffset();
 }
 
 float BrowserControls::ContentOffset() {
diff --git a/third_party/WebKit/Source/core/frame/BrowserControls.h b/third_party/WebKit/Source/core/frame/BrowserControls.h
index 7c61fc2..6dd983c 100644
--- a/third_party/WebKit/Source/core/frame/BrowserControls.h
+++ b/third_party/WebKit/Source/core/frame/BrowserControls.h
@@ -30,12 +30,11 @@
 
   DECLARE_TRACE();
 
-  // The amount that the viewport was shrunk by to accommodate the top
-  // controls.
-  float LayoutHeight();
+  // The height the top controls are hidden; used for viewport adjustments
+  // while the controls are resizing.
+  float UnreportedSizeAdjustment();
   // The amount that browser controls are currently shown.
   float ContentOffset();
-  float BottomContentOffset();
 
   float TopHeight() const { return top_height_; }
   float BottomHeight() const { return bottom_height_; }
@@ -61,6 +60,7 @@
  private:
   explicit BrowserControls(const Page&);
   void ResetBaseline();
+  float BottomContentOffset();
 
   Member<const Page> page_;
 
diff --git a/third_party/WebKit/Source/core/frame/BrowserControlsTest.cpp b/third_party/WebKit/Source/core/frame/BrowserControlsTest.cpp
index 3596e526..04c0027 100644
--- a/third_party/WebKit/Source/core/frame/BrowserControlsTest.cpp
+++ b/third_party/WebKit/Source/core/frame/BrowserControlsTest.cpp
@@ -1132,4 +1132,40 @@
   }
 }
 
+// Test the size adjustment sent to the viewport when top controls exist.
+TEST_F(BrowserControlsTest, MAYBE(TopControlsSizeAdjustment)) {
+  WebViewImpl* web_view = Initialize();
+  web_view->ResizeWithBrowserControls(web_view->Size(), 50.f, 0, false);
+  web_view->GetBrowserControls().SetShownRatio(1);
+  EXPECT_FLOAT_EQ(-50.f,
+                  web_view->GetBrowserControls().UnreportedSizeAdjustment());
+
+  web_view->GetBrowserControls().SetShownRatio(0.5);
+  EXPECT_FLOAT_EQ(-25.f,
+                  web_view->GetBrowserControls().UnreportedSizeAdjustment());
+
+  web_view->GetBrowserControls().SetShownRatio(0.0);
+  EXPECT_FLOAT_EQ(0.f,
+                  web_view->GetBrowserControls().UnreportedSizeAdjustment());
+}
+
+// Test the size adjustment sent to the viewport when bottom controls exist.
+// There should never be an adjustment since the bottom controls do not change
+// the content offset.
+TEST_F(BrowserControlsTest, MAYBE(BottomControlsSizeAdjustment)) {
+  WebViewImpl* web_view = Initialize();
+  web_view->ResizeWithBrowserControls(web_view->Size(), 0, 50.f, false);
+  web_view->GetBrowserControls().SetShownRatio(1);
+  EXPECT_FLOAT_EQ(0.f,
+                  web_view->GetBrowserControls().UnreportedSizeAdjustment());
+
+  web_view->GetBrowserControls().SetShownRatio(0.5);
+  EXPECT_FLOAT_EQ(0.f,
+                  web_view->GetBrowserControls().UnreportedSizeAdjustment());
+
+  web_view->GetBrowserControls().SetShownRatio(0.0);
+  EXPECT_FLOAT_EQ(0.f,
+                  web_view->GetBrowserControls().UnreportedSizeAdjustment());
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/frame/FrameOwner.h b/third_party/WebKit/Source/core/frame/FrameOwner.h
index f6f1a5a..ef37740b 100644
--- a/third_party/WebKit/Source/core/frame/FrameOwner.h
+++ b/third_party/WebKit/Source/core/frame/FrameOwner.h
@@ -50,7 +50,6 @@
   virtual bool AllowPaymentRequest() const = 0;
   virtual bool IsDisplayNone() const = 0;
   virtual AtomicString Csp() const = 0;
-  virtual const WebVector<WebFeaturePolicyFeature>& AllowedFeatures() const = 0;
   virtual const WebParsedFeaturePolicy& ContainerPolicy() const = 0;
 };
 
@@ -85,10 +84,6 @@
   bool AllowPaymentRequest() const override { return false; }
   bool IsDisplayNone() const override { return false; }
   AtomicString Csp() const override { return g_null_atom; }
-  const WebVector<WebFeaturePolicyFeature>& AllowedFeatures() const override {
-    DEFINE_STATIC_LOCAL(WebVector<WebFeaturePolicyFeature>, features, ());
-    return features;
-  }
   const WebParsedFeaturePolicy& ContainerPolicy() const override {
     DEFINE_STATIC_LOCAL(WebParsedFeaturePolicy, container_policy, ());
     return container_policy;
diff --git a/third_party/WebKit/Source/core/frame/LocalFrameView.cpp b/third_party/WebKit/Source/core/frame/LocalFrameView.cpp
index d4bff49..fce9db4 100644
--- a/third_party/WebKit/Source/core/frame/LocalFrameView.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalFrameView.cpp
@@ -208,12 +208,14 @@
       needs_paint_property_update_(true),
       current_update_lifecycle_phases_target_state_(
           DocumentLifecycle::kUninitialized),
+      past_layout_lifecycle_update_(false),
       scroll_anchor_(this),
       scrollbar_manager_(*this),
       needs_scrollbars_update_(false),
       suppress_adjust_view_size_(false),
       allows_layout_invalidation_after_layout_clean_(true),
       forcing_layout_parent_view_(false),
+      needs_intersection_observation_(false),
       main_thread_scrolling_reasons_(0),
       paint_frame_count_(0) {
   Init();
@@ -3143,6 +3145,9 @@
     return;
   }
 
+  AutoReset<bool> past_layout_lifecycle_update(&past_layout_lifecycle_update_,
+                                               true);
+
   ForAllNonThrottledLocalFrameViews([](LocalFrameView& frame_view) {
     frame_view.PerformScrollAnchoringAdjustments();
   });
@@ -4977,6 +4982,7 @@
        child = child->Tree().NextSibling()) {
     child->View()->UpdateViewportIntersectionsForSubtree(target_state);
   }
+  needs_intersection_observation_ = false;
 }
 
 void LocalFrameView::UpdateRenderThrottlingStatusForTesting() {
@@ -5137,9 +5143,23 @@
                                    total_screens_away));
 }
 
+void LocalFrameView::SetNeedsIntersectionObservation() {
+  needs_intersection_observation_ = true;
+  if (LocalFrameView* parent = ParentFrameView())
+    parent->SetNeedsIntersectionObservation();
+}
+
 bool LocalFrameView::ShouldThrottleRendering() const {
-  return CanThrottleRendering() && frame_->GetDocument() &&
-         Lifecycle().ThrottlingAllowed();
+  bool throttled_for_global_reasons = CanThrottleRendering() &&
+                                      frame_->GetDocument() &&
+                                      Lifecycle().ThrottlingAllowed();
+  if (!throttled_for_global_reasons)
+    return false;
+
+  // Only lifecycle phases up to layout are needed to generate an
+  // intersection observation.
+  return !needs_intersection_observation_ ||
+         GetFrame().LocalFrameRoot().View()->past_layout_lifecycle_update_;
 }
 
 bool LocalFrameView::CanThrottleRendering() const {
diff --git a/third_party/WebKit/Source/core/frame/LocalFrameView.h b/third_party/WebKit/Source/core/frame/LocalFrameView.h
index 827c27aa..75319ca 100644
--- a/third_party/WebKit/Source/core/frame/LocalFrameView.h
+++ b/third_party/WebKit/Source/core/frame/LocalFrameView.h
@@ -182,6 +182,10 @@
   void SetNeedsUpdateGeometries() { needs_update_geometries_ = true; }
   void UpdateGeometry() override;
 
+  // Marks this frame, and ancestor frames, as needing one intersection
+  // observervation. This overrides throttling for one frame.
+  void SetNeedsIntersectionObservation();
+
   // Methods for getting/setting the size Blink should use to layout the
   // contents.
   // NOTE: Scrollbar exclusion is based on the LocalFrameView's scrollbars. To
@@ -1181,6 +1185,7 @@
   // This is set on the local root frame view only.
   DocumentLifecycle::LifecycleState
       current_update_lifecycle_phases_target_state_;
+  bool past_layout_lifecycle_update_;
 
   ScrollAnchor scroll_anchor_;
   using AnchoringAdjustmentQueue =
@@ -1194,6 +1199,7 @@
   bool suppress_adjust_view_size_;
   bool allows_layout_invalidation_after_layout_clean_;
   bool forcing_layout_parent_view_;
+  bool needs_intersection_observation_;
 
   Member<ElementVisibilityObserver> visibility_observer_;
 
diff --git a/third_party/WebKit/Source/core/frame/RemoteFrameOwner.h b/third_party/WebKit/Source/core/frame/RemoteFrameOwner.h
index a6fe4d2..99aafc30 100644
--- a/third_party/WebKit/Source/core/frame/RemoteFrameOwner.h
+++ b/third_party/WebKit/Source/core/frame/RemoteFrameOwner.h
@@ -52,9 +52,6 @@
   bool AllowPaymentRequest() const override { return allow_payment_request_; }
   bool IsDisplayNone() const override { return is_display_none_; }
   AtomicString Csp() const override { return csp_; }
-  const WebVector<WebFeaturePolicyFeature>& AllowedFeatures() const override {
-    return allowed_features_;
-  }
   const WebParsedFeaturePolicy& ContainerPolicy() const override {
     return container_policy_;
   }
@@ -75,10 +72,6 @@
     is_display_none_ = is_display_none;
   }
   void SetCsp(const WebString& csp) { csp_ = csp; }
-  void SetAllowedFeatures(
-      const WebVector<WebFeaturePolicyFeature>& allowed_features) {
-    allowed_features_ = allowed_features;
-  }
   void SetContainerPolicy(const WebParsedFeaturePolicy& container_policy) {
     container_policy_ = container_policy;
   }
@@ -105,7 +98,6 @@
   bool allow_payment_request_;
   bool is_display_none_;
   WebString csp_;
-  WebVector<WebFeaturePolicyFeature> allowed_features_;
   WebParsedFeaturePolicy container_policy_;
 };
 
diff --git a/third_party/WebKit/Source/core/frame/WebFrameWidgetImpl.cpp b/third_party/WebKit/Source/core/frame/WebFrameWidgetImpl.cpp
index eab267d..d205f37 100644
--- a/third_party/WebKit/Source/core/frame/WebFrameWidgetImpl.cpp
+++ b/third_party/WebKit/Source/core/frame/WebFrameWidgetImpl.cpp
@@ -35,7 +35,6 @@
 #include "build/build_config.h"
 #include "core/animation/CompositorMutatorImpl.h"
 #include "core/dom/UserGestureIndicator.h"
-#include "core/editing/CompositionUnderlineVectorBuilder.h"
 #include "core/editing/EditingUtilities.h"
 #include "core/editing/Editor.h"
 #include "core/editing/FrameSelection.h"
diff --git a/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.cpp b/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.cpp
index e652c8c5..0b9e98e 100644
--- a/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.cpp
+++ b/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.cpp
@@ -109,11 +109,11 @@
 #include "core/dom/NodeTraversal.h"
 #include "core/dom/ShadowRoot.h"
 #include "core/dom/UserGestureIndicator.h"
-#include "core/editing/CompositionUnderlineVectorBuilder.h"
 #include "core/editing/EditingUtilities.h"
 #include "core/editing/Editor.h"
 #include "core/editing/FindInPageCoordinates.h"
 #include "core/editing/FrameSelection.h"
+#include "core/editing/ImeTextSpanVectorBuilder.h"
 #include "core/editing/InputMethodController.h"
 #include "core/editing/PlainTextRange.h"
 #include "core/editing/SetSelectionData.h"
@@ -954,7 +954,7 @@
 void WebLocalFrameImpl::SetMarkedText(const WebString& text,
                                       unsigned location,
                                       unsigned length) {
-  Vector<CompositionUnderline> decorations;
+  Vector<ImeTextSpan> decorations;
   GetFrame()->GetInputMethodController().SetComposition(text, decorations,
                                                         location, length);
 }
@@ -1289,7 +1289,7 @@
 bool WebLocalFrameImpl::SetCompositionFromExistingText(
     int composition_start,
     int composition_end,
-    const WebVector<WebCompositionUnderline>& underlines) {
+    const WebVector<WebImeTextSpan>& ime_text_spans) {
   TRACE_EVENT0("blink", "WebLocalFrameImpl::setCompositionFromExistingText");
   if (!GetFrame()->GetEditor().CanEdit())
     return false;
@@ -1302,7 +1302,7 @@
   GetFrame()->GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets();
 
   input_method_controller.SetCompositionFromExistingText(
-      CompositionUnderlineVectorBuilder::Build(underlines), composition_start,
+      ImeTextSpanVectorBuilder::Build(ime_text_spans), composition_start,
       composition_end);
 
   return true;
@@ -1688,7 +1688,7 @@
       owner_element->ScrollingMode(), owner_element->MarginWidth(),
       owner_element->MarginHeight(), owner_element->AllowFullscreen(),
       owner_element->AllowPaymentRequest(), owner_element->IsDisplayNone(),
-      owner_element->Csp(), owner_element->AllowedFeatures());
+      owner_element->Csp());
   // FIXME: Using subResourceAttributeName as fallback is not a perfect
   // solution. subResourceAttributeName returns just one attribute name. The
   // element might not have the attribute, and there might be other attributes
diff --git a/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.h b/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.h
index 9cc9467e..548d045 100644
--- a/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.h
+++ b/third_party/WebKit/Source/core/frame/WebLocalFrameImpl.h
@@ -203,7 +203,7 @@
   bool SetCompositionFromExistingText(
       int composition_start,
       int composition_end,
-      const WebVector<WebCompositionUnderline>& underlines) override;
+      const WebVector<WebImeTextSpan>& ime_text_spans) override;
   void ExtendSelectionAndDelete(int before, int after) override;
   void DeleteSurroundingText(int before, int after) override;
   void DeleteSurroundingTextInCodePoints(int before, int after) override;
diff --git a/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp b/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp
index c5bcbe9..3a1db63 100644
--- a/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp
@@ -187,12 +187,6 @@
   DispatchScopedEvent(Event::Create(EventTypeNames::load));
 }
 
-const WebVector<WebFeaturePolicyFeature>&
-HTMLFrameOwnerElement::AllowedFeatures() const {
-  DEFINE_STATIC_LOCAL(WebVector<WebFeaturePolicyFeature>, features, ());
-  return features;
-}
-
 const WebParsedFeaturePolicy& HTMLFrameOwnerElement::ContainerPolicy() const {
   return container_policy_;
 }
diff --git a/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.h b/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.h
index 5ea9eb8a..5046ce5 100644
--- a/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.h
+++ b/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.h
@@ -101,7 +101,6 @@
   bool AllowPaymentRequest() const override { return false; }
   bool IsDisplayNone() const override { return !embedded_content_view_; }
   AtomicString Csp() const override { return g_null_atom; }
-  const WebVector<WebFeaturePolicyFeature>& AllowedFeatures() const override;
   const WebParsedFeaturePolicy& ContainerPolicy() const override;
 
   // For unit tests, manually trigger the UpdateContainerPolicy method.
diff --git a/third_party/WebKit/Source/core/html/HTMLIFrameElement.cpp b/third_party/WebKit/Source/core/html/HTMLIFrameElement.cpp
index 6aa3ab9..32fd355 100644
--- a/third_party/WebKit/Source/core/html/HTMLIFrameElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLIFrameElement.cpp
@@ -189,7 +189,6 @@
           kOtherMessageSource, kErrorMessageLevel,
           "Error while parsing the 'allow' attribute: " + invalid_tokens));
     }
-    FrameOwnerPropertiesChanged();
     UpdateContainerPolicy();
     UseCounter::Count(GetDocument(), WebFeature::kFeaturePolicyAllowAttribute);
   } else {
@@ -205,7 +204,7 @@
   Vector<WebParsedFeaturePolicyDeclaration> container_policy;
 
   // Populate the initial container policy from the allow attribute.
-  for (const WebFeaturePolicyFeature feature : AllowedFeatures()) {
+  for (const WebFeaturePolicyFeature feature : allowed_features_) {
     WebParsedFeaturePolicyDeclaration whitelist;
     whitelist.feature = feature;
     whitelist.origins = Vector<WebSecurityOrigin>(1UL, {origin});
diff --git a/third_party/WebKit/Source/core/html/HTMLIFrameElement.h b/third_party/WebKit/Source/core/html/HTMLIFrameElement.h
index f49a4bff..c4111f8 100644
--- a/third_party/WebKit/Source/core/html/HTMLIFrameElement.h
+++ b/third_party/WebKit/Source/core/html/HTMLIFrameElement.h
@@ -81,9 +81,6 @@
   bool AllowFullscreen() const override { return allow_fullscreen_; }
   bool AllowPaymentRequest() const override { return allow_payment_request_; }
   AtomicString Csp() const override { return csp_; }
-  const WebVector<WebFeaturePolicyFeature>& AllowedFeatures() const override {
-    return allowed_features_;
-  }
 
   AtomicString name_;
   AtomicString csp_;
diff --git a/third_party/WebKit/Source/core/html/ImageData.cpp b/third_party/WebKit/Source/core/html/ImageData.cpp
index 5378061..5b3176e 100644
--- a/third_party/WebKit/Source/core/html/ImageData.cpp
+++ b/third_party/WebKit/Source/core/html/ImageData.cpp
@@ -319,13 +319,21 @@
   return new ImageData(IntSize(width, height), data.View());
 }
 
+bool ColorManagementEnabled(const ImageDataColorSettings& color_settings) {
+  if (CanvasColorParams::ColorCorrectRenderingInAnyColorSpace())
+    return true;
+  if (CanvasColorParams::ColorCorrectRenderingInSRGBOnly() &&
+      color_settings.colorSpace() == kSRGBCanvasColorSpaceName)
+    return true;
+  return false;
+}
+
 ImageData* ImageData::CreateImageData(
     unsigned width,
     unsigned height,
     const ImageDataColorSettings& color_settings,
     ExceptionState& exception_state) {
-  if (!RuntimeEnabledFeatures::ColorCanvasExtensionsEnabled() &&
-      !RuntimeEnabledFeatures::ColorCorrectRenderingEnabled())
+  if (!ColorManagementEnabled(color_settings))
     return nullptr;
 
   if (!ImageData::ValidateConstructorArguments(
@@ -349,7 +357,7 @@
                                       unsigned height,
                                       ImageDataColorSettings& color_settings,
                                       ExceptionState& exception_state) {
-  if (!RuntimeEnabledFeatures::ColorCanvasExtensionsEnabled())
+  if (!ColorManagementEnabled(color_settings))
     return nullptr;
 
   DOMArrayBufferView* buffer_view = nullptr;
@@ -701,7 +709,7 @@
 }
 
 CanvasColorParams ImageData::GetCanvasColorParams() {
-  if (!RuntimeEnabledFeatures::ColorCanvasExtensionsEnabled())
+  if (!ColorManagementEnabled(color_settings_))
     return CanvasColorParams();
   CanvasColorSpace color_space =
       ImageData::GetCanvasColorSpace(color_settings_.colorSpace());
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp b/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp
index 0a2c8e2..25f5459 100644
--- a/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp
+++ b/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp
@@ -39,27 +39,24 @@
     : host_(host),
       color_params_(kLegacyCanvasColorSpace, kRGBA8CanvasPixelFormat),
       creation_attributes_(attrs) {
-  if (RuntimeEnabledFeatures::ColorCanvasExtensionsEnabled()) {
-    // Set the default color space to SRGB and continue
-    CanvasColorSpace color_space = kSRGBCanvasColorSpace;
-    if (creation_attributes_.colorSpace() == kRec2020CanvasColorSpaceName)
-      color_space = kRec2020CanvasColorSpace;
-    else if (creation_attributes_.colorSpace() == kP3CanvasColorSpaceName)
-      color_space = kP3CanvasColorSpace;
+  if (CanvasColorParams::ColorCorrectRenderingEnabled()) {
+    color_params_.SetCanvasColorSpace(kSRGBCanvasColorSpace);
+    if (CanvasColorParams::ColorCorrectRenderingInAnyColorSpace()) {
+      if (creation_attributes_.colorSpace() == kRec2020CanvasColorSpaceName)
+        color_params_.SetCanvasColorSpace(kRec2020CanvasColorSpace);
+      else if (creation_attributes_.colorSpace() == kP3CanvasColorSpaceName)
+        color_params_.SetCanvasColorSpace(kP3CanvasColorSpace);
 
-    // For now, we only support RGBA8 (for SRGB) and F16 (for all). Everything
-    // else falls back to SRGB + RGBA8.
-    CanvasPixelFormat pixel_format = kRGBA8CanvasPixelFormat;
-    if (creation_attributes_.pixelFormat() == kF16CanvasPixelFormatName) {
-      pixel_format = kF16CanvasPixelFormat;
-    } else {
-      color_space = kSRGBCanvasColorSpace;
-      pixel_format = kRGBA8CanvasPixelFormat;
+      // For now, we only support RGBA8 (for SRGB) and F16 (for all). Everything
+      // else falls back to SRGB + RGBA8.
+      if (creation_attributes_.pixelFormat() == kF16CanvasPixelFormatName) {
+        color_params_.SetCanvasPixelFormat(kF16CanvasPixelFormat);
+      } else {
+        color_params_.SetCanvasColorSpace(kSRGBCanvasColorSpace);
+        color_params_.SetCanvasPixelFormat(kRGBA8CanvasPixelFormat);
+      }
     }
-
-    color_params_ = CanvasColorParams(color_space, pixel_format);
   }
-
   // Make m_creationAttributes reflect the effective colorSpace, pixelFormat and
   // linearPixelMath rather than the requested one.
   creation_attributes_.setColorSpace(ColorSpaceAsString());
diff --git a/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.cpp b/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.cpp
index cc56c1e..bb40501a 100644
--- a/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.cpp
+++ b/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.cpp
@@ -137,12 +137,8 @@
 BackgroundHTMLParser::~BackgroundHTMLParser() {}
 
 void BackgroundHTMLParser::AppendRawBytesFromMainThread(
-    std::unique_ptr<Vector<char>> buffer,
-    double bytes_received_time) {
+    std::unique_ptr<Vector<char>> buffer) {
   DCHECK(decoder_);
-  DEFINE_STATIC_LOCAL(CustomCountHistogram, queue_delay,
-                      ("Parser.AppendBytesDelay", 1, 5000, 50));
-  queue_delay.Count(MonotonicallyIncreasingTimeMS() - bytes_received_time);
   UpdateDocument(decoder_->Decode(buffer->data(), buffer->size()));
 }
 
diff --git a/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.h b/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.h
index bedb00d2..b67a00a 100644
--- a/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.h
+++ b/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.h
@@ -89,8 +89,7 @@
     String unparsed_input;
   };
 
-  void AppendRawBytesFromMainThread(std::unique_ptr<Vector<char>>,
-                                    double bytes_received_time);
+  void AppendRawBytesFromMainThread(std::unique_ptr<Vector<char>>);
   void SetDecoder(std::unique_ptr<TextResourceDecoder>);
   void Flush();
   void ResumeFrom(std::unique_ptr<Checkpoint>);
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp b/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp
index 4a3dde3..f4243eb 100644
--- a/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp
+++ b/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp
@@ -181,18 +181,6 @@
 }
 
 void HTMLDocumentParser::Detach() {
-  if (!IsParsingFragment() && tokenized_chunk_queue_.Get() &&
-      tokenized_chunk_queue_->PeakPendingChunkCount()) {
-    DEFINE_STATIC_LOCAL(CustomCountHistogram, peak_pending_chunk_histogram,
-                        ("Parser.PeakPendingChunkCount", 1, 1000, 50));
-    peak_pending_chunk_histogram.Count(
-        tokenized_chunk_queue_->PeakPendingChunkCount());
-    DEFINE_STATIC_LOCAL(CustomCountHistogram, peak_pending_token_histogram,
-                        ("Parser.PeakPendingTokenCount", 1, 100000, 50));
-    peak_pending_token_histogram.Count(
-        tokenized_chunk_queue_->PeakPendingTokenCount());
-  }
-
   if (have_background_parser_)
     StopBackgroundParser();
   DocumentParser::Detach();
@@ -1186,7 +1174,6 @@
     return;
 
   if (ShouldUseThreading()) {
-    double bytes_received_time = MonotonicallyIncreasingTimeMS();
     if (!have_background_parser_)
       StartBackgroundParser();
 
@@ -1199,8 +1186,7 @@
     loading_task_runner_->PostTask(
         BLINK_FROM_HERE,
         WTF::Bind(&BackgroundHTMLParser::AppendRawBytesFromMainThread,
-                  background_parser_, WTF::Passed(std::move(buffer)),
-                  bytes_received_time));
+                  background_parser_, WTF::Passed(std::move(buffer))));
     return;
   }
 
diff --git a/third_party/WebKit/Source/core/html/parser/TokenizedChunkQueue.cpp b/third_party/WebKit/Source/core/html/parser/TokenizedChunkQueue.cpp
index dac3543..528ecd3 100644
--- a/third_party/WebKit/Source/core/html/parser/TokenizedChunkQueue.cpp
+++ b/third_party/WebKit/Source/core/html/parser/TokenizedChunkQueue.cpp
@@ -16,20 +16,12 @@
 
 bool TokenizedChunkQueue::Enqueue(
     std::unique_ptr<HTMLDocumentParser::TokenizedChunk> chunk) {
-  pending_token_count_ += chunk->tokens->size();
-  peak_pending_token_count_ =
-      std::max(peak_pending_token_count_, pending_token_count_);
-
   bool was_empty = pending_chunks_.IsEmpty();
   pending_chunks_.push_back(std::move(chunk));
-  peak_pending_chunk_count_ =
-      std::max(peak_pending_chunk_count_, pending_chunks_.size());
-
   return was_empty;
 }
 
 void TokenizedChunkQueue::Clear() {
-  pending_token_count_ = 0;
   pending_chunks_.clear();
 }
 
@@ -39,12 +31,4 @@
   pending_chunks_.swap(vector);
 }
 
-size_t TokenizedChunkQueue::PeakPendingChunkCount() {
-  return peak_pending_chunk_count_;
-}
-
-size_t TokenizedChunkQueue::PeakPendingTokenCount() {
-  return peak_pending_token_count_;
-}
-
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/html/parser/TokenizedChunkQueue.h b/third_party/WebKit/Source/core/html/parser/TokenizedChunkQueue.h
index e84cd884..b7080a4 100644
--- a/third_party/WebKit/Source/core/html/parser/TokenizedChunkQueue.h
+++ b/third_party/WebKit/Source/core/html/parser/TokenizedChunkQueue.h
@@ -35,16 +35,11 @@
   void Clear();
 
   void TakeAll(Vector<std::unique_ptr<HTMLDocumentParser::TokenizedChunk>>&);
-  size_t PeakPendingChunkCount();
-  size_t PeakPendingTokenCount();
 
  private:
   TokenizedChunkQueue();
 
   Vector<std::unique_ptr<HTMLDocumentParser::TokenizedChunk>> pending_chunks_;
-  size_t peak_pending_chunk_count_ = 0;
-  size_t peak_pending_token_count_ = 0;
-  size_t pending_token_count_ = 0;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/imagebitmap/ImageBitmap.cpp b/third_party/WebKit/Source/core/imagebitmap/ImageBitmap.cpp
index 96ab5af..ee1d747 100644
--- a/third_party/WebKit/Source/core/imagebitmap/ImageBitmap.cpp
+++ b/third_party/WebKit/Source/core/imagebitmap/ImageBitmap.cpp
@@ -67,13 +67,7 @@
   }
 
   if (options.colorSpaceConversion() != kImageBitmapOptionNone) {
-    parsed_options.color_canvas_extensions_enabled =
-        RuntimeEnabledFeatures::ColorCanvasExtensionsEnabled();
-    if (!parsed_options.color_canvas_extensions_enabled) {
-      DCHECK_EQ(options.colorSpaceConversion(), kImageBitmapOptionDefault);
-      parsed_options.color_params.SetCanvasColorSpace(kLegacyCanvasColorSpace);
-      parsed_options.color_canvas_extensions_enabled = true;
-    } else {
+    if (CanvasColorParams::ColorCorrectRenderingInAnyColorSpace()) {
       if (options.colorSpaceConversion() == kImageBitmapOptionDefault ||
           options.colorSpaceConversion() ==
               kSRGBImageBitmapColorSpaceConversion) {
@@ -96,6 +90,12 @@
             << "Invalid ImageBitmap creation attribute colorSpaceConversion: "
             << options.colorSpaceConversion();
       }
+    } else if (CanvasColorParams::ColorCorrectRenderingInSRGBOnly()) {
+      DCHECK_EQ(options.colorSpaceConversion(), kImageBitmapOptionDefault);
+      parsed_options.color_params.SetCanvasColorSpace(kSRGBCanvasColorSpace);
+    } else {
+      DCHECK_EQ(options.colorSpaceConversion(), kImageBitmapOptionDefault);
+      parsed_options.color_params.SetCanvasColorSpace(kLegacyCanvasColorSpace);
     }
   }
 
@@ -302,39 +302,27 @@
 RefPtr<StaticBitmapImage> ApplyColorSpaceConversion(
     RefPtr<StaticBitmapImage>&& image,
     ImageBitmap::ParsedOptions& options) {
-  if (options.color_params.UsesOutputSpaceBlending() &&
-      RuntimeEnabledFeatures::ColorCorrectRenderingEnabled()) {
-    image = image->ConvertToColorSpace(options.color_params.GetSkColorSpace(),
-                                       SkTransferFunctionBehavior::kIgnore);
-  }
-  sk_sp<SkImage> skia_image = image->PaintImageForCurrentFrame().GetSkImage();
-  if (!options.color_canvas_extensions_enabled || !skia_image->colorSpace())
+  if (!CanvasColorParams::ColorCorrectRenderingEnabled())
     return image;
 
-  sk_sp<SkColorSpace> dst_color_space =
-      options.color_params.GetSkColorSpaceForSkSurfaces();
-  DCHECK(dst_color_space.get());
-  if (SkColorSpace::Equals(skia_image->colorSpace(), dst_color_space.get()))
+  // TODO(zakerinasab): crbug.com/754713
+  // If image does not have any color space info and we must color convert to
+  // SRGB, we should tag the image as SRGB. Since we cannot use SkImage::
+  // makeColorSpace() on SkImages with no color space to get the image in SRGB,
+  // we have to do this using a slow code path (reading the pixels and creating
+  // a new SRGB SkImage). This is inefficient and also converts GPU-backed
+  // images to CPU-backed. For now, we ignore this and let the images be in
+  // null color space. This must be okay if color management is only supported
+  // for SRGB. This might be okay for converting null color space to other
+  // color spaces. Please see crbug.com/754713 for more details.
+
+  if (!CanvasColorParams::ColorCorrectRenderingInAnyColorSpace())
     return image;
 
-  SkImageInfo dst_info =
-      SkImageInfo::Make(skia_image->width(), skia_image->height(),
-                        options.color_params.GetSkColorType(),
-                        skia_image->alphaType(), dst_color_space);
-  size_t size = image->width() * image->height() * dst_info.bytesPerPixel();
-  sk_sp<SkData> dst_data = SkData::MakeUninitialized(size);
-  if (dst_data->size() != size)
-    return image;
-  if (skia_image->readPixels(dst_info, dst_data->writable_data(),
-                             skia_image->width() * dst_info.bytesPerPixel(), 0,
-                             0)) {
-    skia_image = SkImage::MakeRasterData(
-        dst_info, dst_data, skia_image->width() * dst_info.bytesPerPixel());
-    return StaticBitmapImage::Create(skia_image,
-                                     image->ContextProviderWrapper());
-  }
-  NOTREACHED();
-  return image;
+  // Color correct the image. This code path uses SkImage::makeColorSpace(). If
+  // the color space of the source image is nullptr, it will be assumed in SRGB.
+  return image->ConvertToColorSpace(options.color_params.GetSkColorSpace(),
+                                    SkTransferFunctionBehavior::kRespect);
 }
 
 RefPtr<StaticBitmapImage> MakeBlankImage(
@@ -474,9 +462,8 @@
   if (!sk_image->isTextureBacked() && !sk_image->peekPixels(&pixmap)) {
     sk_sp<SkColorSpace> dst_color_space = nullptr;
     SkColorType dst_color_type = kN32_SkColorType;
-    if (parsed_options.color_canvas_extensions_enabled ||
-        (parsed_options.color_params.UsesOutputSpaceBlending() &&
-         RuntimeEnabledFeatures::ColorCorrectRenderingEnabled())) {
+    if (CanvasColorParams::ColorCorrectRenderingInAnyColorSpace() ||
+        parsed_options.color_params.ColorCorrectNoColorSpaceToSRGB()) {
       dst_color_space = parsed_options.color_params.GetSkColorSpace();
       dst_color_type = parsed_options.color_params.GetSkColorType();
     }
@@ -656,6 +643,12 @@
       kUnpremul_SkAlphaType,
       cropped_data->GetCanvasColorParams().GetSkColorSpaceForSkSurfaces());
 
+  // If we are in color correct rendering mode but we only color correct to
+  // SRGB, we don't do any color conversion when transferring the pixels from
+  // ImageData to ImageBitmap to avoid double gamma correction. We tag the
+  // image with SRGB color space later in ApplyColorSpaceConversion().
+  if (CanvasColorParams::ColorCorrectRenderingInSRGBOnly())
+    info = info.makeColorSpace(nullptr);
   image_ = NewImageFromRaster(info, std::move(image_pixels));
 
   // swizzle back
diff --git a/third_party/WebKit/Source/core/imagebitmap/ImageBitmap.h b/third_party/WebKit/Source/core/imagebitmap/ImageBitmap.h
index 495cf8c..88221fea 100644
--- a/third_party/WebKit/Source/core/imagebitmap/ImageBitmap.h
+++ b/third_party/WebKit/Source/core/imagebitmap/ImageBitmap.h
@@ -150,7 +150,6 @@
     IntRect crop_rect;
     SkFilterQuality resize_quality = kLow_SkFilterQuality;
     CanvasColorParams color_params;
-    bool color_canvas_extensions_enabled = false;
   };
 
   DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/core/imagebitmap/ImageBitmapTest.cpp b/third_party/WebKit/Source/core/imagebitmap/ImageBitmapTest.cpp
index 6f44d8a3..2ef19db 100644
--- a/third_party/WebKit/Source/core/imagebitmap/ImageBitmapTest.cpp
+++ b/third_party/WebKit/Source/core/imagebitmap/ImageBitmapTest.cpp
@@ -230,6 +230,8 @@
   }
 }
 
+constexpr float kWideGamutColorCorrectionTolerance = 0.01;
+
 enum class ColorSpaceConversion : uint8_t {
   NONE = 0,
   DEFAULT_NOT_COLOR_CORRECTED = 1,
@@ -261,6 +263,50 @@
   return options;
 }
 
+float Float16ToFloat(const uint16_t& f16) {
+  union FloatUIntUnion {
+    uint32_t fUInt;
+    float fFloat;
+  };
+  FloatUIntUnion magic = {126 << 23};
+  FloatUIntUnion o;
+  if (((f16 >> 10) & 0x001f) == 0) {
+    o.fUInt = magic.fUInt + (f16 & 0x03ff);
+    o.fFloat -= magic.fFloat;
+  } else {
+    o.fUInt = (f16 & 0x03ff) << 13;
+    if (((f16 >> 10) & 0x001f) == 0x1f)
+      o.fUInt |= (255 << 23);
+    else
+      o.fUInt |= ((127 - 15 + ((f16 >> 10) & 0x001f)) << 23);
+  }
+  o.fUInt |= ((f16 >> 15) << 31);
+  return o.fFloat;
+}
+
+void CompareColorCorrectedPixels(std::unique_ptr<uint8_t[]>& converted_pixel,
+                                 std::unique_ptr<uint8_t[]>& transformed_pixel,
+                                 int bytes_per_pixel) {
+  if (bytes_per_pixel == 4) {
+    ASSERT_EQ(std::memcmp(converted_pixel.get(), transformed_pixel.get(), 4),
+              0);
+  } else {
+    uint16_t *f16_converted =
+                 static_cast<uint16_t*>((void*)(converted_pixel.get())),
+             *f16_trnasformed =
+                 static_cast<uint16_t*>((void*)(transformed_pixel.get()));
+    bool test_passed = true;
+    for (int p = 0; p < 4; p++) {
+      if (std::fabs(Float16ToFloat(f16_converted[p]) -
+                    Float16ToFloat(f16_trnasformed[p])) >
+          kWideGamutColorCorrectionTolerance) {
+        test_passed = false;
+      }
+    }
+    ASSERT_EQ(test_passed, true);
+  }
+}
+
 // This test is failing on Android Arm 64 Official Test Bot.
 // See <http://crbug.com/721819>.
 #if defined(OS_ANDROID)
@@ -384,9 +430,8 @@
                              color_format32, src_pixel.get(), 1,
                              SkAlphaType::kPremul_SkAlphaType);
 
-    int compare = std::memcmp(converted_pixel.get(), transformed_pixel.get(),
-                              image_info.bytesPerPixel());
-    ASSERT_EQ(compare, 0);
+    CompareColorCorrectedPixels(converted_pixel, transformed_pixel,
+                                image_info.bytesPerPixel());
   }
 }
 
@@ -510,9 +555,8 @@
                              color_format32, src_pixel.get(), 1,
                              SkAlphaType::kPremul_SkAlphaType);
 
-    int compare = std::memcmp(converted_pixel.get(), transformed_pixel.get(),
-                              image_info.bytesPerPixel());
-    ASSERT_EQ(compare, 0);
+    CompareColorCorrectedPixels(converted_pixel, transformed_pixel,
+                                image_info.bytesPerPixel());
   }
 }
 
@@ -627,9 +671,8 @@
                              color_format32, src_pixel.get(), 1,
                              SkAlphaType::kPremul_SkAlphaType);
 
-    int compare = std::memcmp(converted_pixel.get(), transformed_pixel.get(),
-                              image_info.bytesPerPixel());
-    ASSERT_EQ(compare, 0);
+    CompareColorCorrectedPixels(converted_pixel, transformed_pixel,
+                                image_info.bytesPerPixel());
   }
 }
 
@@ -716,9 +759,8 @@
         SkColorSpaceXform::ColorFormat::kRGBA_8888_ColorFormat, src_pixel.get(),
         1, SkAlphaType::kPremul_SkAlphaType);
 
-    int compare = std::memcmp(converted_pixel.get(), transformed_pixel.get(),
-                              image_info.bytesPerPixel());
-    ASSERT_EQ(compare, 0);
+    CompareColorCorrectedPixels(converted_pixel, transformed_pixel,
+                                image_info.bytesPerPixel());
   }
 }
 
diff --git a/third_party/WebKit/Source/core/input/ScrollManager.cpp b/third_party/WebKit/Source/core/input/ScrollManager.cpp
index ec6c58a..218f6c69 100644
--- a/third_party/WebKit/Source/core/input/ScrollManager.cpp
+++ b/third_party/WebKit/Source/core/input/ScrollManager.cpp
@@ -591,9 +591,6 @@
 
   if (scrollbar) {
     bool should_update_capture = false;
-    // scrollbar->gestureEvent always returns true for touchpad based GSB
-    // events. Therefore, while mouse is over a fully scrolled scrollbar, GSB
-    // won't propagate to the next scrollable layer.
     if (scrollbar->GestureEvent(gesture_event, &should_update_capture)) {
       if (should_update_capture)
         scrollbar_handling_scroll_gesture_ = scrollbar;
diff --git a/third_party/WebKit/Source/core/inspector/browser_protocol.json b/third_party/WebKit/Source/core/inspector/browser_protocol.json
index b6ed8c13..1a922071 100644
--- a/third_party/WebKit/Source/core/inspector/browser_protocol.json
+++ b/third_party/WebKit/Source/core/inspector/browser_protocol.json
@@ -1096,8 +1096,8 @@
                     { "name": "securityState", "$ref": "SecurityState", "description": "Security state representing the severity of the factor being explained." },
                     { "name": "summary", "type": "string", "description": "Short phrase describing the type of factor." },
                     { "name": "description", "type": "string", "description": "Full text explanation of the factor." },
-                    { "name": "hasCertificate", "type": "boolean", "description": "True if the page has a certificate." },
-                    { "name": "mixedContentType", "$ref": "MixedContentType", "description": "The type of mixed content described by the explanation." }
+                    { "name": "mixedContentType", "$ref": "MixedContentType", "description": "The type of mixed content described by the explanation." },
+                    { "name": "certificate", "type": "array", "items": { "type": "string" }, "description": "Page certificate." }
                 ],
                 "description": "An explanation of an factor contributing to the security state."
             },
@@ -1132,10 +1132,6 @@
                 "description": "Disables tracking security state changes."
             },
             {
-                "name": "showCertificateViewer",
-                "description": "Displays native dialog with the certificate details."
-            },
-            {
                 "name": "handleCertificateError",
                 "description": "Handles a certificate error that fired a certificateError event.",
                 "parameters": [
@@ -4970,6 +4966,17 @@
                 ]
             },
             {
+                "name": "getVersion",
+                "description": "Returns version information.",
+                "returns": [
+                    { "name": "protocolVersion", "type": "string", "description": "Protocol version." },
+                    { "name": "product", "type": "string", "description": "Product name." },
+                    { "name": "revision", "type": "string", "description": "Product revision." },
+                    { "name": "userAgent", "type": "string", "description": "User-Agent." },
+                    { "name": "jsVersion", "type": "string", "description": "V8 version." }
+                ]
+            },
+            {
                 "name": "setWindowBounds",
                 "description": "Set position and/or size of the browser window.",
                 "parameters": [
diff --git a/third_party/WebKit/Source/core/intersection_observer/IntersectionObserver.cpp b/third_party/WebKit/Source/core/intersection_observer/IntersectionObserver.cpp
index e075155..69643fc6 100644
--- a/third_party/WebKit/Source/core/intersection_observer/IntersectionObserver.cpp
+++ b/third_party/WebKit/Source/core/intersection_observer/IntersectionObserver.cpp
@@ -257,8 +257,12 @@
       new IntersectionObservation(*this, *target);
   target->EnsureIntersectionObserverData().AddObservation(*observation);
   observations_.insert(observation);
-  if (LocalFrameView* frame_view = target_frame->View())
+  if (LocalFrameView* frame_view = target_frame->View()) {
+    // The IntersectionObsever spec requires that at least one observation
+    // be recorded afer observe() is called, even if the frame is throttled.
+    frame_view->SetNeedsIntersectionObservation();
     frame_view->ScheduleAnimation();
+  }
 }
 
 void IntersectionObserver::unobserve(Element* target,
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
index ca234d0d..68a3782 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
@@ -190,8 +190,7 @@
     // to the canvas. Just dirty the entire canvas when our style changes
     // substantially.
     if ((diff.NeedsFullPaintInvalidation() || diff.NeedsLayout()) &&
-        GetNode() &&
-        (isHTMLHtmlElement(*GetNode()) || isHTMLBodyElement(*GetNode()))) {
+        GetNode() && (IsDocumentElement() || isHTMLBodyElement(*GetNode()))) {
       View()->SetShouldDoFullPaintInvalidation();
 
       if (old_style->HasEntirelyFixedBackground() !=
diff --git a/third_party/WebKit/Source/core/layout/LayoutText.cpp b/third_party/WebKit/Source/core/layout/LayoutText.cpp
index cf3b4cf..bb6974ec 100644
--- a/third_party/WebKit/Source/core/layout/LayoutText.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutText.cpp
@@ -1634,12 +1634,7 @@
       revealed_text = text_[last_typed_character_offset_to_reveal];
   }
 
-  // Replace all grapheme clusters in the text with the mask character.
-  size_t length = NumGraphemeClusters(text_);
-  CHECK_LE(length, text_.length());
-  text_.Truncate(length);
   text_.Fill(mask);
-
   if (last_typed_character_offset_to_reveal >= 0) {
     text_.replace(last_typed_character_offset_to_reveal, 1,
                   String(&revealed_text, 1));
diff --git a/third_party/WebKit/Source/core/layout/MultiColumnFragmentainerGroup.cpp b/third_party/WebKit/Source/core/layout/MultiColumnFragmentainerGroup.cpp
index e0ae9c51..0bec65dd 100644
--- a/third_party/WebKit/Source/core/layout/MultiColumnFragmentainerGroup.cpp
+++ b/third_party/WebKit/Source/core/layout/MultiColumnFragmentainerGroup.cpp
@@ -442,6 +442,12 @@
                     column_set_.PageLogicalWidth());
 }
 
+// Clamp "infinite" clips to a number of pixels that can be losslessly
+// converted to and from floating point, to avoid loss of precision.
+// Note that tables have something similar, see
+// TableLayoutAlgorithm::kTableMaxWidth.
+static const int kMulticolMaxClipPixels = 1000000;
+
 LayoutRect MultiColumnFragmentainerGroup::FlowThreadPortionOverflowRectAt(
     unsigned column_index,
     ClipRectAxesSelector axes_selector) const {
@@ -478,7 +484,9 @@
   // multicol container, in which case it should allow overflow. It will also
   // be clipped in the middle of adjacent column gaps. Care is taken here to
   // avoid rounding errors.
-  LayoutRect overflow_rect(LayoutRect::InfiniteIntRect());
+  LayoutRect overflow_rect(
+      IntRect(-kMulticolMaxClipPixels, -kMulticolMaxClipPixels,
+              2 * kMulticolMaxClipPixels, 2 * kMulticolMaxClipPixels));
   LayoutUnit column_gap = column_set_.ColumnGap();
   if (column_set_.IsHorizontalWritingMode()) {
     if (!is_first_column_in_multicol_container)
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 276b2247..a7d0696 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
@@ -36,10 +36,10 @@
   bool should_clear_left = (clear == EClear::kBoth || clear == EClear::kLeft);
   bool should_clear_right = (clear == EClear::kBoth || clear == EClear::kRight);
 
-  if (exclusions.last_left_float && should_clear_left)
+  if (exclusions.float_left_clear_offset && should_clear_left)
     return true;
 
-  if (exclusions.last_right_float && should_clear_right)
+  if (exclusions.float_right_clear_offset && should_clear_right)
     return true;
 
   auto should_clear_pred =
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_exclusion.cc b/third_party/WebKit/Source/core/layout/ng/ng_exclusion.cc
index 444e00eb..dd32629 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_exclusion.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_exclusion.cc
@@ -49,37 +49,27 @@
   return stream << value.ToString();
 }
 
-NGExclusions::NGExclusions()
-    : last_left_float(nullptr), last_right_float(nullptr) {}
-
-NGExclusions::NGExclusions(const NGExclusions& other) {
-  for (const auto& exclusion : other.storage)
-    Add(*exclusion);
-}
-
 void NGExclusions::Add(const NGExclusion& exclusion) {
-  storage.push_back(WTF::MakeUnique<NGExclusion>(exclusion));
-  if (exclusion.type == NGExclusion::kFloatLeft) {
-    last_left_float = storage.rbegin()->get();
-  } else if (exclusion.type == NGExclusion::kFloatRight) {
-    last_right_float = storage.rbegin()->get();
-  }
-}
+  storage.push_back(exclusion);
+  last_float_block_start =
+      std::max(last_float_block_start, exclusion.rect.BlockStartOffset());
 
-inline NGExclusions& NGExclusions::operator=(const NGExclusions& other) {
-  storage.clear();
-  last_left_float = nullptr;
-  last_right_float = nullptr;
-  for (const auto& exclusion : other.storage)
-    Add(*exclusion);
-  return *this;
+  if (exclusion.type == NGExclusion::kFloatLeft) {
+    float_left_clear_offset =
+        std::max(float_left_clear_offset.value_or(LayoutUnit::Min()),
+                 exclusion.rect.BlockEndOffset());
+  } else if (exclusion.type == NGExclusion::kFloatRight) {
+    float_right_clear_offset =
+        std::max(float_right_clear_offset.value_or(LayoutUnit::Min()),
+                 exclusion.rect.BlockEndOffset());
+  }
 }
 
 bool NGExclusions::operator==(const NGExclusions& other) const {
   if (storage.size() != other.storage.size())
     return false;
   for (size_t i = 0; i < storage.size(); ++i) {
-    if (*storage[i] != *other.storage[i])
+    if (storage[i] != other.storage[i])
       return false;
   }
   return true;
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_exclusion.h b/third_party/WebKit/Source/core/layout/ng/ng_exclusion.h
index 9466dfb..465e1f87 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_exclusion.h
+++ b/third_party/WebKit/Source/core/layout/ng/ng_exclusion.h
@@ -7,6 +7,7 @@
 
 #include "core/CoreExport.h"
 #include "core/layout/ng/geometry/ng_logical_rect.h"
+#include "platform/wtf/Optional.h"
 #include "platform/wtf/Vector.h"
 
 namespace blink {
@@ -56,17 +57,18 @@
 CORE_EXPORT std::ostream& operator<<(std::ostream&, const NGExclusion&);
 
 struct CORE_EXPORT NGExclusions {
-  NGExclusions();
-  NGExclusions(const NGExclusions& other);
+  Vector<NGExclusion> storage;
 
-  Vector<std::unique_ptr<const NGExclusion>> storage;
+  // This member is used for implementing the "top edge alignment rule" for
+  // floats. Floats can be positioned at negative offsets, hence is initialized
+  // the minimum value.
+  LayoutUnit last_float_block_start = LayoutUnit::Min();
 
-  // Last left/right float exclusions are used to enforce the top edge alignment
-  // rule for floats and for the support of CSS "clear" property.
-  const NGExclusion* last_left_float;   // Owned by storage.
-  const NGExclusion* last_right_float;  // Owned by storage.
+  // These members are used for keeping track of the "lowest" offset for each
+  // type of float. This is used for implementing float clearance.
+  Optional<LayoutUnit> float_left_clear_offset;
+  Optional<LayoutUnit> float_right_clear_offset;
 
-  NGExclusions& operator=(const NGExclusions& other);
   bool operator==(const NGExclusions& other) const;
   bool operator!=(const NGExclusions& other) const { return !(*this == other); }
 
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 b222f935..10fe94c8 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
@@ -22,15 +22,9 @@
 NGLogicalOffset AdjustToTopEdgeAlignmentRule(const NGConstraintSpace& space,
                                              const NGLogicalOffset& offset) {
   NGLogicalOffset adjusted_offset = offset;
-  LayoutUnit& adjusted_block_offset = adjusted_offset.block_offset;
-  if (space.Exclusions()->last_left_float)
-    adjusted_block_offset =
-        std::max(adjusted_block_offset,
-                 space.Exclusions()->last_left_float->rect.BlockStartOffset());
-  if (space.Exclusions()->last_right_float)
-    adjusted_block_offset =
-        std::max(adjusted_block_offset,
-                 space.Exclusions()->last_right_float->rect.BlockStartOffset());
+  adjusted_offset.block_offset = std::max(
+      adjusted_offset.block_offset, space.Exclusions()->last_float_block_start);
+
   return adjusted_offset;
 }
 
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 3ae30d0..5f9ab6d 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
@@ -228,10 +228,9 @@
 }
 
 // Compares exclusions by their top position.
-bool CompareNGExclusionsByTopAsc(
-    const std::unique_ptr<const NGExclusion>& lhs,
-    const std::unique_ptr<const NGExclusion>& rhs) {
-  return rhs->rect.offset.block_offset > lhs->rect.offset.block_offset;
+bool CompareNGExclusionsByTopAsc(const NGExclusion& lhs,
+                                 const NGExclusion& rhs) {
+  return rhs.rect.offset.block_offset > lhs.rect.offset.block_offset;
 }
 
 // Compares Layout Opportunities by Start Point.
@@ -294,14 +293,12 @@
 
   NGLayoutOpportunity initial_opportunity =
       CreateInitialOpportunity(available_size, Offset());
-  opportunity_tree_root_.reset(
-      new NGLayoutOpportunityTreeNode(initial_opportunity));
 
+  NGLayoutOpportunityTreeNode tree(initial_opportunity);
   for (const auto& exclusion : exclusions->storage) {
-    InsertExclusion(MutableOpportunityTreeRoot(), exclusion.get(),
-                    opportunities_);
+    InsertExclusion(&tree, &exclusion, opportunities_);
   }
-  CollectAllOpportunities(OpportunityTreeRoot(), opportunities_);
+  CollectAllOpportunities(&tree, opportunities_);
   std::sort(opportunities_.begin(), opportunities_.end(),
             &CompareNGLayoutOpportunitesByStartPoint);
 
@@ -316,13 +313,4 @@
   return NGLayoutOpportunity(*opportunity);
 }
 
-#ifndef NDEBUG
-void NGLayoutOpportunityIterator::ShowLayoutOpportunityTree() const {
-  StringBuilder string_builder;
-  string_builder.Append("\n.:: LayoutOpportunity Tree ::.\n\nRoot Node: ");
-  AppendNodeToString(opportunity_tree_root_.get(), &string_builder);
-  fprintf(stderr, "%s\n", string_builder.ToString().Utf8().data());
-}
-#endif
-
 }  // namespace blink
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 6144fa7..41e19d9 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
@@ -25,6 +25,8 @@
     const NGLogicalSize& size);
 
 class CORE_EXPORT NGLayoutOpportunityIterator final {
+  STACK_ALLOCATED();
+
  public:
   // Default constructor.
   //
@@ -59,19 +61,8 @@
 #endif
 
  private:
-  // Mutable Getters.
-  NGLayoutOpportunityTreeNode* MutableOpportunityTreeRoot() {
-    return opportunity_tree_root_.get();
-  }
-
-  // Read-only Getters.
-  const NGLayoutOpportunityTreeNode* OpportunityTreeRoot() const {
-    return opportunity_tree_root_.get();
-  }
-
   NGLayoutOpportunities opportunities_;
   NGLayoutOpportunities::const_iterator opportunity_iter_;
-  std::unique_ptr<NGLayoutOpportunityTreeNode> opportunity_tree_root_;
   NGLogicalOffset offset_;
 };
 
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 f3cf0531..382df0a 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
@@ -12,50 +12,28 @@
 #include "core/layout/ng/ng_writing_mode.h"
 
 namespace blink {
-namespace {
 
-// Returns max of 2 {@code WTF::Optional} values.
-template <typename T>
-WTF::Optional<T> OptionalMax(const WTF::Optional<T>& value1,
-                             const WTF::Optional<T>& value2) {
-  if (value1 && value2) {
-    return std::max(value1.value(), value2.value());
-  } else if (value1) {
-    return value1;
-  }
-  return value2;
-}
-
-}  // namespace
-
-WTF::Optional<LayoutUnit> GetClearanceOffset(
-    const std::shared_ptr<NGExclusions>& exclusions,
-    EClear clear_type) {
-  const NGExclusion* right_exclusion = exclusions->last_right_float;
-  const NGExclusion* left_exclusion = exclusions->last_left_float;
-
-  WTF::Optional<LayoutUnit> left_offset;
-  if (left_exclusion) {
-    left_offset = left_exclusion->rect.BlockEndOffset();
-  }
-  WTF::Optional<LayoutUnit> right_offset;
-  if (right_exclusion) {
-    right_offset = right_exclusion->rect.BlockEndOffset();
-  }
+LayoutUnit GetClearanceOffset(const std::shared_ptr<NGExclusions>& exclusions,
+                              EClear clear_type) {
+  LayoutUnit float_left_clear_offset =
+      exclusions->float_left_clear_offset.value_or(LayoutUnit::Min());
+  LayoutUnit float_right_clear_offset =
+      exclusions->float_right_clear_offset.value_or(LayoutUnit::Min());
 
   switch (clear_type) {
     case EClear::kNone:
-      return WTF::nullopt;  // nothing to do here.
+      return LayoutUnit::Min();  // nothing to do here.
     case EClear::kLeft:
-      return left_offset;
+      return float_left_clear_offset;
     case EClear::kRight:
-      return right_offset;
+      return float_right_clear_offset;
     case EClear::kBoth:
-      return OptionalMax<LayoutUnit>(left_offset, right_offset);
+      return std::max(float_left_clear_offset, float_right_clear_offset);
     default:
       NOTREACHED();
   }
-  return WTF::nullopt;
+
+  return LayoutUnit::Min();
 }
 
 bool ShouldShrinkToFit(const ComputedStyle& parent_style,
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 c2c9737..1217b4f 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
@@ -18,9 +18,9 @@
 
 // Gets the clearance offset based on the provided {@code clear_type} and list
 // of exclusions that represent left/right float.
-CORE_EXPORT WTF::Optional<LayoutUnit> GetClearanceOffset(
-    const std::shared_ptr<NGExclusions>& exclusions,
-    EClear clear_type);
+CORE_EXPORT LayoutUnit
+GetClearanceOffset(const std::shared_ptr<NGExclusions>& exclusions,
+                   EClear clear_type);
 
 // Whether child's constraint space should shrink to its intrinsic width.
 // This is needed for buttons, select, input, floats and orthogonal children.
diff --git a/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp b/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp
index a29f179..2cbba67 100644
--- a/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp
+++ b/third_party/WebKit/Source/core/loader/resource/ImageResource.cpp
@@ -289,7 +289,14 @@
 }
 
 void ImageResource::AllClientsAndObserversRemoved() {
-  CHECK(!GetContent()->HasImage() || !ErrorOccurred());
+  // After ErrorOccurred() is set true in Resource::FinishAsError() before
+  // the subsequent UpdateImage() in ImageResource::FinishAsError(),
+  // HasImage() is true and ErrorOccurred() is true.
+  // |is_during_finish_as_error_| is introduced to allow such cases.
+  // crbug.com/701723
+  // TODO(hiroshige): Make the CHECK condition cleaner.
+  CHECK(is_during_finish_as_error_ || !GetContent()->HasImage() ||
+        !ErrorOccurred());
   // If possible, delay the resetting until back at the event loop. Doing so
   // after a conservative GC prevents resetAnimation() from upsetting ongoing
   // animation updates (crbug.com/613709)
@@ -410,7 +417,9 @@
   // TODO(hiroshige): Move setEncodedSize() call to Resource::error() if it
   // is really needed, or remove it otherwise.
   SetEncodedSize(0);
+  is_during_finish_as_error_ = true;
   Resource::FinishAsError(error);
+  is_during_finish_as_error_ = false;
   UpdateImage(nullptr, ImageResourceContent::kClearImageAndNotifyObservers,
               true);
 }
diff --git a/third_party/WebKit/Source/core/loader/resource/ImageResource.h b/third_party/WebKit/Source/core/loader/resource/ImageResource.h
index 40b40ac5..1159c1f 100644
--- a/third_party/WebKit/Source/core/loader/resource/ImageResource.h
+++ b/third_party/WebKit/Source/core/loader/resource/ImageResource.h
@@ -176,6 +176,8 @@
 
   Timer<ImageResource> flush_timer_;
   double last_flush_time_ = 0.;
+
+  bool is_during_finish_as_error_ = false;
 };
 
 DEFINE_RESOURCE_TYPE_CASTS(Image);
diff --git a/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp b/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp
index 36e4c77..be2e0f48 100644
--- a/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp
+++ b/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp
@@ -41,6 +41,7 @@
 #include "platform/loader/fetch/FetchParameters.h"
 #include "platform/loader/fetch/MemoryCache.h"
 #include "platform/loader/fetch/ResourceFetcher.h"
+#include "platform/loader/fetch/ResourceFinishObserver.h"
 #include "platform/loader/fetch/ResourceLoader.h"
 #include "platform/loader/fetch/UniqueIdentifier.h"
 #include "platform/loader/testing/MockFetchContext.h"
@@ -57,6 +58,7 @@
 #include "public/platform/WebURL.h"
 #include "public/platform/WebURLLoaderMockFactory.h"
 #include "public/platform/WebURLResponse.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace blink {
@@ -498,6 +500,64 @@
   EXPECT_FALSE(GetMemoryCache()->ResourceForURL(test_url));
 }
 
+class MockFinishObserver : public GarbageCollectedFinalized<MockFinishObserver>,
+                           public ResourceFinishObserver {
+  USING_GARBAGE_COLLECTED_MIXIN(MockFinishObserver);
+
+ public:
+  static MockFinishObserver* Create() {
+    return
+
+        new ::testing::StrictMock<MockFinishObserver>;
+  }
+  MOCK_METHOD0(NotifyFinished, void());
+  String DebugName() const override { return "MockFinishObserver"; }
+
+  DEFINE_INLINE_VIRTUAL_TRACE() {
+    blink::ResourceFinishObserver::Trace(visitor);
+  }
+
+ protected:
+  MockFinishObserver() {}
+};
+
+TEST(ImageResourceTest, CancelWithImageAndFinishObserver) {
+  KURL test_url(kParsedURLString, kTestURL);
+  ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath());
+
+  ResourceFetcher* fetcher = CreateFetcher();
+
+  // Emulate starting a real load.
+  ImageResource* image_resource = ImageResource::CreateForTest(test_url);
+  image_resource->SetIdentifier(CreateUniqueIdentifier());
+
+  fetcher->StartLoad(image_resource);
+  GetMemoryCache()->Add(image_resource);
+
+  Persistent<MockFinishObserver> finish_observer = MockFinishObserver::Create();
+  image_resource->AddFinishObserver(finish_observer);
+
+  // Send the image response.
+  image_resource->ResponseReceived(
+      ResourceResponse(NullURL(), "image/jpeg", sizeof(kJpegImage),
+                       g_null_atom),
+      nullptr);
+  image_resource->AppendData(reinterpret_cast<const char*>(kJpegImage),
+                             sizeof(kJpegImage));
+  ASSERT_TRUE(image_resource->GetContent()->HasImage());
+  EXPECT_EQ(ResourceStatus::kPending, image_resource->GetStatus());
+
+  // This shouldn't crash. crbug.com/701723
+  image_resource->Loader()->Cancel();
+
+  EXPECT_EQ(ResourceStatus::kLoadError, image_resource->GetStatus());
+  EXPECT_FALSE(GetMemoryCache()->ResourceForURL(test_url));
+
+  // ResourceFinishObserver is notified asynchronously.
+  EXPECT_CALL(*finish_observer, NotifyFinished());
+  blink::testing::RunPendingTasks();
+}
+
 TEST(ImageResourceTest, DecodedDataRemainsWhileHasClients) {
   ImageResource* image_resource = ImageResource::CreateForTest(NullURL());
   image_resource->SetStatus(ResourceStatus::kPending);
diff --git a/third_party/WebKit/Source/core/paint/EmbeddedContentPainter.cpp b/third_party/WebKit/Source/core/paint/EmbeddedContentPainter.cpp
index 8ebba762..a260c8e 100644
--- a/third_party/WebKit/Source/core/paint/EmbeddedContentPainter.cpp
+++ b/third_party/WebKit/Source/core/paint/EmbeddedContentPainter.cpp
@@ -62,10 +62,6 @@
     return;
 
   if (layout_embedded_content_.GetEmbeddedContentView()) {
-    // TODO(schenney) crbug.com/93805 Speculative release assert to verify that
-    // the crashes we see in EmbeddedContentView painting are due to a destroyed
-    // LayoutEmbeddedContent object.
-    CHECK(layout_embedded_content_.GetNode());
     Optional<RoundedInnerRectClipper> clipper;
     if (layout_embedded_content_.Style()->HasBorderRadius()) {
       if (border_rect.IsEmpty())
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
index abef542..48f1dd9 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
@@ -1973,10 +1973,6 @@
     needs_composited_scrolling = false;
   }
 
-  // TODO(schenney) Tests fail if we do not also exclude
-  // layer->layoutObject().style()->hasBorderDecoration() (missing background
-  // behind dashed borders). Resolve this case, or not, and update this check
-  // with the results.
   if (layer->GetLayoutObject().Style()->HasBorderRadius()) {
     non_composited_main_thread_scrolling_reasons_ |=
         MainThreadScrollingReason::kHasBorderRadius;
diff --git a/third_party/WebKit/Source/core/paint/compositing/PaintLayerCompositor.h b/third_party/WebKit/Source/core/paint/compositing/PaintLayerCompositor.h
index bc67cd7..f1cf7baa 100644
--- a/third_party/WebKit/Source/core/paint/compositing/PaintLayerCompositor.h
+++ b/third_party/WebKit/Source/core/paint/compositing/PaintLayerCompositor.h
@@ -27,6 +27,7 @@
 #define PaintLayerCompositor_h
 
 #include <memory>
+#include "base/gtest_prod_util.h"
 #include "core/CoreExport.h"
 #include "core/dom/DocumentLifecycle.h"
 #include "core/paint/compositing/CompositingReasonFinder.h"
@@ -298,6 +299,9 @@
   std::unique_ptr<GraphicsLayer> layer_for_horizontal_scrollbar_;
   std::unique_ptr<GraphicsLayer> layer_for_vertical_scrollbar_;
   std::unique_ptr<GraphicsLayer> layer_for_scroll_corner_;
+
+  FRIEND_TEST_ALL_PREFIXES(FrameThrottlingTest,
+                           IntersectionObservationOverridesThrottling);
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/scheduler/FrameThrottlingTest.cpp b/third_party/WebKit/Source/core/scheduler/FrameThrottlingTest.cpp
index 8db9bfb..49c5c1e6 100644
--- a/third_party/WebKit/Source/core/scheduler/FrameThrottlingTest.cpp
+++ b/third_party/WebKit/Source/core/scheduler/FrameThrottlingTest.cpp
@@ -189,6 +189,70 @@
   EXPECT_TRUE(inner_frame_document->View()->CanThrottleRendering());
 }
 
+TEST_P(FrameThrottlingTest, IntersectionObservationOverridesThrottling) {
+  // Create a document with doubly nested iframes.
+  SimRequest main_resource("https://example.com/", "text/html");
+  SimRequest frame_resource("https://example.com/iframe.html", "text/html");
+
+  LoadURL("https://example.com/");
+  main_resource.Complete("<iframe id=frame src=iframe.html></iframe>");
+  frame_resource.Complete("<iframe id=innerFrame sandbox></iframe>");
+
+  auto* frame_element =
+      toHTMLIFrameElement(GetDocument().getElementById("frame"));
+  auto* frame_document = frame_element->contentDocument();
+
+  auto* inner_frame_element =
+      toHTMLIFrameElement(frame_document->getElementById("innerFrame"));
+  auto* inner_frame_document = inner_frame_element->contentDocument();
+
+  DocumentLifecycle::AllowThrottlingScope throttling_scope(
+      GetDocument().Lifecycle());
+
+  // Hidden cross origin frames are throttled.
+  frame_element->setAttribute(styleAttr, "transform: translateY(480px)");
+  CompositeFrame();
+  EXPECT_FALSE(GetDocument().View()->CanThrottleRendering());
+  EXPECT_FALSE(frame_document->View()->CanThrottleRendering());
+  EXPECT_TRUE(inner_frame_document->View()->ShouldThrottleRendering());
+
+  // An intersection observation overrides...
+  inner_frame_document->View()->SetNeedsIntersectionObservation();
+  EXPECT_FALSE(inner_frame_document->View()->ShouldThrottleRendering());
+  inner_frame_document->View()->ScheduleAnimation();
+
+  LayoutView* inner_view = inner_frame_document->View()->GetLayoutView();
+
+  inner_view->SetNeedsLayout("test");
+  inner_view->Compositor()->SetNeedsCompositingUpdate(
+      kCompositingUpdateRebuildTree);
+  inner_view->SetShouldDoFullPaintInvalidation(
+      PaintInvalidationReason::kForTesting);
+  inner_view->Layer()->SetNeedsRepaint();
+  EXPECT_FALSE(inner_frame_document->View()
+                   ->GetLayoutView()
+                   ->FullPaintInvalidationReason() ==
+               PaintInvalidationReason::kNone);
+  inner_view->Compositor()->SetNeedsCompositingUpdate(
+      kCompositingUpdateRebuildTree);
+  EXPECT_EQ(kCompositingUpdateRebuildTree,
+            inner_view->Compositor()->pending_update_type_);
+  EXPECT_TRUE(inner_view->Layer()->NeedsRepaint());
+
+  CompositeFrame();
+  // ...but only for one frame.
+  EXPECT_TRUE(inner_frame_document->View()->ShouldThrottleRendering());
+
+  EXPECT_FALSE(inner_view->NeedsLayout());
+  EXPECT_FALSE(inner_frame_document->View()
+                   ->GetLayoutView()
+                   ->FullPaintInvalidationReason() ==
+               PaintInvalidationReason::kNone);
+  EXPECT_EQ(kCompositingUpdateRebuildTree,
+            inner_view->Compositor()->pending_update_type_);
+  EXPECT_TRUE(inner_view->Layer()->NeedsRepaint());
+}
+
 TEST_P(FrameThrottlingTest, HiddenCrossOriginZeroByZeroFramesAreNotThrottled) {
   // Create a document with doubly nested iframes.
   SimRequest main_resource("https://example.com/", "text/html");
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.h b/third_party/WebKit/Source/core/style/ComputedStyle.h
index 45e16ee..b97cc88b 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyle.h
+++ b/third_party/WebKit/Source/core/style/ComputedStyle.h
@@ -1210,21 +1210,6 @@
            !ColumnRuleColorInternal().Alpha();
   }
   bool ColumnRuleEquivalent(const ComputedStyle& other_style) const;
-  void InheritColumnPropertiesFrom(const ComputedStyle& parent) {
-    SetColumnGapInternal(parent.ColumnGap());
-    SetColumnWidthInternal(parent.ColumnWidth());
-    SetVisitedLinkColumnRuleColorInternal(
-        parent.VisitedLinkColumnRuleColorInternal());
-    SetColumnRuleColorInternal(parent.ColumnRuleColorInternal());
-    SetColumnCountInternal(parent.ColumnCount());
-    SetColumnRuleStyle(parent.ColumnRuleStyle());
-    SetColumnAutoCountInternal(parent.ColumnAutoCountInternal());
-    SetColumnAutoWidthInternal(parent.ColumnAutoWidthInternal());
-    SetColumnFill(parent.GetColumnFill());
-    SetColumnNormalGapInternal(parent.ColumnNormalGapInternal());
-    SetColumnRuleColorIsCurrentColor(parent.ColumnRuleColorIsCurrentColor());
-    SetColumnSpan(parent.GetColumnSpan());
-  }
 
   // Flex utility functions.
   bool IsColumnFlexDirection() const {
diff --git a/third_party/WebKit/Source/core/timing/PerformanceServerTiming.cpp b/third_party/WebKit/Source/core/timing/PerformanceServerTiming.cpp
index 597b765..80eb269 100644
--- a/third_party/WebKit/Source/core/timing/PerformanceServerTiming.cpp
+++ b/third_party/WebKit/Source/core/timing/PerformanceServerTiming.cpp
@@ -11,23 +11,23 @@
 namespace blink {
 
 PerformanceServerTiming::PerformanceServerTiming(
-    const String& metric,
-    double value,
+    const String& name,
+    double duration,
     const String& description,
     ShouldAllowTimingDetails shouldAllowTimingDetails)
-    : metric_(metric),
-      value_(value),
+    : name_(name),
+      duration_(duration),
       description_(description),
       shouldAllowTimingDetails_(shouldAllowTimingDetails) {}
 
 PerformanceServerTiming::~PerformanceServerTiming() {}
 
-String PerformanceServerTiming::metric() const {
-  return metric_;
+String PerformanceServerTiming::name() const {
+  return name_;
 }
 
-double PerformanceServerTiming::value() const {
-  return shouldAllowTimingDetails_ == ShouldAllowTimingDetails::Yes ? value_
+double PerformanceServerTiming::duration() const {
+  return shouldAllowTimingDetails_ == ShouldAllowTimingDetails::Yes ? duration_
                                                                     : 0.0;
 }
 
@@ -40,8 +40,8 @@
 ScriptValue PerformanceServerTiming::toJSONForBinding(
     ScriptState* script_state) const {
   V8ObjectBuilder builder(script_state);
-  builder.AddString("metric", metric());
-  builder.AddNumber("value", value());
+  builder.AddString("name", name());
+  builder.AddNumber("duration", duration());
   builder.AddString("description", description());
   return builder.GetScriptValue();
 }
@@ -56,7 +56,7 @@
         response.HttpHeaderField(HTTPNames::Server_Timing));
     for (const auto& header : *headers) {
       entries.push_back(new PerformanceServerTiming(
-          header->metric, header->value, header->description,
+          header->name, header->duration, header->description,
           shouldAllowTimingDetails));
     }
   }
diff --git a/third_party/WebKit/Source/core/timing/PerformanceServerTiming.h b/third_party/WebKit/Source/core/timing/PerformanceServerTiming.h
index 815bb363..9f0a2b49 100644
--- a/third_party/WebKit/Source/core/timing/PerformanceServerTiming.h
+++ b/third_party/WebKit/Source/core/timing/PerformanceServerTiming.h
@@ -28,14 +28,14 @@
     No,
   };
 
-  PerformanceServerTiming(const String& metric,
-                          double value,
+  PerformanceServerTiming(const String& name,
+                          double duration,
                           const String& description,
                           ShouldAllowTimingDetails);
   ~PerformanceServerTiming();
 
-  String metric() const;
-  double value() const;
+  String name() const;
+  double duration() const;
   String description() const;
 
   static PerformanceServerTimingVector ParseServerTiming(
@@ -47,8 +47,8 @@
   DEFINE_INLINE_VIRTUAL_TRACE() {}
 
  private:
-  const String metric_;
-  double value_;
+  const String name_;
+  double duration_;
   const String description_;
   ShouldAllowTimingDetails shouldAllowTimingDetails_;
 };
diff --git a/third_party/WebKit/Source/core/timing/PerformanceServerTiming.idl b/third_party/WebKit/Source/core/timing/PerformanceServerTiming.idl
index fd4069e..5026f3a 100644
--- a/third_party/WebKit/Source/core/timing/PerformanceServerTiming.idl
+++ b/third_party/WebKit/Source/core/timing/PerformanceServerTiming.idl
@@ -7,7 +7,7 @@
 [
     RuntimeEnabled=ServerTiming
 ] interface PerformanceServerTiming {
-    readonly attribute DOMString metric;
-    readonly attribute double value;
+    readonly attribute DOMString name;
+    readonly attribute DOMHighResTimeStamp duration;
     readonly attribute DOMString description;
 };
diff --git a/third_party/WebKit/Source/devtools/BUILD.gn b/third_party/WebKit/Source/devtools/BUILD.gn
index 0ffc52c..34355b7 100644
--- a/third_party/WebKit/Source/devtools/BUILD.gn
+++ b/third_party/WebKit/Source/devtools/BUILD.gn
@@ -19,6 +19,8 @@
   "front_end/accessibility/axBreadcrumbs.css",
   "front_end/accessibility/AXBreadcrumbsPane.js",
   "front_end/accessibility/module.json",
+  "front_end/accessibility_test_runner/AccessibilityPaneTestRunner.js",
+  "front_end/accessibility_test_runner/module.json",
   "front_end/animation/AnimationGroupPreviewUI.js",
   "front_end/animation/AnimationModel.js",
   "front_end/animation/animationScreenshotPopover.css",
@@ -27,6 +29,13 @@
   "front_end/animation/AnimationTimeline.js",
   "front_end/animation/AnimationUI.js",
   "front_end/animation/module.json",
+  "front_end/application_test_runner/AppcacheTestRunner.js",
+  "front_end/application_test_runner/CacheStorageTestRunner.js",
+  "front_end/application_test_runner/IndexedDBTestRunner.js",
+  "front_end/application_test_runner/module.json",
+  "front_end/application_test_runner/ResourcesTestRunner.js",
+  "front_end/application_test_runner/ResourceTreeTestRunner.js",
+  "front_end/application_test_runner/ServiceWorkersTestRunner.js",
   "front_end/audits/AuditCategories.js",
   "front_end/audits/AuditCategory.js",
   "front_end/audits/AuditController.js",
@@ -54,6 +63,8 @@
   "front_end/audits2/lighthouse/renderer/report-renderer.js",
   "front_end/audits2/lighthouse/renderer/util.js",
   "front_end/audits2/module.json",
+  "front_end/audits_test_runner/AuditsTestRunner.js",
+  "front_end/audits_test_runner/module.json",
   "front_end/bindings/BlackboxManager.js",
   "front_end/bindings/BreakpointManager.js",
   "front_end/bindings/CompilerScriptMapping.js",
@@ -72,6 +83,11 @@
   "front_end/bindings/SASSSourceMapping.js",
   "front_end/bindings/StylesSourceMapping.js",
   "front_end/bindings/TempFile.js",
+  "front_end/bindings_test_runner/AutomappingTestRunner.js",
+  "front_end/bindings_test_runner/BindingsTestRunner.js",
+  "front_end/bindings_test_runner/IsolatedFilesystemTestRunner.js",
+  "front_end/bindings_test_runner/module.json",
+  "front_end/bindings_test_runner/PersistenceTestRunner.js",
   "front_end/changes/ChangesHighlighter.js",
   "front_end/changes/changesView.css",
   "front_end/changes/ChangesView.js",
@@ -163,6 +179,8 @@
   "front_end/coverage/coverageView.css",
   "front_end/coverage/CoverageView.js",
   "front_end/coverage/module.json",
+  "front_end/coverage_test_runner/CoverageTestRunner.js",
+  "front_end/coverage_test_runner/module.json",
   "front_end/data_grid/dataGrid.css",
   "front_end/data_grid/DataGrid.js",
   "front_end/data_grid/module.json",
@@ -171,6 +189,8 @@
   "front_end/data_grid/ViewportDataGrid.js",
   "front_end/data_grid_test_runner/DataGridTestRunner.js",
   "front_end/data_grid_test_runner/module.json",
+  "front_end/device_mode_test_runner/DeviceModeTestRunner.js",
+  "front_end/device_mode_test_runner/module.json",
   "front_end/devices/devicesView.css",
   "front_end/devices/DevicesView.js",
   "front_end/devices/module.json",
@@ -209,6 +229,11 @@
   "front_end/elements/stylesSectionTree.css",
   "front_end/elements/stylesSidebarPane.css",
   "front_end/elements/StylesSidebarPane.js",
+  "front_end/elements_test_runner/EditDOMTestRunner.js",
+  "front_end/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js",
+  "front_end/elements_test_runner/ElementsTestRunner.js",
+  "front_end/elements_test_runner/SetOuterHTMLTestRunner.js",
+  "front_end/elements_test_runner/StylesUpdateLinksTestRunner.js",
   "front_end/emulated_devices/module.json",
   "front_end/emulation/AdvancedApp.js",
   "front_end/emulation/DeviceModeModel.js",
@@ -238,6 +263,9 @@
   "front_end/extensions/ExtensionServer.js",
   "front_end/extensions/ExtensionView.js",
   "front_end/extensions/module.json",
+  "front_end/extensions_test_runner/ExtensionsNetworkTestRunner.js",
+  "front_end/extensions_test_runner/ExtensionsTestRunner.js",
+  "front_end/extensions_test_runner/module.json",
   "front_end/formatter/FormatterWorkerPool.js",
   "front_end/formatter/module.json",
   "front_end/formatter/ScriptFormatter.js",
@@ -303,6 +331,8 @@
   "front_end/integration_test_runner.json",
   "front_end/integration_test_runner/IntegrationTestRunner.js",
   "front_end/integration_test_runner/module.json",
+  "front_end/integration_test_runner/PageMockTestRunner.js",
+  "front_end/integration_test_runner/SyntaxHighlightTestRunner.js",
   "front_end/layer_viewer/layerDetailsView.css",
   "front_end/layer_viewer/LayerDetailsView.js",
   "front_end/layer_viewer/layers3DView.css",
@@ -317,6 +347,8 @@
   "front_end/layers/LayersPanel.js",
   "front_end/layers/LayerTreeModel.js",
   "front_end/layers/module.json",
+  "front_end/layers_test_runner/LayersTestRunner.js",
+  "front_end/layers_test_runner/module.json",
   "front_end/main/ExecutionContextSelector.js",
   "front_end/main/GCActionDelegate.js",
   "front_end/main/Main.js",
@@ -374,6 +406,9 @@
   "front_end/network_log/NetworkLog.js",
   "front_end/network_priorities/module.json",
   "front_end/network_priorities/NetworkPriorities.js",
+  "front_end/network_test_runner/module.json",
+  "front_end/network_test_runner/NetworkTestRunner.js",
+  "front_end/network_test_runner/ProductRegistryTestRunner.js",
   "front_end/object_ui/customPreviewComponent.css",
   "front_end/object_ui/CustomPreviewComponent.js",
   "front_end/object_ui/JavaScriptAutocomplete.js",
@@ -401,6 +436,9 @@
   "front_end/perf_ui/TimelineGrid.js",
   "front_end/perf_ui/timelineOverviewInfo.css",
   "front_end/perf_ui/TimelineOverviewPane.js",
+  "front_end/performance_test_runner/module.json",
+  "front_end/performance_test_runner/TimelineDataTestRunner.js",
+  "front_end/performance_test_runner/TimelineTestRunner.js",
   "front_end/persistence/Automapping.js",
   "front_end/persistence/DefaultMapping.js",
   "front_end/persistence/editFileSystemView.css",
@@ -444,6 +482,9 @@
   "front_end/profiler/ProfileView.js",
   "front_end/profiler/TargetsComboBoxController.js",
   "front_end/profiler/TopDownProfileDataGrid.js",
+  "front_end/profiler_test_runner/HeapSnapshotTestRunner.js",
+  "front_end/profiler_test_runner/module.json",
+  "front_end/profiler_test_runner/ProfilerTestRunner.js",
   "front_end/protocol/InspectorBackend.js",
   "front_end/protocol/module.json",
   "front_end/quick_open/CommandMenu.js",
@@ -485,6 +526,8 @@
   "front_end/sass/SASSProcessor.js",
   "front_end/sass/SASSSourceMapFactory.js",
   "front_end/sass/SASSSupport.js",
+  "front_end/sass_test_runner/module.json",
+  "front_end/sass_test_runner/SASSTestRunner.js",
   "front_end/screencast/InputModel.js",
   "front_end/screencast/module.json",
   "front_end/screencast/ScreencastApp.js",
@@ -540,6 +583,8 @@
   "front_end/security/SecurityModel.js",
   "front_end/security/SecurityPanel.js",
   "front_end/security/sidebar.css",
+  "front_end/security_test_runner/module.json",
+  "front_end/security_test_runner/SecurityTestRunner.js",
   "front_end/services/ServiceManager.js",
   "front_end/settings/frameworkBlackboxSettingsTab.css",
   "front_end/settings/FrameworkBlackboxSettingsTab.js",
@@ -618,6 +663,12 @@
   "front_end/sources/WorkspaceMappingTip.js",
   "front_end/sources/xhrBreakpointsSidebarPane.css",
   "front_end/sources/XHRBreakpointsSidebarPane.js",
+  "front_end/sources_test_runner/AutocompleteTestRunner.js",
+  "front_end/sources_test_runner/BreakpointManagerTestRunner.js",
+  "front_end/sources_test_runner/DebuggerTestRunner.js",
+  "front_end/sources_test_runner/EditorTestRunner.js",
+  "front_end/sources_test_runner/LiveEditTestRunner.js",
+  "front_end/sources_test_runner/SearchTestRunner.js",
   "front_end/sources_test_runner/SourcesTestRunner.js",
   "front_end/sources_test_runner/module.json",
   "front_end/terminal/terminal.css",
diff --git a/third_party/WebKit/Source/devtools/front_end/Runtime.js b/third_party/WebKit/Source/devtools/front_end/Runtime.js
index b3123ed4..f8dd1ac 100644
--- a/third_party/WebKit/Source/devtools/front_end/Runtime.js
+++ b/third_party/WebKit/Source/devtools/front_end/Runtime.js
@@ -738,6 +738,7 @@
       'object_ui': 'ObjectUI',
       'perf_ui': 'PerfUI',
       'har_importer': 'HARImporter',
+      'sass_test_runner': 'SASSTestRunner',
     };
     var namespace = specialCases[this._name] || this._name.split('_').map(a => a.substring(0, 1).toUpperCase() + a.substring(1)).join('');
     self[namespace] = self[namespace] || {};
diff --git a/third_party/WebKit/Source/devtools/front_end/accessibility_test_runner/AccessibilityPaneTestRunner.js b/third_party/WebKit/Source/devtools/front_end/accessibility_test_runner/AccessibilityPaneTestRunner.js
new file mode 100644
index 0000000..7d19972
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/accessibility_test_runner/AccessibilityPaneTestRunner.js
@@ -0,0 +1,74 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+AccessibilityTestRunner.accessibilitySidebarPane = function() {
+  return self.runtime.sharedInstance(Accessibility.AccessibilitySidebarView);
+};
+
+AccessibilityTestRunner.selectNodeAndWaitForAccessibility = function(idValue) {
+  return new Promise(resolve => {
+    ElementsTestRunner.selectNodeWithId(idValue, function() {
+      self.runtime.sharedInstance(Accessibility.AccessibilitySidebarView).doUpdate().then(resolve);
+    });
+  });
+};
+
+AccessibilityTestRunner.dumpSelectedElementAccessibilityNode = function() {
+  var sidebarPane = AccessibilityTestRunner.accessibilitySidebarPane();
+
+  if (!sidebarPane) {
+    TestRunner.addResult('No sidebarPane in dumpSelectedElementAccessibilityNode');
+    TestRunner.completeTest();
+    return;
+  }
+
+  AccessibilityTestRunner.dumpAccessibilityNode(sidebarPane._axNodeSubPane._axNode);
+};
+
+AccessibilityTestRunner.dumpAccessibilityNode = function(accessibilityNode) {
+  if (!accessibilityNode) {
+    TestRunner.addResult('<null>');
+    TestRunner.completeTest();
+    return;
+  }
+
+  var builder = [];
+  builder.push(accessibilityNode.role().value);
+  builder.push((accessibilityNode.name() ? '"' + accessibilityNode.name().value + '"' : '<undefined>'));
+
+  if (accessibilityNode.properties()) {
+    for (var property of accessibilityNode.properties()) {
+      if ('value' in property)
+        builder.push(property.name + '="' + property.value.value + '"');
+    }
+  }
+
+  TestRunner.addResult(builder.join(' '));
+};
+
+AccessibilityTestRunner.findARIAAttributeTreeElement = function(attribute) {
+  var sidebarPane = AccessibilityTestRunner.accessibilitySidebarPane();
+
+  if (!sidebarPane) {
+    TestRunner.addResult('Could not get Accessibility sidebar pane.');
+    TestRunner.completeTest();
+    return;
+  }
+
+  var ariaSubPane = sidebarPane._ariaSubPane;
+  var treeOutline = ariaSubPane._treeOutline;
+  var childNodes = treeOutline._rootElement._children;
+
+  for (var treeElement of childNodes) {
+    if (treeElement._attribute.name === attribute)
+      return treeElement;
+  }
+
+  return null;
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/accessibility_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/accessibility_test_runner/module.json
new file mode 100644
index 0000000..aac49bd
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/accessibility_test_runner/module.json
@@ -0,0 +1,14 @@
+{
+  "dependencies": [
+    "test_runner",
+    "integration_test_runner",
+    "accessibility",
+    "elements_test_runner"
+  ],
+  "scripts": [
+    "AccessibilityPaneTestRunner.js"
+  ],
+  "skip_compilation": [
+    "AccessibilityPaneTestRunner.js"
+  ]
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/application_test_runner/AppcacheTestRunner.js b/third_party/WebKit/Source/devtools/front_end/application_test_runner/AppcacheTestRunner.js
new file mode 100644
index 0000000..17c8274
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/application_test_runner/AppcacheTestRunner.js
@@ -0,0 +1,215 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+ApplicationTestRunner.createAndNavigateIFrame = function(url, callback) {
+  TestRunner.addSniffer(SDK.ResourceTreeModel.prototype, '_frameNavigated', frameNavigated);
+  TestRunner.evaluateInPage('createAndNavigateIFrame(unescape(\'' + escape(url) + '\'))');
+
+  function frameNavigated(frame) {
+    callback(frame.id);
+  }
+};
+
+ApplicationTestRunner.navigateIFrame = function(frameId, url, callback) {
+  var frame = TestRunner.resourceTreeModel.frameForId(frameId);
+  TestRunner.evaluateInPage(
+      'navigateIFrame(unescape(\'' + escape(frame.name) + '\'), unescape(\'' + escape(url) + '\'))');
+  TestRunner.addSniffer(SDK.ResourceTreeModel.prototype, '_frameNavigated', frameNavigated);
+
+  function frameNavigated(frame) {
+    callback(frame.id);
+  }
+};
+
+ApplicationTestRunner.removeIFrame = function(frameId, callback) {
+  var frame = TestRunner.resourceTreeModel.frameForId(frameId);
+  TestRunner.evaluateInPage('removeIFrame(unescape(\'' + escape(frame.name) + '\'))');
+  TestRunner.addSniffer(SDK.ResourceTreeModel.prototype, '_frameDetached', frameDetached);
+
+  function frameDetached(frame) {
+    callback(frame.id);
+  }
+};
+
+ApplicationTestRunner.swapFrameCache = function(frameId) {
+  var frame = TestRunner.resourceTreeModel.frameForId(frameId);
+  TestRunner.evaluateInPage('swapFrameCache(unescape(\'' + escape(frame.name) + '\'))');
+};
+
+ApplicationTestRunner.dumpApplicationCache = function() {
+  ApplicationTestRunner.dumpApplicationCacheTree();
+  ApplicationTestRunner.dumpApplicationCacheModel();
+  TestRunner.addResult('');
+};
+
+ApplicationTestRunner.dumpApplicationCacheTree = function() {
+  TestRunner.addResult('Dumping application cache tree:');
+  var applicationCacheTreeElement = UI.panels.resources._sidebar.applicationCacheListTreeElement;
+
+  if (!applicationCacheTreeElement.childCount()) {
+    TestRunner.addResult('    (empty)');
+    return;
+  }
+
+  for (var i = 0; i < applicationCacheTreeElement.childCount(); ++i) {
+    var manifestTreeElement = applicationCacheTreeElement.childAt(i);
+    TestRunner.addResult('    Manifest URL: ' + manifestTreeElement.manifestURL);
+
+    if (!manifestTreeElement.childCount()) {
+      TestRunner.addResult('    (no frames)');
+      continue;
+    }
+
+    for (var j = 0; j < manifestTreeElement.childCount(); ++j) {
+      var frameTreeElement = manifestTreeElement.childAt(j);
+      TestRunner.addResult('        Frame: ' + frameTreeElement.title);
+    }
+  }
+};
+
+ApplicationTestRunner.frameIdToString = function(frameId) {
+  if (!ApplicationTestRunner.framesByFrameId)
+    ApplicationTestRunner.framesByFrameId = {};
+
+  var frame = TestRunner.resourceTreeModel.frameForId(frameId);
+
+  if (!frame)
+    frame = ApplicationTestRunner.framesByFrameId[frameId];
+
+  ApplicationTestRunner.framesByFrameId[frameId] = frame;
+  return frame.name;
+};
+
+ApplicationTestRunner.applicationCacheStatusToString = function(status) {
+  var statusInformation = {};
+  statusInformation[applicationCache.UNCACHED] = 'UNCACHED';
+  statusInformation[applicationCache.IDLE] = 'IDLE';
+  statusInformation[applicationCache.CHECKING] = 'CHECKING';
+  statusInformation[applicationCache.DOWNLOADING] = 'DOWNLOADING';
+  statusInformation[applicationCache.UPDATEREADY] = 'UPDATEREADY';
+  statusInformation[applicationCache.OBSOLETE] = 'OBSOLETE';
+  return statusInformation[status] || statusInformation[applicationCache.UNCACHED];
+};
+
+ApplicationTestRunner.dumpApplicationCacheModel = function() {
+  TestRunner.addResult('Dumping application cache model:');
+  var model = UI.panels.resources._sidebar._applicationCacheModel;
+  var frameIds = [];
+
+  for (var frameId in model._manifestURLsByFrame)
+    frameIds.push(frameId);
+
+  function compareFunc(a, b) {
+    return ApplicationTestRunner.frameIdToString(a).localeCompare(ApplicationTestRunner.frameIdToString(b));
+  }
+
+  frameIds.sort(compareFunc);
+
+  if (!frameIds.length) {
+    TestRunner.addResult('    (empty)');
+    return;
+  }
+
+  for (var i = 0; i < frameIds.length; ++i) {
+    var frameId = frameIds[i];
+    var manifestURL = model.frameManifestURL(frameId);
+    var status = model.frameManifestStatus(frameId);
+    TestRunner.addResult('    Frame: ' + ApplicationTestRunner.frameIdToString(frameId));
+    TestRunner.addResult('        manifest url: ' + manifestURL);
+    TestRunner.addResult('        status:       ' + ApplicationTestRunner.applicationCacheStatusToString(status));
+  }
+};
+
+ApplicationTestRunner.waitForFrameManifestURLAndStatus = function(frameId, manifestURL, status, callback) {
+  var frameManifestStatus = UI.panels.resources._sidebar._applicationCacheModel.frameManifestStatus(frameId);
+  var frameManifestURL = UI.panels.resources._sidebar._applicationCacheModel.frameManifestURL(frameId);
+
+  if (frameManifestStatus === status && frameManifestURL.indexOf(manifestURL) !== -1) {
+    callback();
+    return;
+  }
+
+  var handler =
+      ApplicationTestRunner.waitForFrameManifestURLAndStatus.bind(this, frameId, manifestURL, status, callback);
+  TestRunner.addSniffer(Resources.ApplicationCacheModel.prototype, '_frameManifestUpdated', handler);
+};
+
+ApplicationTestRunner.startApplicationCacheStatusesRecording = function() {
+  if (ApplicationTestRunner.applicationCacheStatusesRecords) {
+    ApplicationTestRunner.applicationCacheStatusesRecords = {};
+    return;
+  }
+
+  ApplicationTestRunner.applicationCacheStatusesRecords = {};
+
+  function addRecord(frameId, manifestURL, status) {
+    var record = {};
+    record.manifestURL = manifestURL;
+    record.status = status;
+
+    if (!ApplicationTestRunner.applicationCacheStatusesRecords[frameId])
+      ApplicationTestRunner.applicationCacheStatusesRecords[frameId] = [];
+
+    ApplicationTestRunner.applicationCacheStatusesRecords[frameId].push(record);
+
+    if (ApplicationTestRunner.awaitedFrameStatusEventsCount &&
+        ApplicationTestRunner.awaitedFrameStatusEventsCount[frameId]) {
+      ApplicationTestRunner.awaitedFrameStatusEventsCount[frameId].count--;
+
+      if (!ApplicationTestRunner.awaitedFrameStatusEventsCount[frameId].count)
+        ApplicationTestRunner.awaitedFrameStatusEventsCount[frameId].callback();
+    }
+  }
+
+  TestRunner.addSniffer(Resources.ApplicationCacheModel.prototype, '_frameManifestUpdated', addRecord, true);
+};
+
+ApplicationTestRunner.ensureFrameStatusEventsReceived = function(frameId, count, callback) {
+  var records = ApplicationTestRunner.applicationCacheStatusesRecords[frameId] || [];
+  var eventsLeft = count - records.length;
+
+  if (!eventsLeft) {
+    callback();
+    return;
+  }
+
+  if (!ApplicationTestRunner.awaitedFrameStatusEventsCount)
+    ApplicationTestRunner.awaitedFrameStatusEventsCount = {};
+
+  ApplicationTestRunner.awaitedFrameStatusEventsCount[frameId] = {count: eventsLeft, callback: callback};
+};
+
+(async function() {
+  await TestRunner.evaluateInPagePromise(`
+    var framesCount = 0;
+
+    function createAndNavigateIFrame(url) {
+      var iframe = document.createElement('iframe');
+      iframe.src = url;
+      iframe.name = 'frame' + ++framesCount;
+      iframe.id = iframe.name;
+      document.body.appendChild(iframe);
+    }
+
+    function removeIFrame(name) {
+      var iframe = document.querySelector('#' + name);
+      iframe.parentElement.removeChild(iframe);
+    }
+
+    function navigateIFrame(name, url) {
+      var iframe = document.querySelector('#' + name);
+      iframe.src = url;
+    }
+
+    function swapFrameCache(name) {
+      var iframe = document.querySelector('#' + name);
+      iframe.contentWindow.applicationCache.swapCache();
+    }
+  `);
+})();
diff --git a/third_party/WebKit/Source/devtools/front_end/application_test_runner/CacheStorageTestRunner.js b/third_party/WebKit/Source/devtools/front_end/application_test_runner/CacheStorageTestRunner.js
new file mode 100644
index 0000000..2a290155
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/application_test_runner/CacheStorageTestRunner.js
@@ -0,0 +1,173 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+ApplicationTestRunner.dumpCacheTree = async function() {
+  UI.panels.resources._sidebar.cacheStorageListTreeElement.expand();
+  TestRunner.addResult('Dumping CacheStorage tree:');
+  var cachesTreeElement = UI.panels.resources._sidebar.cacheStorageListTreeElement;
+  var promise = TestRunner.addSnifferPromise(SDK.ServiceWorkerCacheModel.prototype, '_updateCacheNames');
+  UI.panels.resources._sidebar.cacheStorageListTreeElement._refreshCaches();
+  await promise;
+
+  if (!cachesTreeElement.childCount()) {
+    TestRunner.addResult('    (empty)');
+    return;
+  }
+
+  for (var i = 0; i < cachesTreeElement.childCount(); ++i) {
+    var cacheTreeElement = cachesTreeElement.childAt(i);
+    TestRunner.addResult('    cache: ' + cacheTreeElement.title);
+    var view = cacheTreeElement._view;
+    promise = TestRunner.addSnifferPromise(Resources.ServiceWorkerCacheView.prototype, '_updateDataCallback');
+
+    if (!view)
+      cacheTreeElement.onselect(false);
+    else
+      view._updateData(true);
+
+    view = cacheTreeElement._view;
+    await promise;
+
+    if (view._entries.length === 0) {
+      TestRunner.addResult('        (cache empty)');
+      continue;
+    }
+
+    var dataGrid = view._dataGrid;
+
+    for (var node of dataGrid.rootNode().children) {
+      var children = Array.from(node.element().children).filter(function(element) {
+        return !element.classList.contains('responseTime-column');
+      });
+
+      var entries = Array.from(children, td => td.textContent).filter(text => text);
+      TestRunner.addResult('        ' + entries.join(', '));
+    }
+  }
+};
+
+ApplicationTestRunner.deleteCacheFromInspector = async function(cacheName, optionalEntry) {
+  UI.panels.resources._sidebar.cacheStorageListTreeElement.expand();
+
+  if (optionalEntry)
+    TestRunner.addResult('Deleting CacheStorage entry ' + optionalEntry + ' in cache ' + cacheName);
+  else
+    TestRunner.addResult('Deleting CacheStorage cache ' + cacheName);
+
+  var cachesTreeElement = UI.panels.resources._sidebar.cacheStorageListTreeElement;
+  var promise = TestRunner.addSnifferPromise(SDK.ServiceWorkerCacheModel.prototype, '_updateCacheNames');
+  UI.panels.resources._sidebar.cacheStorageListTreeElement._refreshCaches();
+  await promise;
+
+  if (!cachesTreeElement.childCount())
+    throw 'Error: Could not find CacheStorage cache ' + cacheName;
+
+
+  for (var i = 0; i < cachesTreeElement.childCount(); i++) {
+    var cacheTreeElement = cachesTreeElement.childAt(i);
+    var title = cacheTreeElement.title;
+    var elementCacheName = title.substring(0, title.lastIndexOf(' - '));
+
+    if (elementCacheName !== cacheName)
+      continue;
+
+    if (!optionalEntry) {
+      promise = TestRunner.addSnifferPromise(SDK.ServiceWorkerCacheModel.prototype, '_cacheRemoved');
+      cacheTreeElement._clearCache();
+      await promise;
+      return;
+    }
+
+    promise = TestRunner.addSnifferPromise(Resources.ServiceWorkerCacheView.prototype, '_updateDataCallback');
+    var view = cacheTreeElement._view;
+
+    if (!view)
+      cacheTreeElement.onselect(false);
+    else
+      view._updateData(true);
+
+    view = cacheTreeElement._view;
+    await promise;
+    var entry = view._entries.find(entry => entry.request === optionalEntry);
+
+    if (!entry)
+      throw 'Error: Could not find cache entry to delete: ' + optionalEntry;
+
+    await view._model.deleteCacheEntry(view._cache, entry.request);
+    return;
+  }
+
+  throw 'Error: Could not find CacheStorage cache ' + cacheName;
+};
+
+ApplicationTestRunner.waitForCacheRefresh = function(callback) {
+  TestRunner.addSniffer(SDK.ServiceWorkerCacheModel.prototype, '_updateCacheNames', callback, false);
+};
+
+ApplicationTestRunner.createCache = function(cacheName) {
+  return TestRunner.callFunctionInPageAsync('createCache', [cacheName]);
+};
+
+ApplicationTestRunner.addCacheEntry = function(cacheName, requestUrl, responseText) {
+  return TestRunner.callFunctionInPageAsync('addCacheEntry', [cacheName, requestUrl, responseText]);
+};
+
+ApplicationTestRunner.deleteCache = function(cacheName) {
+  return TestRunner.callFunctionInPageAsync('deleteCache', [cacheName]);
+};
+
+ApplicationTestRunner.deleteCacheEntry = function(cacheName, requestUrl) {
+  return TestRunner.callFunctionInPageAsync('deleteCacheEntry', [cacheName, requestUrl]);
+};
+
+ApplicationTestRunner.clearAllCaches = function() {
+  return TestRunner.callFunctionInPageAsync('clearAllCaches');
+};
+
+(async function() {
+  await TestRunner.evaluateInPagePromise(`
+    function onCacheStorageError(e) {
+      console.error('CacheStorage error: ' + e);
+    }
+
+    function createCache(cacheName) {
+      return caches.open(cacheName).catch(onCacheStorageError);
+    }
+
+    function addCacheEntry(cacheName, requestUrl, responseText) {
+      return caches.open(cacheName).then(function(cache) {
+        var request = new Request(requestUrl);
+        var myBlob = new Blob();
+
+        var init = {
+          'status': 200,
+          'statusText': responseText
+        };
+
+        var response = new Response(myBlob, init);
+        return cache.put(request, response);
+      }).catch(onCacheStorageError);
+    }
+
+    function deleteCache(cacheName) {
+      return caches.delete(cacheName).then(function(success) {
+        if (!success)
+          onCacheStorageError('Could not find cache ' + cacheName);
+      }).catch(onCacheStorageError);
+    }
+
+    function deleteCacheEntry(cacheName, requestUrl) {
+      return caches.open(cacheName).then(cache => cache.delete(new Request(requestUrl))).catch(onCacheStorageError);
+    }
+
+    function clearAllCaches() {
+      return caches.keys().then(keys => Promise.all(keys.map(key => caches.delete(key)))).catch(onCacheStorageError.bind(this, undefined));
+    }
+  `);
+})();
diff --git a/third_party/WebKit/Source/devtools/front_end/application_test_runner/IndexedDBTestRunner.js b/third_party/WebKit/Source/devtools/front_end/application_test_runner/IndexedDBTestRunner.js
new file mode 100644
index 0000000..696bf91
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/application_test_runner/IndexedDBTestRunner.js
@@ -0,0 +1,356 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+ApplicationTestRunner.dumpIndexedDBTree = function() {
+  TestRunner.addResult('Dumping IndexedDB tree:');
+  var indexedDBTreeElement = UI.panels.resources._sidebar.indexedDBListTreeElement;
+
+  if (!indexedDBTreeElement.childCount()) {
+    TestRunner.addResult('    (empty)');
+    return;
+  }
+
+  for (var i = 0; i < indexedDBTreeElement.childCount(); ++i) {
+    var databaseTreeElement = indexedDBTreeElement.childAt(i);
+    TestRunner.addResult('    database: ' + databaseTreeElement.title);
+
+    if (!databaseTreeElement.childCount()) {
+      TestRunner.addResult('        (no object stores)');
+      continue;
+    }
+
+    for (var j = 0; j < databaseTreeElement.childCount(); ++j) {
+      var objectStoreTreeElement = databaseTreeElement.childAt(j);
+      TestRunner.addResult('        Object store: ' + objectStoreTreeElement.title);
+
+      if (!objectStoreTreeElement.childCount()) {
+        TestRunner.addResult('            (no indexes)');
+        continue;
+      }
+
+      for (var k = 0; k < objectStoreTreeElement.childCount(); ++k) {
+        var indexTreeElement = objectStoreTreeElement.childAt(k);
+        TestRunner.addResult('            Index: ' + indexTreeElement.title);
+      }
+    }
+  }
+};
+
+var lastCallbackId = 0;
+var callbacks = {};
+var callbackIdPrefix = 'InspectorTest.IndexedDB_callback';
+
+ApplicationTestRunner.evaluateWithCallback = function(frameId, methodName, parameters, callback) {
+  ApplicationTestRunner._installIndexedDBSniffer();
+  var callbackId = ++lastCallbackId;
+  callbacks[callbackId] = callback;
+  var parametersString = 'dispatchCallback.bind(this, "' + callbackIdPrefix + callbackId + '")';
+
+  for (var i = 0; i < parameters.length; ++i)
+    parametersString += ', ' + JSON.stringify(parameters[i]);
+
+  var requestString = methodName + '(' + parametersString + ')';
+  TestRunner.evaluateInPage(requestString);
+};
+
+ApplicationTestRunner._installIndexedDBSniffer = function() {
+  ConsoleTestRunner.addConsoleSniffer(consoleMessageOverride, false);
+
+  function consoleMessageOverride(msg) {
+    var text = msg.messageText;
+
+    if (!text.startsWith(callbackIdPrefix)) {
+      ConsoleTestRunner.addConsoleSniffer(consoleMessageOverride, false);
+      return;
+    }
+
+    var callbackId = text.substring(callbackIdPrefix.length);
+    callbacks[callbackId].call();
+    delete callbacks[callbackId];
+  }
+};
+
+ApplicationTestRunner.createDatabase = function(frameId, databaseName, callback) {
+  ApplicationTestRunner.evaluateWithCallback(frameId, 'createDatabase', [databaseName], callback);
+};
+
+ApplicationTestRunner.deleteDatabase = function(frameId, databaseName, callback) {
+  ApplicationTestRunner.evaluateWithCallback(frameId, 'deleteDatabase', [databaseName], callback);
+};
+
+ApplicationTestRunner.createObjectStore = function(
+    frameId, databaseName, objectStoreName, keyPath, autoIncrement, callback) {
+  ApplicationTestRunner.evaluateWithCallback(
+      frameId, 'createObjectStore', [databaseName, objectStoreName, keyPath, autoIncrement], callback);
+};
+
+ApplicationTestRunner.deleteObjectStore = function(frameId, databaseName, objectStoreName, callback) {
+  ApplicationTestRunner.evaluateWithCallback(frameId, 'deleteObjectStore', [databaseName, objectStoreName], callback);
+};
+
+ApplicationTestRunner.createObjectStoreIndex = function(
+    frameId, databaseName, objectStoreName, objectStoreIndexName, keyPath, unique, multiEntry, callback) {
+  ApplicationTestRunner.evaluateWithCallback(
+      frameId, 'createObjectStoreIndex',
+      [databaseName, objectStoreName, objectStoreIndexName, keyPath, unique, multiEntry], callback);
+};
+
+ApplicationTestRunner.deleteObjectStoreIndex = function(
+    frameId, databaseName, objectStoreName, objectStoreIndexName, callback) {
+  ApplicationTestRunner.evaluateWithCallback(
+      frameId, 'deleteObjectStoreIndex', [databaseName, objectStoreName, objectStoreIndexName], callback);
+};
+
+ApplicationTestRunner.addIDBValue = function(frameId, databaseName, objectStoreName, value, key, callback) {
+  ApplicationTestRunner.evaluateWithCallback(
+      frameId, 'addIDBValue', [databaseName, objectStoreName, value, key], callback);
+};
+
+ApplicationTestRunner.createIndexedDBModel = function() {
+  var indexedDBModel = new Resources.IndexedDBModel(SDK.targetManager.mainTarget(), TestRunner.securityOriginManager);
+  indexedDBModel.enable();
+  return indexedDBModel;
+};
+
+ApplicationTestRunner.createDatabaseAsync = function(databaseName) {
+  return TestRunner.evaluateInPageAsync('createDatabaseAsync(\'' + databaseName + '\')');
+};
+
+ApplicationTestRunner.createObjectStoreAsync = function(databaseName, objectStoreName, indexName, keyPath) {
+  return TestRunner.evaluateInPageAsync(
+      'createObjectStoreAsync(\'' + databaseName + '\', \'' + objectStoreName + '\', \'' + indexName + '\', \'' +
+      keyPath + '\')');
+};
+
+ApplicationTestRunner.addIDBValueAsync = function(databaseName, objectStoreName, key, value) {
+  return TestRunner.evaluateInPageAsync(
+      'addIDBValueAsync(\'' + databaseName + '\', \'' + objectStoreName + '\', \'' + key + '\', \'' + value + '\')');
+};
+
+(async function() {
+  await TestRunner.evaluateInPagePromise(`
+    function dispatchCallback(callbackId) {
+      console.log(callbackId);
+    }
+
+    function onIndexedDBError(e) {
+      console.error('IndexedDB error: ' + e);
+    }
+
+    function onIndexedDBBlocked(e) {
+      console.error('IndexedDB blocked: ' + e);
+    }
+
+    function doWithDatabase(databaseName, callback) {
+      function innerCallback() {
+        var db = request.result;
+        callback(db);
+      }
+
+      var request = indexedDB.open(databaseName);
+      request.onblocked = onIndexedDBBlocked;
+      request.onerror = onIndexedDBError;
+      request.onsuccess = innerCallback;
+    }
+
+    function doWithVersionTransaction(databaseName, callback, commitCallback) {
+      doWithDatabase(databaseName, step2);
+
+      function step2(db) {
+        var version = db.version;
+        db.close();
+        request = indexedDB.open(databaseName, version + 1);
+        request.onerror = onIndexedDBError;
+        request.onupgradeneeded = onUpgradeNeeded;
+        request.onsuccess = onOpened;
+
+        function onUpgradeNeeded(e) {
+          var db = e.target.result;
+          var trans = e.target.transaction;
+          callback(db, trans);
+        }
+
+        function onOpened(e) {
+          var db = e.target.result;
+          db.close();
+          commitCallback();
+        }
+      }
+    }
+
+    function doWithReadWriteTransaction(databaseName, objectStoreName, callback, commitCallback) {
+      doWithDatabase(databaseName, step2);
+
+      function step2(db) {
+        var transaction = db.transaction([objectStoreName], 'readwrite');
+        var objectStore = transaction.objectStore(objectStoreName);
+        callback(objectStore, innerCommitCallback);
+
+        function innerCommitCallback() {
+          db.close();
+          commitCallback();
+        }
+      }
+    }
+
+    function createDatabase(callback, databaseName) {
+      var request = indexedDB.open(databaseName);
+      request.onerror = onIndexedDBError;
+      request.onsuccess = closeDatabase;
+
+      function closeDatabase() {
+        request.result.close();
+        callback();
+      }
+    }
+
+    function deleteDatabase(callback, databaseName) {
+      var request = indexedDB.deleteDatabase(databaseName);
+      request.onerror = onIndexedDBError;
+      request.onsuccess = callback;
+    }
+
+    function createObjectStore(callback, databaseName, objectStoreName, keyPath, autoIncrement) {
+      doWithVersionTransaction(databaseName, withTransactionCallback, callback);
+
+      function withTransactionCallback(db, transaction) {
+        var store = db.createObjectStore(objectStoreName, {
+          keyPath: keyPath,
+          autoIncrement: autoIncrement
+        });
+      }
+    }
+
+    function deleteObjectStore(callback, databaseName, objectStoreName) {
+      doWithVersionTransaction(databaseName, withTransactionCallback, callback);
+
+      function withTransactionCallback(db, transaction) {
+        var store = db.deleteObjectStore(objectStoreName);
+      }
+    }
+
+    function createObjectStoreIndex(callback, databaseName, objectStoreName, objectStoreIndexName, keyPath, unique, multiEntry) {
+      doWithVersionTransaction(databaseName, withTransactionCallback, callback);
+
+      function withTransactionCallback(db, transaction) {
+        var objectStore = transaction.objectStore(objectStoreName);
+
+        objectStore.createIndex(objectStoreIndexName, keyPath, {
+          unique: unique,
+          multiEntry: multiEntry
+        });
+      }
+    }
+
+    function deleteObjectStoreIndex(callback, databaseName, objectStoreName, objectStoreIndexName) {
+      doWithVersionTransaction(databaseName, withTransactionCallback, callback);
+
+      function withTransactionCallback(db, transaction) {
+        var objectStore = transaction.objectStore(objectStoreName);
+        objectStore.deleteIndex(objectStoreIndexName);
+      }
+    }
+
+    function addIDBValue(callback, databaseName, objectStoreName, value, key) {
+      doWithReadWriteTransaction(databaseName, objectStoreName, withTransactionCallback, callback);
+
+      function withTransactionCallback(objectStore, commitCallback) {
+        var request;
+
+        if (key)
+          request = objectStore.add(value, key);
+        else
+          request = objectStore.add(value);
+
+        request.onerror = onIndexedDBError;
+        request.onsuccess = commitCallback;
+      }
+    }
+
+    function createDatabaseAsync(databaseName) {
+      var callback;
+      var promise = new Promise(fulfill => callback = fulfill);
+      var request = indexedDB.open(databaseName);
+      request.onerror = onIndexedDBError;
+
+      request.onsuccess = function(event) {
+        request.result.close();
+        callback();
+      };
+
+      return promise;
+    }
+
+    function createObjectStoreAsync(databaseName, objectStoreName, indexName, keyPath) {
+      var callback;
+      var promise = new Promise(fulfill => callback = fulfill);
+      var request = indexedDB.open(databaseName);
+      request.onerror = onIndexedDBError;
+
+      request.onsuccess = function(event) {
+        var db = request.result;
+        var version = db.version;
+        db.close();
+        var upgradeRequest = indexedDB.open(databaseName, version + 1);
+        upgradeRequest.onerror = onIndexedDBError;
+
+        upgradeRequest.onupgradeneeded = function(e) {
+          var upgradeDb = e.target.result;
+
+          var store = upgradeDb.createObjectStore(objectStoreName, {
+            keyPath: 'test',
+            autoIncrement: false
+          });
+
+          store.createIndex(indexName, 'test', {
+            unique: false,
+            multiEntry: false
+          });
+
+          callback();
+        };
+
+        upgradeRequest.onsuccess = function(e) {
+          var upgradeDb = e.target.result;
+          upgradeDb.close();
+          callback();
+        };
+      };
+
+      return promise;
+    }
+
+    function addIDBValueAsync(databaseName, objectStoreName, key, value) {
+      var callback;
+      var promise = new Promise(fulfill => callback = fulfill);
+      var request = indexedDB.open(databaseName);
+      request.onerror = onIndexedDBError;
+
+      request.onsuccess = function(event) {
+        var db = request.result;
+        var transaction = db.transaction(objectStoreName, 'readwrite');
+        var store = transaction.objectStore(objectStoreName);
+
+        store.put({
+          test: key,
+          testValue: value
+        });
+
+        transaction.onerror = onIndexedDBError;
+
+        transaction.oncomplete = function() {
+          db.close();
+          callback();
+        };
+      };
+
+      return promise;
+    }
+  `);
+})();
diff --git a/third_party/WebKit/Source/devtools/front_end/application_test_runner/ResourceTreeTestRunner.js b/third_party/WebKit/Source/devtools/front_end/application_test_runner/ResourceTreeTestRunner.js
new file mode 100644
index 0000000..941d976
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/application_test_runner/ResourceTreeTestRunner.js
@@ -0,0 +1,92 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+ApplicationTestRunner.dumpResources = function(formatter) {
+  var results = [];
+
+  function formatterWrapper(resource) {
+    if (formatter)
+      results.push({resource: resource, text: formatter(resource)});
+    else
+      results.push({resource: resource, text: resource.url});
+  }
+
+  TestRunner.resourceTreeModel.forAllResources(formatterWrapper);
+
+  function comparator(result1, result2) {
+    return result1.resource.url.localeCompare(result2.resource.url);
+  }
+
+  results.sort(comparator);
+
+  for (var i = 0; i < results.length; ++i)
+    TestRunner.addResult(results[i].text);
+};
+
+ApplicationTestRunner.dumpResourcesURLMap = function() {
+  var results = [];
+  TestRunner.resourceTreeModel.forAllResources(collect);
+
+  function collect(resource) {
+    results.push({url: resource.url, resource: TestRunner.resourceTreeModel.resourceForURL(resource.url)});
+  }
+
+  function comparator(result1, result2) {
+    if (result1.url > result2.url)
+      return 1;
+
+    if (result2.url > result1.url)
+      return -1;
+
+    return 0;
+  }
+
+  results.sort(comparator);
+
+  for (var i = 0; i < results.length; ++i)
+    TestRunner.addResult(results[i].url + ' == ' + results[i].resource.url);
+};
+
+ApplicationTestRunner.dumpResourcesTree = function() {
+  function dump(treeItem, prefix) {
+    if (typeof treeItem._resetBubble === 'function')
+      treeItem._resetBubble();
+
+    TestRunner.addResult(prefix + treeItem.listItemElement.textContent);
+    treeItem.expand();
+    var children = treeItem.children();
+
+    for (var i = 0; children && i < children.length; ++i)
+      dump(children[i], prefix + '    ');
+  }
+
+  dump(UI.panels.resources._sidebar._resourcesSection._treeElement, '');
+
+  if (!ApplicationTestRunner._testSourceNavigator) {
+    ApplicationTestRunner._testSourceNavigator = new Sources.SourcesNavigatorView();
+    ApplicationTestRunner._testSourceNavigator.show(UI.inspectorView.element);
+  }
+
+  SourcesTestRunner.dumpNavigatorViewInAllModes(ApplicationTestRunner._testSourceNavigator);
+};
+
+ApplicationTestRunner.dumpResourceTreeEverything = function() {
+  function format(resource) {
+    return resource.resourceType().name() + ' ' + resource.url;
+  }
+
+  TestRunner.addResult('Resources:');
+  ApplicationTestRunner.dumpResources(format);
+  TestRunner.addResult('');
+  TestRunner.addResult('Resources URL Map:');
+  ApplicationTestRunner.dumpResourcesURLMap();
+  TestRunner.addResult('');
+  TestRunner.addResult('Resources Tree:');
+  ApplicationTestRunner.dumpResourcesTree();
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/application_test_runner/ResourcesTestRunner.js b/third_party/WebKit/Source/devtools/front_end/application_test_runner/ResourcesTestRunner.js
new file mode 100644
index 0000000..7c620763
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/application_test_runner/ResourcesTestRunner.js
@@ -0,0 +1,109 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+ApplicationTestRunner.createWebSQLDatabase = function(name) {
+  return TestRunner.evaluateInPageAsync(`_openWebSQLDatabase("${name}")`);
+};
+
+ApplicationTestRunner.requestURLComparer = function(r1, r2) {
+  return r1.request.url.localeCompare(r2.request.url);
+};
+
+ApplicationTestRunner.runAfterCachedResourcesProcessed = function(callback) {
+  if (!TestRunner.resourceTreeModel._cachedResourcesProcessed)
+    TestRunner.resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.CachedResourcesLoaded, callback);
+  else
+    callback();
+};
+
+ApplicationTestRunner.runAfterResourcesAreFinished = function(resourceURLs, callback) {
+  var resourceURLsMap = new Set(resourceURLs);
+
+  function checkResources() {
+    for (var url of resourceURLsMap) {
+      var resource = ApplicationTestRunner.resourceMatchingURL(url);
+
+      if (resource)
+        resourceURLsMap.delete(url);
+    }
+
+    if (!resourceURLsMap.size) {
+      TestRunner.resourceTreeModel.removeEventListener(SDK.ResourceTreeModel.Events.ResourceAdded, checkResources);
+      callback();
+    }
+  }
+
+  checkResources();
+
+  if (resourceURLsMap.size)
+    TestRunner.resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.ResourceAdded, checkResources);
+};
+
+ApplicationTestRunner.showResource = function(resourceURL, callback) {
+  var reported = false;
+
+  function callbackWrapper(sourceFrame) {
+    if (reported)
+      return;
+
+    callback(sourceFrame);
+    reported = true;
+  }
+
+  function showResourceCallback() {
+    var resource = ApplicationTestRunner.resourceMatchingURL(resourceURL);
+
+    if (!resource)
+      return;
+
+    UI.panels.resources.showResource(resource, 1);
+    var sourceFrame = UI.panels.resources._resourceViewForResource(resource);
+
+    if (sourceFrame.loaded)
+      callbackWrapper(sourceFrame);
+    else
+      TestRunner.addSniffer(sourceFrame, 'onTextEditorContentSet', callbackWrapper.bind(null, sourceFrame));
+  }
+
+  ApplicationTestRunner.runAfterResourcesAreFinished([resourceURL], showResourceCallback);
+};
+
+ApplicationTestRunner.resourceMatchingURL = function(resourceURL) {
+  var result = null;
+  TestRunner.resourceTreeModel.forAllResources(visit);
+
+  function visit(resource) {
+    if (resource.url.indexOf(resourceURL) !== -1) {
+      result = resource;
+      return true;
+    }
+  }
+
+  return result;
+};
+
+ApplicationTestRunner.databaseModel = function() {
+  return TestRunner.mainTarget.model(Resources.DatabaseModel);
+};
+
+ApplicationTestRunner.domStorageModel = function() {
+  return TestRunner.mainTarget.model(Resources.DOMStorageModel);
+};
+
+ApplicationTestRunner.indexedDBModel = function() {
+  return TestRunner.mainTarget.model(Resources.IndexedDBModel);
+};
+
+(async function() {
+  await TestRunner.evaluateInPagePromise(`
+    function _openWebSQLDatabase(name) {
+      return new Promise(resolve => openDatabase(name, '1.0', '', 1024 * 1024, resolve));
+    }
+  `);
+})();
diff --git a/third_party/WebKit/Source/devtools/front_end/application_test_runner/ServiceWorkersTestRunner.js b/third_party/WebKit/Source/devtools/front_end/application_test_runner/ServiceWorkersTestRunner.js
new file mode 100644
index 0000000..51158e46
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/application_test_runner/ServiceWorkersTestRunner.js
@@ -0,0 +1,104 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+ApplicationTestRunner.registerServiceWorker = function(script, scope) {
+  return TestRunner.callFunctionInPageAsync('registerServiceWorker', [script, scope]);
+};
+
+ApplicationTestRunner.unregisterServiceWorker = function(scope) {
+  return TestRunner.callFunctionInPageAsync('unregisterServiceWorker', [scope]);
+};
+
+ApplicationTestRunner.postToServiceWorker = function(scope, message) {
+  return TestRunner.evaluateInPagePromise('postToServiceWorker("' + scope + '","' + message + '")');
+};
+
+ApplicationTestRunner.waitForServiceWorker = function(callback) {
+  function isRightTarget(target) {
+    return TestRunner.isDedicatedWorker(target) && TestRunner.isServiceWorker(target.parentTarget());
+  }
+
+  SDK.targetManager.observeTargets({
+    targetAdded: function(target) {
+      if (isRightTarget(target) && callback) {
+        setTimeout(callback.bind(null, target), 0);
+        callback = null;
+      }
+    },
+
+    targetRemoved: function(target) {}
+  });
+};
+
+ApplicationTestRunner.dumpServiceWorkersView = function() {
+  var swView = UI.panels.resources.visibleView;
+
+  return swView._reportView._sectionList.childTextNodes()
+      .map(function(node) {
+        return node.textContent.replace(/Received.*/, 'Received').replace(/#\d+/, '#N');
+      })
+      .join('\n');
+};
+
+ApplicationTestRunner.deleteServiceWorkerRegistration = function(scope) {
+  TestRunner.serviceWorkerManager.registrations().valuesArray().map(function(registration) {
+    if (registration.scopeURL === scope)
+      TestRunner.serviceWorkerManager.deleteRegistration(registration.id);
+  });
+};
+
+ApplicationTestRunner.makeFetchInServiceWorker = function(scope, url, requestInitializer, callback) {
+  TestRunner.callFunctionInPageAsync('makeFetchInServiceWorker', [scope, url, requestInitializer]).then(callback);
+};
+
+(async function() {
+  await TestRunner.evaluateInPagePromise(`
+    var registrations = {};
+
+    function registerServiceWorker(script, scope) {
+      return navigator.serviceWorker.register(script, {
+        scope: scope
+      }).then(reg => registrations[scope] = reg);
+    }
+
+    function postToServiceWorker(scope, message) {
+      registrations[scope].active.postMessage(message);
+    }
+
+    function unregisterServiceWorker(scope) {
+      var registration = registrations[scope];
+
+      if (!registration)
+        return Promise.reject('ServiceWorker for ' + scope + ' is not registered');
+
+      return registration.unregister().then(() => delete registrations[scope]);
+    }
+
+    function makeFetchInServiceWorker(scope, url, requestInitializer) {
+      let script = 'resources/network-fetch-worker.js';
+
+      return navigator.serviceWorker.register(script, {
+        scope: scope
+      }).then(registration => {
+        let worker = registration.installing;
+
+        return new Promise(resolve => {
+          navigator.serviceWorker.onmessage = e => {
+            resolve(e.data);
+          };
+
+          worker.postMessage({
+            url: url,
+            init: requestInitializer
+          });
+        });
+      });
+    }
+  `);
+})();
diff --git a/third_party/WebKit/Source/devtools/front_end/application_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/application_test_runner/module.json
new file mode 100644
index 0000000..ccb40aca
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/application_test_runner/module.json
@@ -0,0 +1,26 @@
+{
+  "dependencies": [
+    "test_runner",
+    "integration_test_runner",
+    "resources",
+    "console_test_runner",
+    "sources",
+    "sources_test_runner"
+  ],
+  "scripts": [
+    "AppcacheTestRunner.js",
+    "CacheStorageTestRunner.js",
+    "IndexedDBTestRunner.js",
+    "ResourceTreeTestRunner.js",
+    "ResourcesTestRunner.js",
+    "ServiceWorkersTestRunner.js"
+  ],
+  "skip_compilation": [
+    "AppcacheTestRunner.js",
+    "CacheStorageTestRunner.js",
+    "IndexedDBTestRunner.js",
+    "ResourceTreeTestRunner.js",
+    "ResourcesTestRunner.js",
+    "ServiceWorkersTestRunner.js"
+  ]
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/audits_test_runner/AuditsTestRunner.js b/third_party/WebKit/Source/devtools/front_end/audits_test_runner/AuditsTestRunner.js
new file mode 100644
index 0000000..649f1c40
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/audits_test_runner/AuditsTestRunner.js
@@ -0,0 +1,66 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+AuditsTestRunner.collectAuditResults = function(callback) {
+  UI.panels.audits.showResults(UI.panels.audits._auditResultsTreeElement.firstChild().results);
+  var trees = UI.panels.audits.visibleView.element.querySelectorAll('.audit-result-tree');
+
+  for (var i = 0; i < trees.length; ++i) {
+    var liElements = trees[i].shadowRoot.querySelectorAll('li');
+
+    for (var j = 0; j < liElements.length; ++j) {
+      if (liElements[j].treeElement)
+        liElements[j].treeElement.expand();
+    }
+  }
+
+  TestRunner.deprecatedRunAfterPendingDispatches(function() {
+    AuditsTestRunner.collectTextContent(UI.panels.audits.visibleView.element, '');
+    callback();
+  });
+};
+
+AuditsTestRunner.launchAllAudits = function(shouldReload, callback) {
+  TestRunner.addSniffer(Audits.AuditController.prototype, '_auditFinishedCallback', callback);
+  var launcherView = UI.panels.audits._launcherView;
+  launcherView._selectAllClicked(true);
+  launcherView._auditPresentStateElement.checked = !shouldReload;
+  launcherView._launchButtonClicked();
+};
+
+AuditsTestRunner.collectTextContent = function(element, indent) {
+  var nodeOutput = '';
+  var child = element.shadowRoot || element.firstChild;
+
+  var nonTextTags = {'STYLE': 1, 'SCRIPT': 1};
+
+  while (child) {
+    if (child.nodeName === 'CONTENT') {
+      AuditsTestRunner.collectTextContent(child.getDistributedNodes()[0], indent);
+    } else if (child.nodeType === Node.TEXT_NODE) {
+      if (!nonTextTags[child.parentElement.nodeName])
+        nodeOutput += child.nodeValue.replace('​', '');
+    } else if (child.nodeType === Node.ELEMENT_NODE || child.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
+      if (nodeOutput !== '') {
+        TestRunner.addResult(indent + nodeOutput);
+        nodeOutput = '';
+      }
+
+      if (!child.firstChild && child.classList.contains('severity'))
+        nodeOutput = '[' + child.className + '] ';
+      else
+        AuditsTestRunner.collectTextContent(child, indent + ' ');
+    }
+
+    child = child.nextSibling;
+  }
+
+  if (nodeOutput !== '')
+    TestRunner.addResult(indent + nodeOutput);
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/audits_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/audits_test_runner/module.json
new file mode 100644
index 0000000..be3a2642
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/audits_test_runner/module.json
@@ -0,0 +1,13 @@
+{
+  "dependencies": [
+    "test_runner",
+    "integration_test_runner",
+    "audits"
+  ],
+  "scripts": [
+    "AuditsTestRunner.js"
+  ],
+  "skip_compilation": [
+    "AuditsTestRunner.js"
+  ]
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/AutomappingTestRunner.js b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/AutomappingTestRunner.js
new file mode 100644
index 0000000..56d89996
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/AutomappingTestRunner.js
@@ -0,0 +1,121 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+BindingsTestRunner.addFiles = function(testFileSystem, files) {
+  for (var filePath in files) {
+    var file = files[filePath];
+    testFileSystem.addFile(filePath, file.content, (file.time ? file.time.getTime() : 0));
+  }
+};
+
+var timeOverrides;
+var originalRequestMetadata;
+
+BindingsTestRunner.overrideNetworkModificationTime = function(urlToTime) {
+  if (!timeOverrides) {
+    timeOverrides = new Map();
+    originalRequestMetadata =
+        TestRunner.override(Bindings.ContentProviderBasedProject.prototype, 'requestMetadata', overrideTime, true);
+  }
+
+  for (var url in urlToTime)
+    timeOverrides.set(url, urlToTime[url]);
+
+  function overrideTime(uiSourceCode) {
+    if (!timeOverrides.has(uiSourceCode.url()))
+      return originalRequestMetadata.call(this, uiSourceCode);
+
+    var override = timeOverrides.get(uiSourceCode.url());
+    return originalRequestMetadata.call(this, uiSourceCode).then(onOriginalMetadata.bind(null, override));
+  }
+
+  function onOriginalMetadata(timeOverride, metadata) {
+    if (!timeOverride && !metadata)
+      return null;
+
+    return new Workspace.UISourceCodeMetadata(timeOverride, (metadata ? metadata.contentSize : null));
+  }
+};
+
+BindingsTestRunner.AutomappingTest = function(workspace) {
+  this._workspace = workspace;
+  this._networkProject = new Bindings.ContentProviderBasedProject(
+      this._workspace, 'AUTOMAPPING', Workspace.projectTypes.Network, 'simple website');
+
+  if (workspace !== Workspace.workspace)
+    new Persistence.FileSystemWorkspaceBinding(Persistence.isolatedFileSystemManager, this._workspace);
+
+  this._failedBindingsCount = 0;
+  this._automapping =
+      new Persistence.Automapping(this._workspace, this._onBindingAdded.bind(this), this._onBindingRemoved.bind(this));
+  TestRunner.addSniffer(this._automapping, '_onBindingFailedForTest', this._onBindingFailed.bind(this), true);
+  TestRunner.addSniffer(this._automapping, '_onSweepHappenedForTest', this._onSweepHappened.bind(this), true);
+};
+
+BindingsTestRunner.AutomappingTest.prototype = {
+  removeResources: function(urls) {
+    for (var url of urls)
+      this._networkProject.removeFile(url);
+  },
+
+  addNetworkResources: function(assets) {
+    for (var url in assets) {
+      var asset = assets[url];
+      var contentType = asset.contentType || Common.resourceTypes.Script;
+      var contentProvider = new Common.StaticContentProvider(url, contentType, Promise.resolve(asset.content));
+      var metadata =
+          (typeof asset.content === 'string' || asset.time ?
+               new Workspace.UISourceCodeMetadata(asset.time, asset.content.length) :
+               null);
+      var uiSourceCode = this._networkProject.createUISourceCode(url, contentType);
+      this._networkProject.addUISourceCodeWithProvider(uiSourceCode, contentProvider, metadata);
+    }
+  },
+
+  waitUntilMappingIsStabilized: function() {
+    var promise = new Promise(x => this._stabilizedCallback = x);
+    this._checkStabilized();
+    return promise;
+  },
+
+  _onSweepHappened: function() {
+    this._failedBindingsCount = 0;
+    this._checkStabilized();
+  },
+
+  _onBindingAdded: function(binding) {
+    TestRunner.addResult('Binding created: ' + binding);
+    this._checkStabilized();
+  },
+
+  _onBindingFailed: function() {
+    ++this._failedBindingsCount;
+    this._checkStabilized();
+  },
+
+  _onBindingRemoved: function(binding) {
+    TestRunner.addResult('Binding removed: ' + binding);
+    this._checkStabilized();
+  },
+
+  _checkStabilized: function() {
+    if (!this._stabilizedCallback || this._automapping._sweepThrottler._process)
+      return;
+
+    var networkUISourceCodes = this._workspace.uiSourceCodesForProjectType(Workspace.projectTypes.Network);
+    var stabilized = this._failedBindingsCount + this._automapping._bindings.size === networkUISourceCodes.length;
+
+    if (stabilized) {
+      TestRunner.addResult('Mapping has stabilized.');
+      var callback = this._stabilizedCallback;
+      delete this._stabilizedCallback;
+      callback.call(null);
+    }
+  }
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/BindingsTestRunner.js b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/BindingsTestRunner.js
new file mode 100644
index 0000000..ec92bcd6
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/BindingsTestRunner.js
@@ -0,0 +1,219 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+BindingsTestRunner.dumpWorkspace = function(previousSnapshot) {
+  var uiSourceCodes = Workspace.workspace.uiSourceCodes().slice();
+  var urls = uiSourceCodes.map(code => code.url());
+
+  urls = urls.map(url => {
+    if (!url.startsWith('debugger://'))
+      return url;
+
+    return url.replace(/VM\d+/g, 'VM[XXX]');
+  });
+
+  urls.sort(String.caseInsensetiveComparator);
+  var isAdded = new Array(urls.length).fill(false);
+  var removedLines = [];
+
+  if (previousSnapshot) {
+    var diff = Diff.Diff.lineDiff(previousSnapshot, urls);
+    var removedEntries = diff.filter(entry => entry[0] === Diff.Diff.Operation.Delete).map(entry => entry[1]);
+    removedLines = [].concat.apply([], removedEntries);
+    var index = 0;
+
+    for (var entry of diff) {
+      if (entry[0] === Diff.Diff.Operation.Delete)
+        continue;
+
+      if (entry[0] === Diff.Diff.Operation.Equal) {
+        index += entry[1].length;
+        continue;
+      }
+
+      // eslint-disable-next-line no-unused-vars
+      for (var line of entry[1])
+        isAdded[index++] = true;
+    }
+
+    var addedEntries = diff.filter(entry => entry[0] === Diff.Diff.Operation.Insert).map(entry => entry[1]);
+    addedLines = [].concat.apply([], addedEntries);
+  }
+
+  TestRunner.addResult(`Removed: ${removedLines.length} uiSourceCodes`);
+
+  for (var url of removedLines)
+    TestRunner.addResult('[-] ' + url);
+
+  TestRunner.addResult(`Workspace: ${urls.length} uiSourceCodes.`);
+
+  for (var i = 0; i < urls.length; ++i) {
+    var url = urls[i];
+    var prefix = (isAdded[i] ? '[+] ' : '    ');
+    TestRunner.addResult(prefix + url);
+  }
+
+  return urls;
+};
+
+BindingsTestRunner.attachFrame = function(frameId, url, evalSourceURL) {
+  var evalSource = `(${attachFrame.toString()})('${frameId}', '${url}')`;
+
+  if (evalSourceURL)
+    evalSource += '//# sourceURL=' + evalSourceURL;
+
+  return TestRunner.evaluateInPageAsync(evalSource);
+
+  function attachFrame(frameId, url) {
+    var frame = document.createElement('iframe');
+    frame.src = url;
+    frame.id = frameId;
+    document.body.appendChild(frame);
+    return new Promise(x => frame.onload = x);
+  }
+};
+
+BindingsTestRunner.detachFrame = function(frameId, evalSourceURL) {
+  var evalSource = `(${detachFrame.toString()})('${frameId}')`;
+
+  if (evalSourceURL)
+    evalSource += '//# sourceURL=' + evalSourceURL;
+
+  return TestRunner.evaluateInPagePromise(evalSource);
+
+  function detachFrame(frameId) {
+    var frame = document.getElementById(frameId);
+    frame.remove();
+  }
+};
+
+BindingsTestRunner.navigateFrame = function(frameId, navigateURL, evalSourceURL) {
+  var evalSource = `(${navigateFrame.toString()})('${frameId}', '${navigateURL}')`;
+
+  if (evalSourceURL)
+    evalSource += '//# sourceURL=' + evalSourceURL;
+
+  return TestRunner.evaluateInPageAsync(evalSource);
+
+  function navigateFrame(frameId, url) {
+    var frame = document.getElementById(frameId);
+    frame.src = url;
+    return new Promise(x => frame.onload = x);
+  }
+};
+
+BindingsTestRunner.attachShadowDOM = function(id, templateSelector, evalSourceURL) {
+  var evalSource = `(${createShadowDOM.toString()})('${id}', '${templateSelector}')`;
+
+  if (evalSourceURL)
+    evalSource += '//# sourceURL=' + evalSourceURL;
+
+  return TestRunner.evaluateInPagePromise(evalSource);
+
+  function createShadowDOM(id, templateSelector) {
+    var shadowHost = document.createElement('div');
+    shadowHost.setAttribute('id', id);
+
+    let shadowRoot = shadowHost.attachShadow({mode: 'open'});
+
+    var t = document.querySelector(templateSelector);
+    var instance = t.content.cloneNode(true);
+    shadowRoot.appendChild(instance);
+    document.body.appendChild(shadowHost);
+  }
+};
+
+BindingsTestRunner.detachShadowDOM = function(id, evalSourceURL) {
+  var evalSource = `(${removeShadowDOM.toString()})('${id}')`;
+
+  if (evalSourceURL)
+    evalSource += '//# sourceURL=' + evalSourceURL;
+
+  return TestRunner.evaluateInPagePromise(evalSource);
+
+  function removeShadowDOM(id) {
+    document.querySelector('#' + id).remove();
+  }
+};
+
+BindingsTestRunner.waitForStyleSheetRemoved = function(urlSuffix) {
+  var fulfill;
+  var promise = new Promise(x => fulfill = x);
+  TestRunner.cssModel.addEventListener(SDK.CSSModel.Events.StyleSheetRemoved, onStyleSheetRemoved);
+  return promise;
+
+  function onStyleSheetRemoved(event) {
+    var styleSheetHeader = event.data;
+
+    if (!styleSheetHeader.resourceURL().endsWith(urlSuffix))
+      return;
+
+    TestRunner.cssModel.removeEventListener(SDK.CSSModel.Events.StyleSheetRemoved, onStyleSheetRemoved);
+    fulfill();
+  }
+};
+
+TestRunner.addSniffer(Bindings.CompilerScriptMapping.prototype, '_sourceMapAttachedForTest', onSourceMap, true);
+TestRunner.addSniffer(Bindings.SASSSourceMapping.prototype, '_sourceMapAttachedForTest', onSourceMap, true);
+var sourceMapCallbacks = new Map();
+
+function onSourceMap(sourceMap) {
+  for (var urlSuffix of sourceMapCallbacks.keys()) {
+    if (sourceMap.url().endsWith(urlSuffix)) {
+      var callback = sourceMapCallbacks.get(urlSuffix);
+      callback.call(null);
+      sourceMapCallbacks.delete(urlSuffix);
+    }
+  }
+}
+
+BindingsTestRunner.waitForSourceMap = function(sourceMapURLSuffix) {
+  var fulfill;
+  var promise = new Promise(x => fulfill = x);
+  sourceMapCallbacks.set(sourceMapURLSuffix, fulfill);
+  return promise;
+};
+
+var locationPool = new Bindings.LiveLocationPool();
+var nameSymbol = Symbol('LiveLocationNameForTest');
+var createdSymbol = Symbol('LiveLocationCreated');
+
+BindingsTestRunner.createDebuggerLiveLocation = function(name, urlSuffix, lineNumber, columnNumber) {
+  var script = TestRunner.debuggerModel.scripts().find(script => script.sourceURL.endsWith(urlSuffix));
+  var rawLocation = TestRunner.debuggerModel.createRawLocation(script, lineNumber || 0, columnNumber || 0);
+  return Bindings.debuggerWorkspaceBinding.createLiveLocation(
+      rawLocation, updateDelegate.bind(null, name), locationPool);
+};
+
+BindingsTestRunner.createCSSLiveLocation = function(name, urlSuffix, lineNumber, columnNumber) {
+  var header = TestRunner.cssModel.styleSheetHeaders().find(header => header.resourceURL().endsWith(urlSuffix));
+  var rawLocation = new SDK.CSSLocation(header, lineNumber || 0, columnNumber || 0);
+  return Bindings.cssWorkspaceBinding.createLiveLocation(rawLocation, updateDelegate.bind(null, name), locationPool);
+};
+
+function updateDelegate(name, liveLocation) {
+  liveLocation[nameSymbol] = name;
+  var hint = (liveLocation[createdSymbol] ? '[ UPDATE ]' : '[ CREATE ]');
+  liveLocation[createdSymbol] = true;
+  BindingsTestRunner.dumpLocation(liveLocation, hint);
+}
+
+BindingsTestRunner.dumpLocation = function(liveLocation, hint) {
+  hint = hint || '[  GET   ]';
+  var prefix = `${hint}  LiveLocation-${liveLocation[nameSymbol]}: `;
+  var uiLocation = liveLocation.uiLocation();
+
+  if (!uiLocation) {
+    TestRunner.addResult(prefix + 'null');
+    return;
+  }
+
+  TestRunner.addResult(
+      prefix + uiLocation.uiSourceCode.url() + ':' + uiLocation.lineNumber + ':' + uiLocation.columnNumber);
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/IsolatedFilesystemTestRunner.js b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/IsolatedFilesystemTestRunner.js
new file mode 100644
index 0000000..6c77c419
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/IsolatedFilesystemTestRunner.js
@@ -0,0 +1,292 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+InspectorFrontendHost.isolatedFileSystem = function(name) {
+  return BindingsTestRunner.TestFileSystem._instances[name];
+};
+
+BindingsTestRunner.TestFileSystem = function(fileSystemPath) {
+  this.root = new BindingsTestRunner.TestFileSystem.Entry(this, '', true, null);
+  this.fileSystemPath = fileSystemPath;
+};
+
+BindingsTestRunner.TestFileSystem._instances = {};
+
+BindingsTestRunner.TestFileSystem.prototype = {
+  dumpAsText: function() {
+    var result = [];
+    dfs(this.root, '');
+    result[0] = this.fileSystemPath;
+    return result.join('\n');
+
+    function dfs(node, indent) {
+      result.push(indent + node.name);
+      var newIndent = indent + '    ';
+
+      for (var child of node._children)
+        dfs(child, newIndent);
+    }
+  },
+
+  reportCreatedPromise: function() {
+    return new Promise(fulfill => this.reportCreated(fulfill));
+  },
+
+  reportCreated: function(callback) {
+    var fileSystemPath = this.fileSystemPath;
+    BindingsTestRunner.TestFileSystem._instances[this.fileSystemPath] = this;
+
+    InspectorFrontendHost.events.dispatchEventToListeners(
+        InspectorFrontendHostAPI.Events.FileSystemAdded,
+        {fileSystem: {fileSystemPath: this.fileSystemPath, fileSystemName: this.fileSystemPath}});
+
+    Persistence.isolatedFileSystemManager.addEventListener(
+        Persistence.IsolatedFileSystemManager.Events.FileSystemAdded, created);
+
+    function created(event) {
+      var fileSystem = event.data;
+
+      if (fileSystem.path() !== fileSystemPath)
+        return;
+
+      Persistence.isolatedFileSystemManager.removeEventListener(
+          Persistence.IsolatedFileSystemManager.Events.FileSystemAdded, created);
+      callback(fileSystem);
+    }
+  },
+
+  reportRemoved: function() {
+    delete BindingsTestRunner.TestFileSystem._instances[this.fileSystemPath];
+    InspectorFrontendHost.events.dispatchEventToListeners(
+        InspectorFrontendHostAPI.Events.FileSystemRemoved, this.fileSystemPath);
+  },
+
+  addFileMapping: function(urlPrefix, pathPrefix) {
+    var fileSystemMapping = new Persistence.FileSystemMapping(Persistence.isolatedFileSystemManager);
+    fileSystemMapping.addFileSystem(this.fileSystemPath);
+    fileSystemMapping.addFileMapping(this.fileSystemPath, urlPrefix, pathPrefix);
+    fileSystemMapping.dispose();
+    Persistence.fileSystemMapping._loadFromSettings();
+  },
+
+  addFile: function(path, content, lastModified) {
+    var pathTokens = path.split('/');
+    var node = this.root;
+    var folders = pathTokens.slice(0, pathTokens.length - 1);
+    var fileName = pathTokens.peekLast();
+
+    for (var folder of folders) {
+      var dir = node._childrenMap[folder];
+
+      if (!dir)
+        dir = node.mkdir(folder);
+
+      node = dir;
+    }
+
+    var file = node.addFile(fileName, content);
+
+    if (lastModified)
+      file._timestamp = lastModified;
+
+    return file;
+  }
+};
+
+BindingsTestRunner.TestFileSystem.Entry = function(fileSystem, name, isDirectory, parent) {
+  this._fileSystem = fileSystem;
+  this.name = name;
+  this._children = [];
+  this._childrenMap = {};
+  this.isDirectory = isDirectory;
+  this._timestamp = 1000000;
+  this._parent = parent;
+};
+
+BindingsTestRunner.TestFileSystem.Entry.prototype = {
+  get fullPath() {
+    return (this.parent ? this.parent.fullPath + '/' + this.name : '');
+  },
+
+  remove: function(success, failure) {
+    this._parent._removeChild(this, success, failure);
+  },
+
+  _removeChild: function(child, success, failure) {
+    var index = this._children.indexOf(child);
+
+    if (index === -1) {
+      failure('Failed to remove file: file not found.');
+      return;
+    }
+
+    var fullPath = this._fileSystem.fileSystemPath + child.fullPath;
+    this._children.splice(index, 1);
+    delete this._childrenMap[child.name];
+    child.parent = null;
+
+    InspectorFrontendHost.events.dispatchEventToListeners(
+        InspectorFrontendHostAPI.Events.FileSystemFilesChangedAddedRemoved,
+        {changed: [], added: [], removed: [fullPath]});
+
+    success();
+  },
+
+  mkdir: function(name) {
+    var child = new BindingsTestRunner.TestFileSystem.Entry(this._fileSystem, name, true, this);
+    this._childrenMap[name] = child;
+    this._children.push(child);
+    child.parent = this;
+    return child;
+  },
+
+  addFile: function(name, content) {
+    var child = new BindingsTestRunner.TestFileSystem.Entry(this._fileSystem, name, false, this);
+    this._childrenMap[name] = child;
+    this._children.push(child);
+    child.parent = this;
+
+    child.content = new Blob([content], {type: 'text/plain'});
+
+    var fullPath = this._fileSystem.fileSystemPath + child.fullPath;
+
+    InspectorFrontendHost.events.dispatchEventToListeners(
+        InspectorFrontendHostAPI.Events.FileSystemFilesChangedAddedRemoved,
+        {changed: [], added: [fullPath], removed: []});
+
+    return child;
+  },
+
+  setContent: function(content) {
+    this.content = new Blob([content], {type: 'text/plain'});
+
+    this._timestamp += 1000;
+    var fullPath = this._fileSystem.fileSystemPath + this.fullPath;
+
+    InspectorFrontendHost.events.dispatchEventToListeners(
+        InspectorFrontendHostAPI.Events.FileSystemFilesChangedAddedRemoved,
+        {changed: [fullPath], added: [], removed: []});
+  },
+
+  createReader: function() {
+    return new BindingsTestRunner.TestFileSystem.Reader(this._children);
+  },
+
+  createWriter: function(success, failure) {
+    success(new BindingsTestRunner.TestFileSystem.Writer(this));
+  },
+
+  file: function(callback) {
+    callback(this.content);
+  },
+
+  getDirectory: function(path, noop, callback, errorCallback) {
+    this.getEntry(path, noop, callback, errorCallback);
+  },
+
+  getFile: function(path, noop, callback, errorCallback) {
+    this.getEntry(path, noop, callback, errorCallback);
+  },
+
+  _createEntry: function(path, options, callback, errorCallback) {
+    var tokens = path.split('/');
+    var name = tokens.pop();
+    var parentEntry = this;
+
+    for (var token of tokens)
+      parentEntry = parentEntry._childrenMap[token];
+
+    var entry = parentEntry._childrenMap[name];
+
+    if (entry && options.exclusive) {
+      errorCallback(new DOMException('File exists: ' + path, 'InvalidModificationError'));
+      return;
+    }
+
+    if (!entry)
+      entry = parentEntry.addFile(name, '');
+
+    callback(entry);
+  },
+
+  getEntry: function(path, options, callback, errorCallback) {
+    if (path.startsWith('/'))
+      path = path.substring(1);
+
+    if (options && options.create) {
+      this._createEntry(path, options, callback, errorCallback);
+      return;
+    }
+
+    if (!path) {
+      callback(this);
+      return;
+    }
+
+    var entry = this;
+
+    for (var token of path.split('/'))
+      entry = entry._childrenMap[token];
+
+    (entry ? callback(entry) : errorCallback(new DOMException('Path not found: ' + path, 'NotFoundError')));
+  },
+
+  getMetadata: function(success, failure) {
+    success({modificationTime: new Date(this._timestamp), size: (this.isDirectory ? 0 : this.content.size)});
+  },
+
+  moveTo: function(parent, newName, callback, errorCallback) {
+    this._parent._children.remove(this);
+    delete this._parent._childrenMap[this.name];
+    this._parent = parent;
+    this._parent._children.push(this);
+    this.name = newName;
+    this._parent._childrenMap[this.name] = this;
+    callback(this);
+  },
+
+  getParent: function(callback, errorCallback) {
+    callback(this._parent);
+  }
+};
+
+BindingsTestRunner.TestFileSystem.Reader = function(children) {
+  this._children = children;
+};
+
+BindingsTestRunner.TestFileSystem.Reader.prototype = {
+  readEntries: function(callback) {
+    var children = this._children;
+    this._children = [];
+    callback(children);
+  }
+};
+
+BindingsTestRunner.TestFileSystem.Writer = function(entry) {
+  this._entry = entry;
+  this._modificationTimesDelta = 500;
+};
+
+BindingsTestRunner.TestFileSystem.Writer.prototype = {
+  write: function(blob) {
+    this._entry._timestamp += this._modificationTimesDelta;
+    this._entry.content = blob;
+
+    if (this.onwriteend)
+      this.onwriteend();
+  },
+
+  truncate: function(num) {
+    this._entry._timestamp += this._modificationTimesDelta;
+    this._entry.content = this._entry.content.slice(0, num);
+
+    if (this.onwriteend)
+      this.onwriteend();
+  }
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/PersistenceTestRunner.js b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/PersistenceTestRunner.js
new file mode 100644
index 0000000..6ec92a4
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/PersistenceTestRunner.js
@@ -0,0 +1,113 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+Runtime.experiments.enableForTest('persistenceValidation');
+
+Persistence.PersistenceBinding.prototype.toString = function() {
+  var lines = [
+    '{', '       network: ' + this.network.url(), '    fileSystem: ' + this.fileSystem.url(),
+    '    exactMatch: ' + this.exactMatch, '}'
+  ];
+
+  return lines.join('\n');
+};
+
+BindingsTestRunner.waitForBinding = function(fileName) {
+  var uiSourceCodes = Workspace.workspace.uiSourceCodes();
+
+  for (var uiSourceCode of uiSourceCodes) {
+    var binding = Persistence.persistence.binding(uiSourceCode);
+
+    if (!binding)
+      continue;
+
+    if (uiSourceCode.name() === fileName)
+      return Promise.resolve(binding);
+  }
+
+  return TestRunner.waitForEvent(
+      Persistence.Persistence.Events.BindingCreated, Persistence.persistence,
+      binding => binding.network.name() === fileName || binding.fileSystem.name() === fileName);
+};
+
+BindingsTestRunner.addFooJSFile = function(fs) {
+  return fs.root.mkdir('inspector')
+      .mkdir('persistence')
+      .mkdir('resources')
+      .addFile('foo.js', '\n\nwindow.foo = ()=>\'foo\';');
+};
+
+BindingsTestRunner.forceUseDefaultMapping = function() {
+  Persistence.persistence._setMappingForTest((bindingCreated, bindingRemoved) => {
+    return new Persistence.DefaultMapping(
+        Workspace.workspace, Persistence.fileSystemMapping, bindingCreated, bindingRemoved);
+  });
+};
+
+BindingsTestRunner.initializeTestMapping = function() {
+  var testMapping;
+
+  Persistence.persistence._setMappingForTest((bindingCreated, bindingRemoved) => {
+    testMapping = new TestMapping(bindingCreated, bindingRemoved);
+    return testMapping;
+  });
+
+  return testMapping;
+};
+
+class TestMapping {
+  constructor(onBindingAdded, onBindingRemoved) {
+    this._onBindingAdded = onBindingAdded;
+    this._onBindingRemoved = onBindingRemoved;
+    this._bindings = new Set();
+  }
+
+  async addBinding(urlSuffix) {
+    if (this._findBinding(urlSuffix)) {
+      TestRunner.addResult(`FAILED TO ADD BINDING: binding already exists for ${urlSuffix}`);
+      TestRunner.completeTest();
+      return;
+    }
+
+    var networkUISourceCode = await TestRunner.waitForUISourceCode(urlSuffix, Workspace.projectTypes.Network);
+    var fileSystemUISourceCode = await TestRunner.waitForUISourceCode(urlSuffix, Workspace.projectTypes.FileSystem);
+    var binding = new Persistence.PersistenceBinding(networkUISourceCode, fileSystemUISourceCode, false);
+    this._bindings.add(binding);
+    this._onBindingAdded.call(null, binding);
+  }
+
+  _findBinding(urlSuffix) {
+    for (var binding of this._bindings) {
+      if (binding.network.url().endsWith(urlSuffix))
+        return binding;
+    }
+
+    return null;
+  }
+
+  async removeBinding(urlSuffix) {
+    var binding = this._findBinding(urlSuffix);
+
+    if (!binding) {
+      TestRunner.addResult(`FAILED TO REMOVE BINDING: binding does not exist for ${urlSuffix}`);
+      TestRunner.completeTest();
+      return;
+    }
+
+    this._bindings.delete(binding);
+    this._onBindingRemoved.call(null, binding);
+  }
+
+  dispose() {
+    for (var binding of this._bindings)
+      this._onBindingRemoved.call(null, binding);
+
+    this._bindings.clear();
+  }
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/module.json
new file mode 100644
index 0000000..82d789a
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/bindings_test_runner/module.json
@@ -0,0 +1,22 @@
+{
+  "dependencies": [
+    "test_runner",
+    "integration_test_runner",
+    "workspace",
+    "diff",
+    "bindings",
+    "persistence"
+  ],
+  "scripts": [
+    "BindingsTestRunner.js",
+    "IsolatedFilesystemTestRunner.js",
+    "AutomappingTestRunner.js",
+    "PersistenceTestRunner.js"
+  ],
+  "skip_compilation": [
+    "BindingsTestRunner.js",
+    "IsolatedFilesystemTestRunner.js",
+    "AutomappingTestRunner.js",
+    "PersistenceTestRunner.js"
+  ]
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/coverage_test_runner/CoverageTestRunner.js b/third_party/WebKit/Source/devtools/front_end/coverage_test_runner/CoverageTestRunner.js
new file mode 100644
index 0000000..185834f8
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/coverage_test_runner/CoverageTestRunner.js
@@ -0,0 +1,84 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+CoverageTestRunner.startCoverage = function() {
+  UI.viewManager.showView('coverage');
+  var coverageView = self.runtime.sharedInstance(Coverage.CoverageView);
+  coverageView._startRecording();
+};
+
+CoverageTestRunner.stopCoverage = function() {
+  var coverageView = self.runtime.sharedInstance(Coverage.CoverageView);
+  return coverageView._stopRecording();
+};
+
+CoverageTestRunner.sourceDecorated = async function(source) {
+  await UI.inspectorView.showPanel('sources');
+  var decoratePromise = TestRunner.addSnifferPromise(Coverage.CoverageView.LineDecorator.prototype, '_innerDecorate');
+  var sourceFrame = await new Promise(fulfill => SourcesTestRunner.showScriptSource(source, fulfill));
+  await decoratePromise;
+  return sourceFrame;
+};
+
+CoverageTestRunner.dumpDecorations = async function(source) {
+  var sourceFrame = await CoverageTestRunner.sourceDecorated(source);
+  CoverageTestRunner.dumpDecorationsInSourceFrame(sourceFrame);
+};
+
+CoverageTestRunner.findCoverageNodeForURL = function(url) {
+  var coverageListView = self.runtime.sharedInstance(Coverage.CoverageView)._listView;
+  var rootNode = coverageListView._dataGrid.rootNode();
+
+  for (var child of rootNode.children) {
+    if (child._coverageInfo.url().endsWith(url))
+      return child;
+  }
+
+  return null;
+};
+
+CoverageTestRunner.dumpDecorationsInSourceFrame = function(sourceFrame) {
+  var markerMap = new Map([['used', '+'], ['unused', '-']]);
+  var codeMirror = sourceFrame.textEditor.codeMirror();
+
+  for (var line = 0; line < codeMirror.lineCount(); ++line) {
+    var text = codeMirror.getLine(line);
+    var markerType = ' ';
+    var lineInfo = codeMirror.lineInfo(line);
+
+    if (!lineInfo)
+      continue;
+
+    var gutterElement = lineInfo.gutterMarkers && lineInfo.gutterMarkers['CodeMirror-gutter-coverage'];
+
+    if (gutterElement) {
+      var markerClass = /^text-editor-coverage-(\w*)-marker$/.exec(gutterElement.classList)[1];
+      markerType = markerMap.get(markerClass) || gutterElement.classList;
+    }
+
+    TestRunner.addResult(`${line}: ${markerType} ${text}`);
+  }
+};
+
+CoverageTestRunner.dumpCoverageListView = function() {
+  var coverageListView = self.runtime.sharedInstance(Coverage.CoverageView)._listView;
+  var dataGrid = coverageListView._dataGrid;
+  dataGrid.updateInstantly();
+
+  for (var child of dataGrid.rootNode().children) {
+    var data = child._coverageInfo;
+    var url = TestRunner.formatters.formatAsURL(data.url());
+
+    if (url.endsWith('-test.js') || url.endsWith('.html'))
+      continue;
+
+    var type = Coverage.CoverageListView._typeToString(data.type());
+    TestRunner.addResult(`${url} ${type} used: ${data.usedSize()} unused: ${data.unusedSize()} total: ${data.size()}`);
+  }
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/coverage_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/coverage_test_runner/module.json
new file mode 100644
index 0000000..4f200a4
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/coverage_test_runner/module.json
@@ -0,0 +1,14 @@
+{
+  "dependencies": [
+    "test_runner",
+    "integration_test_runner",
+    "coverage",
+    "sources_test_runner"
+  ],
+  "scripts": [
+    "CoverageTestRunner.js"
+  ],
+  "skip_compilation": [
+    "CoverageTestRunner.js"
+  ]
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/data_grid/DataGrid.js b/third_party/WebKit/Source/devtools/front_end/data_grid/DataGrid.js
index b891fc2..6500f66 100644
--- a/third_party/WebKit/Source/devtools/front_end/data_grid/DataGrid.js
+++ b/third_party/WebKit/Source/devtools/front_end/data_grid/DataGrid.js
@@ -125,6 +125,23 @@
   }
 
   /**
+   * @param {!Element} element
+   * @param {string} newText
+   * @param {boolean} longText
+   */
+  static setElementText(element, newText, longText) {
+    if (longText && newText.length > 1000) {
+      element.textContent = newText.trimEnd(1000);
+      element.title = newText;
+      element[DataGrid.DataGrid._longTextSymbol] = newText;
+    } else {
+      element.textContent = newText;
+      element.title = '';
+      element[DataGrid.DataGrid._longTextSymbol] = undefined;
+    }
+  }
+
+  /**
    * @param {boolean} isStriped
    */
   setStriped(isStriped) {
@@ -351,6 +368,8 @@
     }
 
     this._editing = true;
+    if (element[DataGrid.DataGrid._longTextSymbol])
+      element.textContent = element[DataGrid.DataGrid._longTextSymbol];
     UI.InplaceEditor.startEditing(element, this._startEditingConfig(element));
 
     element.getComponentSelection().selectAllChildren(element);
@@ -368,8 +387,7 @@
    * @return {!UI.InplaceEditor.Config}
    */
   _startEditingConfig(element) {
-    return new UI.InplaceEditor.Config(
-        this._editingCommitted.bind(this), this._editingCancelled.bind(this), element.textContent);
+    return new UI.InplaceEditor.Config(this._editingCommitted.bind(this), this._editingCancelled.bind(this));
   }
 
   /**
@@ -437,6 +455,9 @@
       }
     }
 
+    // Show trimmed text after editing.
+    DataGrid.DataGrid.setElementText(element, newText, !!column.longText);
+
     if (textBeforeEditing === newText) {
       this._editingCancelled(element);
       moveToNextIfNeeded.call(this, false);
@@ -1216,6 +1237,7 @@
 DataGrid.DataGrid._preferredWidthSymbol = Symbol('preferredWidth');
 DataGrid.DataGrid._columnIdSymbol = Symbol('columnId');
 DataGrid.DataGrid._sortIconSymbol = Symbol('sortIcon');
+DataGrid.DataGrid._longTextSymbol = Symbol('longText');
 
 DataGrid.DataGrid.ColumnResizePadding = 24;
 DataGrid.DataGrid.CenterResizerOverBorderAdjustment = 3;
@@ -1581,13 +1603,10 @@
     var cell = this.createTD(columnId);
 
     var data = this.data[columnId];
-    if (data instanceof Node) {
+    if (data instanceof Node)
       cell.appendChild(data);
-    } else if (data !== null) {
-      cell.textContent = data;
-      if (this.dataGrid._columns[columnId].longText)
-        cell.title = data;
-    }
+    else if (data !== null)
+      DataGrid.DataGrid.setElementText(cell, /** @type {string} */ (data), !!this.dataGrid._columns[columnId].longText);
 
     return cell;
   }
diff --git a/third_party/WebKit/Source/devtools/front_end/data_grid_test_runner/DataGridTestRunner.js b/third_party/WebKit/Source/devtools/front_end/data_grid_test_runner/DataGridTestRunner.js
index bff22d7..ad3e492 100644
--- a/third_party/WebKit/Source/devtools/front_end/data_grid_test_runner/DataGridTestRunner.js
+++ b/third_party/WebKit/Source/devtools/front_end/data_grid_test_runner/DataGridTestRunner.js
@@ -78,3 +78,43 @@
   }
   return output.join('\n');
 };
+
+DataGridTestRunner.validateDataGrid = function(root) {
+  var children = root.children;
+
+  for (var i = 0; i < children.length; ++i) {
+    var child = children[i];
+
+    if (child.parent !== root)
+      throw 'Wrong parent for child ' + child.data.id + ' of ' + root.data.id;
+
+    if (child.nextSibling !== ((i + 1 === children.length ? null : children[i + 1])))
+      throw 'Wrong child.nextSibling for ' + child.data.id + ' (' + i + ' of ' + children.length + ') ';
+
+    if (child.previousSibling !== ((i ? children[i - 1] : null)))
+      throw 'Wrong child.previousSibling for ' + child.data.id + ' (' + i + ' of ' + children.length + ') ';
+
+    if (child.parent && !child.parent._isRoot && child.depth !== root.depth + 1)
+      throw 'Wrong depth for ' + child.data.id + ' expected ' + (root.depth + 1) + ' but got ' + child.depth;
+
+    DataGridTestRunner.validateDataGrid(child);
+  }
+
+  var selectedNode = root.dataGrid.selectedNode;
+
+  if (!root.parent && selectedNode) {
+    if (!selectedNode.selectable)
+      throw 'Selected node is not selectable';
+
+    for (var node = selectedNode; node && node !== root; node = node.parent) {
+    }
+
+    if (!node)
+      throw 'Selected node (' + selectedNode.data.id + ') is not within the DataGrid';
+  }
+};
+
+DataGridTestRunner.dumpAndValidateDataGrid = function(root) {
+  DataGridTestRunner.dumpDataGrid(root);
+  DataGridTestRunner.validateDataGrid(root);
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/data_grid_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/data_grid_test_runner/module.json
index 89ab830..8a1da515 100644
--- a/third_party/WebKit/Source/devtools/front_end/data_grid_test_runner/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/data_grid_test_runner/module.json
@@ -5,5 +5,8 @@
   ],
   "scripts": [
     "DataGridTestRunner.js"
+  ],
+  "skip_compilation": [
+    "DataGridTestRunner.js"
   ]
 }
diff --git a/third_party/WebKit/Source/devtools/front_end/device_mode_test_runner/DeviceModeTestRunner.js b/third_party/WebKit/Source/devtools/front_end/device_mode_test_runner/DeviceModeTestRunner.js
new file mode 100644
index 0000000..017b5d59
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/device_mode_test_runner/DeviceModeTestRunner.js
@@ -0,0 +1,45 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+DeviceModeTestRunner.buildFakePhone = function(overrides) {
+  var StandardPhoneJSON = {
+    'show-by-default': false,
+    'title': 'Fake Phone 1',
+
+    'screen': {
+      'horizontal': {'width': 480, 'height': 320},
+
+      'device-pixel-ratio': 2,
+
+      'vertical': {'width': 320, 'height': 480}
+    },
+
+    'capabilities': ['touch', 'mobile'],
+    'user-agent': 'fakeUserAgent',
+    'type': 'phone',
+
+    'modes': [
+      {
+        'title': 'default',
+        'orientation': 'vertical',
+
+        'insets': {'left': 0, 'top': 0, 'right': 0, 'bottom': 0}
+      },
+      {
+        'title': 'default',
+        'orientation': 'horizontal',
+
+        'insets': {'left': 0, 'top': 0, 'right': 0, 'bottom': 0}
+      }
+    ]
+  };
+
+  var json = Object.assign(StandardPhoneJSON, overrides || {});
+  return Emulation.EmulatedDevice.fromJSONV1(json);
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/device_mode_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/device_mode_test_runner/module.json
new file mode 100644
index 0000000..dde42c2a
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/device_mode_test_runner/module.json
@@ -0,0 +1,13 @@
+{
+  "dependencies": [
+    "test_runner",
+    "integration_test_runner",
+    "emulation"
+  ],
+  "scripts": [
+    "DeviceModeTestRunner.js"
+  ],
+  "skip_compilation": [
+    "DeviceModeTestRunner.js"
+  ]
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/elements_test_runner/EditDOMTestRunner.js b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/EditDOMTestRunner.js
new file mode 100644
index 0000000..e2bb707
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/EditDOMTestRunner.js
@@ -0,0 +1,76 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+ElementsTestRunner.doAddAttribute = function(testName, dataNodeId, attributeText, next) {
+  ElementsTestRunner.domActionTestForNodeId(testName, dataNodeId, testBody, next);
+
+  function testBody(node, done) {
+    ElementsTestRunner.editNodePart(node, 'webkit-html-attribute');
+    eventSender.keyDown('Tab');
+    TestRunner.deprecatedRunAfterPendingDispatches(testContinuation);
+
+    function testContinuation() {
+      var editorElement = UI.panels.elements._treeOutlines[0]._shadowRoot.getSelection().anchorNode.parentElement;
+      editorElement.textContent = attributeText;
+      editorElement.dispatchEvent(TestRunner.createKeyEvent('Enter'));
+      TestRunner.addSniffer(Elements.ElementsTreeOutline.prototype, '_updateModifiedNodes', done);
+    }
+  }
+};
+
+ElementsTestRunner.domActionTestForNodeId = function(testName, dataNodeId, testBody, next) {
+  function callback(testNode, continuation) {
+    ElementsTestRunner.selectNodeWithId(dataNodeId, continuation);
+  }
+
+  ElementsTestRunner.domActionTest(testName, callback, testBody, next);
+};
+
+ElementsTestRunner.domActionTest = function(testName, dataNodeSelectionCallback, testBody, next) {
+  var testNode = ElementsTestRunner.expandedNodeWithId(testName);
+  TestRunner.addResult('==== before ====');
+  ElementsTestRunner.dumpElementsTree(testNode);
+  dataNodeSelectionCallback(testNode, step0);
+
+  function step0(node) {
+    TestRunner.deprecatedRunAfterPendingDispatches(step1.bind(null, node));
+  }
+
+  function step1(node) {
+    testBody(node, step2);
+  }
+
+  function step2() {
+    TestRunner.addResult('==== after ====');
+    ElementsTestRunner.dumpElementsTree(testNode);
+    next();
+  }
+};
+
+ElementsTestRunner.editNodePart = function(node, className) {
+  var treeElement = ElementsTestRunner.firstElementsTreeOutline().findTreeElement(node);
+  var textElement = treeElement.listItemElement.getElementsByClassName(className)[0];
+
+  if (!textElement && treeElement.childrenListElement)
+    textElement = treeElement.childrenListElement.getElementsByClassName(className)[0];
+
+  treeElement._startEditingTarget(textElement);
+  return textElement;
+};
+
+ElementsTestRunner.editNodePartAndRun = function(node, className, newValue, step2, useSniffer) {
+  var editorElement = ElementsTestRunner.editNodePart(node, className);
+  editorElement.textContent = newValue;
+  editorElement.dispatchEvent(TestRunner.createKeyEvent('Enter'));
+
+  if (useSniffer)
+    TestRunner.addSniffer(Elements.ElementsTreeOutline.prototype, '_updateModifiedNodes', step2);
+  else
+    TestRunner.deprecatedRunAfterPendingDispatches(step2);
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js
new file mode 100644
index 0000000..ceea077
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js
@@ -0,0 +1,39 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+ElementsTestRunner.selectReloadAndDump = function(next, node) {
+  ElementsTestRunner.selectNode(node).then(onSelected);
+  var reloaded = false;
+  var selected = false;
+
+  function onSelected() {
+    TestRunner.reloadPage(onReloaded);
+    TestRunner.addSniffer(Elements.ElementsPanel.prototype, '_lastSelectedNodeSelectedForTest', onReSelected);
+  }
+
+  function onReloaded() {
+    reloaded = true;
+    maybeDumpSelectedNode();
+  }
+
+  function onReSelected() {
+    selected = true;
+    maybeDumpSelectedNode();
+  }
+
+  function maybeDumpSelectedNode() {
+    if (!reloaded || !selected)
+      return;
+
+    var selectedElement = ElementsTestRunner.firstElementsTreeOutline().selectedTreeElement;
+    var nodeName = (selectedElement ? selectedElement.node().nodeNameInCorrectCase() : 'null');
+    TestRunner.addResult('Selected node: \'' + nodeName + '\'');
+    next();
+  }
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/elements_test_runner/ElementsTestRunner.js b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/ElementsTestRunner.js
index 502cd8c..6f70ac2 100644
--- a/third_party/WebKit/Source/devtools/front_end/elements_test_runner/ElementsTestRunner.js
+++ b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/ElementsTestRunner.js
@@ -121,3 +121,962 @@
         EventListeners.EventListenersView.prototype, '_eventListenersArrivedForTest', listenersArrived);
   }
 };
+
+ElementsTestRunner.inlineStyleSection = function() {
+  return UI.panels.elements._stylesWidget._sectionBlocks[0].sections[0];
+};
+
+ElementsTestRunner.computedStyleWidget = function() {
+  return UI.panels.elements._computedStyleWidget;
+};
+
+ElementsTestRunner.dumpComputedStyle = function(doNotAutoExpand) {
+  var computed = ElementsTestRunner.computedStyleWidget();
+  var treeOutline = computed._propertiesOutline;
+  var children = treeOutline.rootElement().children();
+
+  for (var treeElement of children) {
+    var property = treeElement[Elements.ComputedStyleWidget._propertySymbol];
+
+    if (property.name === 'width' || property.name === 'height')
+      continue;
+
+    var dumpText = '';
+    dumpText += treeElement.title.querySelector('.property-name').textContent;
+    dumpText += ' ';
+    dumpText += treeElement.title.querySelector('.property-value').textContent;
+    TestRunner.addResult(dumpText);
+
+    if (doNotAutoExpand && !treeElement.expanded)
+      continue;
+
+    for (var trace of treeElement.children()) {
+      var title = trace.title;
+      var dumpText = '';
+
+      if (trace.title.classList.contains('property-trace-inactive'))
+        dumpText += 'OVERLOADED ';
+
+      dumpText += title.querySelector('.property-trace-value').textContent;
+      dumpText += ' - ';
+      dumpText += title.querySelector('.property-trace-selector').textContent;
+      var link = title.querySelector('.trace-link');
+
+      if (link)
+        dumpText += ' ' + extractLinkText(link);
+
+      TestRunner.addResult('    ' + dumpText);
+    }
+  }
+};
+
+ElementsTestRunner.findComputedPropertyWithName = function(name) {
+  var computed = ElementsTestRunner.computedStyleWidget();
+  var treeOutline = computed._propertiesOutline;
+  var children = treeOutline.rootElement().children();
+
+  for (var treeElement of children) {
+    var property = treeElement[Elements.ComputedStyleWidget._propertySymbol];
+
+    if (property.name === name)
+      return treeElement;
+  }
+
+  return null;
+};
+
+ElementsTestRunner.firstMatchedStyleSection = function() {
+  return UI.panels.elements._stylesWidget._sectionBlocks[0].sections[1];
+};
+
+ElementsTestRunner.firstMediaTextElementInSection = function(section) {
+  return section.element.querySelector('.media-text');
+};
+
+ElementsTestRunner.querySelector = async function(selector, callback) {
+  var doc = await TestRunner.domModel.requestDocumentPromise();
+  var nodeId = await TestRunner.domModel.querySelector(doc.id, selector);
+  callback(TestRunner.domModel.nodeForId(nodeId));
+};
+
+ElementsTestRunner.shadowRootByHostId = function(idValue, callback) {
+  function shadowRootMatches(node) {
+    return node.isShadowRoot() && node.parentNode.getAttribute('id') === idValue;
+  }
+
+  ElementsTestRunner.findNode(shadowRootMatches, callback);
+};
+
+ElementsTestRunner.nodeWithClass = function(classValue, callback) {
+  function nodeClassMatches(node) {
+    var classAttr = node.getAttribute('class');
+    return classAttr && classAttr.indexOf(classValue) > -1;
+  }
+
+  ElementsTestRunner.findNode(nodeClassMatches, callback);
+};
+
+ElementsTestRunner.expandedNodeWithId = function(idValue) {
+  var result;
+  ElementsTestRunner.nodeWithId(idValue, node => result = node);
+  return result;
+};
+
+function waitForStylesRebuild(matchFunction, callback, requireRebuild) {
+  (function sniff(node, rebuild) {
+    if ((rebuild || !requireRebuild) && node && matchFunction(node)) {
+      callback();
+      return;
+    }
+
+    TestRunner.addSniffer(Elements.StylesSidebarPane.prototype, '_nodeStylesUpdatedForTest', sniff);
+  })(null);
+}
+
+ElementsTestRunner.waitForStyles = function(idValue, callback, requireRebuild) {
+  callback = TestRunner.safeWrap(callback);
+
+  function nodeWithId(node) {
+    return node.getAttribute('id') === idValue;
+  }
+
+  waitForStylesRebuild(nodeWithId, callback, requireRebuild);
+};
+
+ElementsTestRunner.waitForStylesForClass = function(classValue, callback, requireRebuild) {
+  callback = TestRunner.safeWrap(callback);
+
+  function nodeWithClass(node) {
+    var classAttr = node.getAttribute('class');
+    return classAttr && classAttr.indexOf(classValue) > -1;
+  }
+
+  waitForStylesRebuild(nodeWithClass, callback, requireRebuild);
+};
+
+ElementsTestRunner.waitForSelectorCommitted = function(callback) {
+  TestRunner.addSniffer(Elements.StylePropertiesSection.prototype, '_editingSelectorCommittedForTest', callback);
+};
+
+ElementsTestRunner.waitForMediaTextCommitted = function(callback) {
+  TestRunner.addSniffer(Elements.StylePropertiesSection.prototype, '_editingMediaTextCommittedForTest', callback);
+};
+
+ElementsTestRunner.waitForStyleApplied = function(callback) {
+  TestRunner.addSniffer(Elements.StylePropertyTreeElement.prototype, 'styleTextAppliedForTest', callback);
+};
+
+ElementsTestRunner.selectNodeAndWaitForStyles = function(idValue, callback) {
+  callback = TestRunner.safeWrap(callback);
+  var targetNode;
+  ElementsTestRunner.waitForStyles(idValue, stylesUpdated, true);
+  ElementsTestRunner.selectNodeWithId(idValue, nodeSelected);
+
+  function nodeSelected(node) {
+    targetNode = node;
+  }
+
+  function stylesUpdated() {
+    callback(targetNode);
+  }
+};
+
+ElementsTestRunner.selectPseudoElementAndWaitForStyles = function(parentId, pseudoType, callback) {
+  callback = TestRunner.safeWrap(callback);
+  var targetNode;
+  waitForStylesRebuild(isPseudoElement, stylesUpdated, true);
+  ElementsTestRunner.findNode(isPseudoElement, nodeFound);
+
+  function nodeFound(node) {
+    targetNode = node;
+    Common.Revealer.reveal(node);
+  }
+
+  function stylesUpdated() {
+    callback(targetNode);
+  }
+
+  function isPseudoElement(node) {
+    return node.parentNode && node.parentNode.getAttribute('id') === parentId && node.pseudoType() === pseudoType;
+  }
+};
+
+ElementsTestRunner.selectNodeAndWaitForStylesWithComputed = function(idValue, callback) {
+  callback = TestRunner.safeWrap(callback);
+  ElementsTestRunner.selectNodeAndWaitForStyles(idValue, onSidebarRendered);
+
+  function onSidebarRendered(node) {
+    ElementsTestRunner.computedStyleWidget().doUpdate().then(callback.bind(null, node));
+  }
+};
+
+ElementsTestRunner.firstElementsTreeOutline = function() {
+  return UI.panels.elements._treeOutlines[0];
+};
+
+ElementsTestRunner.filterMatchedStyles = function(text) {
+  var regex = (text ? new RegExp(text, 'i') : null);
+  TestRunner.addResult('Filtering styles by: ' + text);
+  UI.panels.elements._stylesWidget._onFilterChanged(regex);
+};
+
+ElementsTestRunner.dumpRenderedMatchedStyles = function() {
+  var sectionBlocks = UI.panels.elements._stylesWidget._sectionBlocks;
+
+  for (var block of sectionBlocks) {
+    for (var section of block.sections) {
+      if (section.element.classList.contains('hidden'))
+        continue;
+
+      dumpRenderedSection(section);
+    }
+  }
+
+  function dumpRenderedSection(section) {
+    TestRunner.addResult(section._selectorElement.textContent + ' {');
+    var rootElement = section.propertiesTreeOutline.rootElement();
+
+    for (var i = 0; i < rootElement.childCount(); ++i)
+      dumpRenderedProperty(rootElement.childAt(i));
+
+    TestRunner.addResult('}');
+  }
+
+  function dumpRenderedProperty(property) {
+    var text = new Array(4).join(' ');
+    text += property.nameElement.textContent;
+    text += ':';
+
+    if (property.isExpandable())
+      text += (property.expanded ? 'v' : '>');
+    else
+      text += ' ';
+
+    text += property.valueElement.textContent;
+
+    if (property.listItemElement.classList.contains('filter-match'))
+      text = 'F' + text.substring(1);
+
+    TestRunner.addResult(text);
+
+    if (!property.expanded)
+      return;
+
+    var indent = new Array(8).join(' ');
+
+    for (var i = 0; i < property.childCount(); ++i) {
+      var childProperty = property.childAt(i);
+      var text = indent;
+      text += String.sprintf('%s: %s', childProperty.nameElement.textContent, childProperty.valueElement.textContent);
+
+      if (childProperty.listItemElement.classList.contains('filter-match'))
+        text = 'F' + text.substring(1);
+
+      TestRunner.addResult(text);
+    }
+  }
+};
+
+ElementsTestRunner.dumpSelectedElementStyles = function(
+    excludeComputed, excludeMatched, omitLonghands, includeSelectorGroupMarks) {
+  var sectionBlocks = UI.panels.elements._stylesWidget._sectionBlocks;
+
+  if (!excludeComputed)
+    ElementsTestRunner.dumpComputedStyle();
+
+  for (var block of sectionBlocks) {
+    for (var section of block.sections) {
+      if (section.style().parentRule && excludeMatched)
+        continue;
+
+      if (section.element.previousSibling && section.element.previousSibling.className === 'sidebar-separator') {
+        var nodeDescription = '';
+
+        if (section.element.previousSibling.firstElementChild)
+          nodeDescription = section.element.previousSibling.firstElementChild.shadowRoot.lastChild.textContent;
+
+        TestRunner.addResult('======== ' + section.element.previousSibling.textContent + nodeDescription + ' ========');
+      }
+
+      printStyleSection(section, omitLonghands, includeSelectorGroupMarks);
+    }
+  }
+};
+
+function printStyleSection(section, omitLonghands, includeSelectorGroupMarks) {
+  if (!section)
+    return;
+
+  TestRunner.addResult(
+      '[expanded] ' + ((section.propertiesTreeOutline.element.classList.contains('no-affect') ? '[no-affect] ' : '')));
+  var medias = section._titleElement.querySelectorAll('.media-list .media');
+
+  for (var i = 0; i < medias.length; ++i) {
+    var media = medias[i];
+    TestRunner.addResult(media.textContent);
+  }
+
+  var selector =
+      section._titleElement.querySelector('.selector') || section._titleElement.querySelector('.keyframe-key');
+  var selectorText = (includeSelectorGroupMarks ? buildMarkedSelectors(selector) : selector.textContent);
+  selectorText += selector.nextSibling.textContent;
+  var anchor = section._titleElement.querySelector('.styles-section-subtitle');
+
+  if (anchor) {
+    var anchorText = extractLinkText(anchor);
+    selectorText += String.sprintf(' (%s)', anchorText);
+  }
+
+  TestRunner.addResult(selectorText);
+  ElementsTestRunner.dumpStyleTreeOutline(section.propertiesTreeOutline, (omitLonghands ? 1 : 2));
+  TestRunner.addResult('');
+}
+
+function extractLinkText(element) {
+  var anchor = element.querySelector('.devtools-link');
+
+  if (!anchor)
+    return element.textContent;
+
+  var anchorText = anchor.textContent;
+  var info = Components.Linkifier._linkInfo(anchor);
+  var uiLocation = info && info.uiLocation;
+  var anchorTarget =
+      (uiLocation ?
+           uiLocation.uiSourceCode.name() + ':' + (uiLocation.lineNumber + 1) + ':' + (uiLocation.columnNumber + 1) :
+           '');
+  return anchorText + ' -> ' + anchorTarget;
+}
+
+function buildMarkedSelectors(element) {
+  var result = '';
+
+  for (var node = element.firstChild; node; node = node.nextSibling) {
+    if (node.nodeType === Node.ELEMENT_NODE && node.classList.contains('selector-matches'))
+      result += '[$' + node.textContent + '$]';
+    else
+      result += node.textContent;
+  }
+
+  return result;
+}
+
+ElementsTestRunner.toggleStyleProperty = function(propertyName, checked) {
+  var treeItem = ElementsTestRunner.getElementStylePropertyTreeItem(propertyName);
+
+  treeItem._toggleEnabled({
+    target: {checked: checked},
+
+    consume: function() {}
+  });
+};
+
+ElementsTestRunner.toggleMatchedStyleProperty = function(propertyName, checked) {
+  var treeItem = ElementsTestRunner.getMatchedStylePropertyTreeItem(propertyName);
+
+  treeItem._toggleEnabled({
+    target: {checked: checked},
+
+    consume: function() {}
+  });
+};
+
+ElementsTestRunner.eventListenersWidget = function() {
+  UI.viewManager.showView('elements.eventListeners');
+  return self.runtime.sharedInstance(Elements.EventListenersWidget);
+};
+
+ElementsTestRunner.showEventListenersWidget = function() {
+  return UI.viewManager.showView('elements.eventListeners');
+};
+
+ElementsTestRunner.expandAndDumpSelectedElementEventListeners = function(callback, force) {
+  ElementsTestRunner.expandAndDumpEventListeners(
+      ElementsTestRunner.eventListenersWidget()._eventListenersView, callback, force);
+};
+
+ElementsTestRunner.removeFirstEventListener = function() {
+  var treeOutline = ElementsTestRunner.eventListenersWidget()._eventListenersView._treeOutline;
+  var listenerTypes = treeOutline.rootElement().children();
+
+  for (var i = 0; i < listenerTypes.length; i++) {
+    var listeners = listenerTypes[i].children();
+
+    if (listeners.length && !listenerTypes[i].hidden) {
+      listeners[0].eventListener().remove();
+      listeners[0]._removeListenerBar();
+      break;
+    }
+  }
+};
+
+ElementsTestRunner.dumpObjectPropertySectionDeep = function(section) {
+  function domNodeToString(node) {
+    if (node)
+      return '\'' + node.textContent + '\'';
+    else
+      return 'null';
+  }
+
+  function dumpTreeElementRecursively(treeElement, prefix) {
+    if ('nameElement' in treeElement) {
+      TestRunner.addResult(
+          prefix + domNodeToString(treeElement.nameElement) + ' => ' + domNodeToString(treeElement.valueElement));
+    } else {
+      TestRunner.addResult(prefix + treeElement.title);
+    }
+
+    for (var i = 0; i < treeElement.childCount(); i++)
+      dumpTreeElementRecursively(treeElement.childAt(i), prefix + '    ');
+  }
+
+  var childNodes = section.propertiesTreeOutline.rootElement().children();
+
+  for (var i = 0; i < childNodes.length; i++)
+    dumpTreeElementRecursively(childNodes[i], '');
+
+};
+
+ElementsTestRunner.getElementStylePropertyTreeItem = function(propertyName) {
+  return ElementsTestRunner.getFirstPropertyTreeItemForSection(ElementsTestRunner.inlineStyleSection(), propertyName);
+};
+
+ElementsTestRunner.getMatchedStylePropertyTreeItem = function(propertyName) {
+  var sectionBlocks = UI.panels.elements._stylesWidget._sectionBlocks;
+
+  for (var block of sectionBlocks) {
+    for (var section of block.sections) {
+      var treeItem = ElementsTestRunner.getFirstPropertyTreeItemForSection(section, propertyName);
+
+      if (treeItem)
+        return treeItem;
+    }
+  }
+
+  return null;
+};
+
+ElementsTestRunner.getFirstPropertyTreeItemForSection = function(section, propertyName) {
+  var outline = section.propertiesTreeOutline.rootElement();
+
+  for (var i = 0; i < outline.childCount(); ++i) {
+    var treeItem = outline.childAt(i);
+
+    if (treeItem.name === propertyName)
+      return treeItem;
+  }
+
+  return null;
+};
+
+ElementsTestRunner.dumpStyleTreeOutline = function(treeItem, depth) {
+  var children = treeItem.rootElement().children();
+
+  for (var i = 0; i < children.length; ++i)
+    ElementsTestRunner.dumpStyleTreeItem(children[i], '', depth || 2);
+};
+
+ElementsTestRunner.dumpStyleTreeItem = function(treeItem, prefix, depth) {
+  if (treeItem.listItemElement.textContent.indexOf(' width:') !== -1 ||
+      treeItem.listItemElement.textContent.indexOf(' height:') !== -1)
+    return;
+
+  if (treeItem.listItemElement.classList.contains('inherited'))
+    return;
+
+  var typePrefix = '';
+
+  if (treeItem.listItemElement.classList.contains('overloaded') ||
+      treeItem.listItemElement.classList.contains('inactive') ||
+      treeItem.listItemElement.classList.contains('not-parsed-ok'))
+    typePrefix += '/-- overloaded --/ ';
+
+  if (treeItem.listItemElement.classList.contains('disabled'))
+    typePrefix += '/-- disabled --/ ';
+
+  var textContent = treeItem.listItemElement.textContent;
+  TestRunner.addResult(prefix + typePrefix + textContent);
+
+  if (--depth) {
+    treeItem.expand();
+    var children = treeItem.children();
+
+    for (var i = 0; children && i < children.length; ++i)
+      ElementsTestRunner.dumpStyleTreeItem(children[i], prefix + '    ', depth);
+  }
+};
+
+ElementsTestRunner.dumpElementsTree = function(rootNode, depth, resultsArray) {
+  function beautify(element) {
+    return element.innerText.replace(/\u200b/g, '').replace(/\n/g, '\\n').trim();
+  }
+
+  function dumpMap(name, map) {
+    var result = [];
+
+    for (var id of map.keys())
+      result.push(id + '=' + map.get(id));
+
+    if (!result.length)
+      return '';
+
+    return name + ':[' + result.join(',') + ']';
+  }
+
+  function markersDataDump(treeItem) {
+    if (treeItem._elementCloseTag)
+      return '';
+
+    var markers = '';
+    var node = treeItem._node;
+
+    if (node) {
+      markers += dumpMap('markers', node._markers);
+      var dump = (node._subtreeMarkerCount ? 'subtreeMarkerCount:' + node._subtreeMarkerCount : '');
+
+      if (dump) {
+        if (markers)
+          markers += ', ';
+
+        markers += dump;
+      }
+
+      if (markers)
+        markers = ' [' + markers + ']';
+    }
+
+    return markers;
+  }
+
+  function print(treeItem, prefix, depth) {
+    if (!treeItem.root) {
+      var expander;
+
+      if (treeItem.isExpandable()) {
+        if (treeItem.expanded)
+          expander = '- ';
+        else
+          expander = '+ ';
+      } else {
+        expander = '  ';
+      }
+
+      var markers = markersDataDump(treeItem);
+      var value = prefix + expander + beautify(treeItem.listItemElement) + markers;
+
+      if (treeItem.shadowHostToolbar) {
+        value = prefix + expander + 'shadow-root ';
+
+        for (var i = 0; i < treeItem.shadowHostToolbar.children.length; ++i) {
+          var button = treeItem.shadowHostToolbar.children[i];
+          var toggled = button.disabled;
+          var name = ((toggled ? '<' : '')) + button.textContent + ((toggled ? '>' : ''));
+          value += name + ' ';
+        }
+      }
+
+      if (resultsArray)
+        resultsArray.push(value);
+      else
+        TestRunner.addResult(value);
+    }
+
+    if (!treeItem.expanded)
+      return;
+
+    var children = treeItem.children();
+    var newPrefix = (treeItem.root ? '' : prefix + '    ');
+
+    for (var i = 0; depth && children && i < children.length; ++i) {
+      if (!children[i]._elementCloseTag)
+        print(children[i], newPrefix, depth - 1);
+      else
+        print(children[i], prefix, depth);
+    }
+  }
+
+  var treeOutline = ElementsTestRunner.firstElementsTreeOutline();
+  treeOutline.runPendingUpdates();
+  print((rootNode ? treeOutline.findTreeElement(rootNode) : treeOutline.rootElement()), '', depth || 10000);
+};
+
+ElementsTestRunner.dumpDOMUpdateHighlights = function(rootNode, callback, depth) {
+  var hasHighlights = false;
+  TestRunner.addSniffer(Elements.ElementsTreeOutline.prototype, '_updateModifiedNodes', didUpdate);
+
+  function didUpdate() {
+    var treeOutline = ElementsTestRunner.firstElementsTreeOutline();
+    print((rootNode ? treeOutline.findTreeElement(rootNode) : treeOutline.rootElement()), '', depth || 10000);
+
+    if (!hasHighlights)
+      TestRunner.addResult('<No highlights>');
+
+    if (callback)
+      callback();
+  }
+
+  function print(treeItem, prefix, depth) {
+    if (!treeItem.root) {
+      var elementXPath = Components.DOMPresentationUtils.xPath(treeItem.node(), true);
+      var highlightedElements = treeItem.listItemElement.querySelectorAll('.dom-update-highlight');
+
+      for (var i = 0; i < highlightedElements.length; ++i) {
+        var element = highlightedElements[i];
+        var classList = element.classList;
+        var xpath = elementXPath;
+
+        if (classList.contains('webkit-html-attribute-name')) {
+          xpath += '/@' + element.textContent + ' (empty)';
+        } else if (classList.contains('webkit-html-attribute-value')) {
+          name = element.parentElement.querySelector('.webkit-html-attribute-name').textContent;
+          xpath += '/@' + name + ' ' + element.textContent;
+        } else if (classList.contains('webkit-html-text-node')) {
+          xpath += '/text() "' + element.textContent + '"';
+        }
+
+        TestRunner.addResult(prefix + xpath);
+        hasHighlights = true;
+      }
+    }
+
+    if (!treeItem.expanded)
+      return;
+
+    var children = treeItem.children();
+    var newPrefix = (treeItem.root ? '' : prefix + '    ');
+
+    for (var i = 0; depth && children && i < children.length; ++i) {
+      if (!children[i]._elementCloseTag)
+        print(children[i], newPrefix, depth - 1);
+    }
+  }
+};
+
+ElementsTestRunner.expandElementsTree = function(callback) {
+  var expandedSomething = false;
+  callback = TestRunner.safeWrap(callback);
+
+  function expand(treeItem) {
+    var children = treeItem.children();
+
+    for (var i = 0; children && i < children.length; ++i) {
+      var child = children[i];
+
+      if (child.isExpandable() && !child.expanded) {
+        child.expand();
+        expandedSomething = true;
+      }
+
+      expand(child);
+    }
+  }
+
+  function onAllNodesAvailable() {
+    ElementsTestRunner.firstElementsTreeOutline().runPendingUpdates();
+    expand(ElementsTestRunner.firstElementsTreeOutline().rootElement());
+    setTimeout(callback.bind(null, expandedSomething));
+  }
+
+  ElementsTestRunner.findNode(function() {
+    return false;
+  }, onAllNodesAvailable);
+};
+
+ElementsTestRunner.dumpDOMAgentTree = function(node) {
+  if (!TestRunner.domModel._document)
+    return;
+
+  function dump(node, prefix) {
+    TestRunner.addResult(prefix + node.nodeName());
+    prefix = prefix + '    ';
+
+    if (node.templateContent())
+      dump(node.templateContent(), prefix);
+
+    if (node.importedDocument())
+      dump(node.importedDocument(), prefix);
+
+    var shadowRoots = node.shadowRoots();
+
+    for (var i = 0; i < shadowRoots.length; ++i)
+      dump(shadowRoots[i], prefix);
+
+    var children = node.children();
+
+    for (var i = 0; children && i < children.length; ++i)
+      dump(children[i], prefix);
+  }
+
+  dump(node, '');
+};
+
+ElementsTestRunner.rangeText = function(range) {
+  if (!range)
+    return '[undefined-undefined]';
+
+  return '[' + range.startLine + ':' + range.startColumn + '-' + range.endLine + ':' + range.endColumn + ']';
+};
+
+ElementsTestRunner.generateUndoTest = function(testBody) {
+  function result(next) {
+    var testNode = ElementsTestRunner.expandedNodeWithId(/function\s([^(]*)/.exec(testBody)[1]);
+    TestRunner.addResult('Initial:');
+    ElementsTestRunner.dumpElementsTree(testNode);
+    testBody(undo);
+
+    function undo() {
+      TestRunner.addResult('Post-action:');
+      ElementsTestRunner.dumpElementsTree(testNode);
+      ElementsTestRunner.expandElementsTree(expandedCallback);
+
+      function expandedCallback(expandedSomething) {
+        if (expandedSomething) {
+          TestRunner.addResult('== Expanded: ==');
+          ElementsTestRunner.dumpElementsTree(testNode);
+        }
+
+        TestRunner.domModel.undo().then(redo);
+      }
+    }
+
+    function redo() {
+      TestRunner.addResult('Post-undo (initial):');
+      ElementsTestRunner.dumpElementsTree(testNode);
+      ElementsTestRunner.expandElementsTree(expandedCallback);
+
+      function expandedCallback(expandedSomething) {
+        if (expandedSomething) {
+          TestRunner.addResult('== Expanded: ==');
+          ElementsTestRunner.dumpElementsTree(testNode);
+        }
+
+        TestRunner.domModel.redo().then(done);
+      }
+    }
+
+    function done() {
+      TestRunner.addResult('Post-redo (action):');
+      ElementsTestRunner.dumpElementsTree(testNode);
+      ElementsTestRunner.expandElementsTree(expandedCallback);
+
+      function expandedCallback(expandedSomething) {
+        if (expandedSomething) {
+          TestRunner.addResult('== Expanded: ==');
+          ElementsTestRunner.dumpElementsTree(testNode);
+        }
+
+        next();
+      }
+    }
+  }
+
+  result.toString = function() {
+    return testBody.toString();
+  };
+
+  return result;
+};
+
+const indent = '    ';
+
+ElementsTestRunner.dumpRulesArray = function(rules, currentIndent) {
+  if (!rules)
+    return;
+
+  currentIndent = currentIndent || '';
+
+  for (var i = 0; i < rules.length; ++i)
+    ElementsTestRunner.dumpRule(rules[i], currentIndent);
+};
+
+ElementsTestRunner.dumpRuleMatchesArray = function(matches, currentIndent) {
+  if (!matches)
+    return;
+
+  currentIndent = currentIndent || '';
+
+  for (var i = 0; i < matches.length; ++i)
+    ElementsTestRunner.dumpRule(matches[i].rule, currentIndent);
+};
+
+ElementsTestRunner.dumpRule = function(rule, currentIndent) {
+  function selectorRange() {
+    var selectors = rule.selectorList.selectors;
+
+    if (!selectors || !selectors[0].range)
+      return '';
+
+    var ranges = [];
+
+    for (var i = 0; i < selectors.length; ++i) {
+      var range = selectors[i].range;
+      ranges.push(range.startLine + ':' + range.startColumn + '-' + range.endLine + ':' + range.endColumn);
+    }
+
+    return ', ' + ranges.join('; ');
+  }
+
+  currentIndent = currentIndent || '';
+
+  if (!rule.type || rule.type === 'style') {
+    TestRunner.addResult(currentIndent + rule.selectorList.text + ': [' + rule.origin + selectorRange() + '] {');
+    ElementsTestRunner.dumpStyle(rule.style, currentIndent + indent);
+    TestRunner.addResult(currentIndent + '}');
+    return;
+  }
+
+  if (rule.type === 'media') {
+    TestRunner.addResult(currentIndent + '@media ' + rule.mediaText + ' {');
+    ElementsTestRunner.dumpRulesArray(rule.childRules, currentIndent + indent);
+    TestRunner.addResult(currentIndent + '}');
+    return;
+  }
+
+  if (rule.type === 'import') {
+    TestRunner.addResult(
+        currentIndent + '@import: header=' + ElementsTestRunner.rangeText(rule.headerRange) +
+        ', body=' + ElementsTestRunner.rangeText(rule.bodyRange));
+
+    return;
+  }
+
+  if (rule.type === 'page' || rule.type === 'font-face') {
+    if (rule.type === 'page') {
+      TestRunner.addResult(currentIndent + rule.selectorList.text + ' {');
+    } else {
+      TestRunner.addResult(
+          currentIndent + '@' + rule.type + ' ' + ((rule.selectorList.text ? rule.selectorList.text + ' ' : '')) + '{');
+    }
+
+    ElementsTestRunner.dumpStyle(rule.style, currentIndent + indent);
+    TestRunner.addResult(currentIndent + '}');
+    return;
+  }
+
+  if (rule.type === 'charset') {
+    TestRunner.addResult('@charset');
+    return;
+  }
+
+  TestRunner.addResult(
+      currentIndent + '[UNKNOWN RULE]: header=' + ElementsTestRunner.rangeText(rule.headerRange) +
+      ', body=' + ElementsTestRunner.rangeText(rule.bodyRange));
+};
+
+ElementsTestRunner.dumpStyle = function(style, currentIndent) {
+  currentIndent = currentIndent || '';
+
+  if (!style) {
+    TestRunner.addResult(currentIndent + '[NO STYLE]');
+    return;
+  }
+
+  for (var i = 0; i < style.cssProperties.length; ++i) {
+    var property = style.cssProperties[i];
+
+    if (!property.disabled) {
+      TestRunner.addResult(
+          currentIndent + '[\'' + property.name + '\':\'' + property.value + '\'' +
+          ((property.important ? ' is-important' : '')) + (('parsedOk' in property ? ' non-parsed' : '')) + '] @' +
+          ElementsTestRunner.rangeText(property.range) + ' ');
+    } else {
+      TestRunner.addResult(currentIndent + '[text=\'' + property.text + '\'] disabled');
+    }
+  }
+};
+
+ElementsTestRunner.dumpCSSStyleDeclaration = function(style, currentIndent) {
+  currentIndent = currentIndent || '';
+
+  if (!style) {
+    TestRunner.addResult(currentIndent + '[NO STYLE]');
+    return;
+  }
+
+  var properties = style.allProperties();
+
+  for (var i = 0; i < properties.length; ++i) {
+    var property = properties[i];
+
+    if (!property.disabled) {
+      TestRunner.addResult(
+          currentIndent + '[\'' + property.name + '\':\'' + property.value + '\'' +
+          ((property.important ? ' is-important' : '')) + ((!property['parsedOk'] ? ' non-parsed' : '')) + '] @' +
+          ElementsTestRunner.rangeText(property.range) + ' ');
+    } else {
+      TestRunner.addResult(currentIndent + '[text=\'' + property.text + '\'] disabled');
+    }
+  }
+};
+
+ElementsTestRunner.dumpBreadcrumb = function(message) {
+  if (message)
+    TestRunner.addResult(message + ':');
+
+  var result = [];
+  var crumbs = UI.panels.elements._breadcrumbs.crumbsElement;
+  var crumb = crumbs.lastChild;
+
+  while (crumb) {
+    result.unshift(crumb.textContent);
+    crumb = crumb.previousSibling;
+  }
+
+  TestRunner.addResult(result.join(' > '));
+};
+
+ElementsTestRunner.matchingSelectors = function(matchedStyles, rule) {
+  var selectors = [];
+  var matchingSelectors = matchedStyles.matchingSelectors(rule);
+
+  for (var i = 0; i < matchingSelectors.length; ++i)
+    selectors.push(rule.selectors[matchingSelectors[i]].text);
+
+  return '[' + selectors.join(', ') + ']';
+};
+
+ElementsTestRunner.addNewRuleInStyleSheet = function(styleSheetHeader, selector, callback) {
+  TestRunner.addSniffer(
+      Elements.StylesSidebarPane.prototype, '_addBlankSection', onBlankSection.bind(null, selector, callback));
+  UI.panels.elements._stylesWidget._createNewRuleInStyleSheet(styleSheetHeader);
+};
+
+ElementsTestRunner.addNewRule = function(selector, callback) {
+  UI.panels.elements._stylesWidget.contentElement.querySelector('.styles-pane-toolbar')
+      .shadowRoot.querySelector('.largeicon-add')
+      .click();
+  TestRunner.addSniffer(
+      Elements.StylesSidebarPane.prototype, '_addBlankSection', onBlankSection.bind(null, selector, callback));
+};
+
+function onBlankSection(selector, callback) {
+  var section = ElementsTestRunner.firstMatchedStyleSection();
+
+  if (typeof selector === 'string')
+    section._selectorElement.textContent = selector;
+
+  section._selectorElement.dispatchEvent(TestRunner.createKeyEvent('Enter'));
+  ElementsTestRunner.waitForSelectorCommitted(callback.bind(null, section));
+}
+
+ElementsTestRunner.dumpInspectorHighlightJSON = function(idValue, callback) {
+  ElementsTestRunner.nodeWithId(idValue, nodeResolved);
+
+  async function nodeResolved(node) {
+    var result = await TestRunner.OverlayAgent.getHighlightObjectForTest(node.id);
+    TestRunner.addResult(idValue + JSON.stringify(result, null, 2));
+    callback();
+  }
+};
+
+ElementsTestRunner.waitForAnimationAdded = function(callback) {
+  TestRunner.addSniffer(Animation.AnimationTimeline.prototype, '_addAnimationGroup', callback);
+};
+
+ElementsTestRunner.dumpAnimationTimeline = function(timeline) {
+  for (var ui of timeline._uiAnimations) {
+    TestRunner.addResult(ui.animation().type());
+    TestRunner.addResult(ui._nameElement.innerHTML);
+    TestRunner.addResult(ui._svg.innerHTML);
+  }
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/elements_test_runner/SetOuterHTMLTestRunner.js b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/SetOuterHTMLTestRunner.js
new file mode 100644
index 0000000..abdc7e7
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/SetOuterHTMLTestRunner.js
@@ -0,0 +1,109 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+ElementsTestRunner.events = [];
+ElementsTestRunner.containerId;
+
+ElementsTestRunner.setUpTestSuite = function(next) {
+  ElementsTestRunner.expandElementsTree(step1);
+
+  function step1() {
+    ElementsTestRunner.selectNodeWithId('container', step2);
+  }
+
+  function step2(node) {
+    ElementsTestRunner.containerId = node.id;
+    TestRunner.DOMAgent.getOuterHTML(ElementsTestRunner.containerId).then(step3);
+  }
+
+  function step3(text) {
+    ElementsTestRunner.containerText = text;
+
+    for (var key in SDK.DOMModel.Events) {
+      var eventName = SDK.DOMModel.Events[key];
+
+      if (eventName === SDK.DOMModel.Events.MarkersChanged || eventName === SDK.DOMModel.Events.DOMMutated)
+        continue;
+
+      TestRunner.domModel.addEventListener(
+          eventName, ElementsTestRunner.recordEvent.bind(ElementsTestRunner, eventName));
+    }
+
+    next();
+  }
+};
+
+ElementsTestRunner.recordEvent = function(eventName, event) {
+  if (!event.data)
+    return;
+
+  var node = event.data.node || event.data;
+  var parent = event.data.parent;
+
+  for (var currentNode = parent || node; currentNode; currentNode = currentNode.parentNode) {
+    if (currentNode.getAttribute('id') === 'output')
+      return;
+  }
+
+  ElementsTestRunner.events.push('Event ' + eventName.toString() + ': ' + node.nodeName());
+};
+
+ElementsTestRunner.patchOuterHTML = function(pattern, replacement, next) {
+  TestRunner.addResult('Replacing \'' + pattern + '\' with \'' + replacement + '\'\n');
+  ElementsTestRunner.setOuterHTML(ElementsTestRunner.containerText.replace(pattern, replacement), next);
+};
+
+ElementsTestRunner.patchOuterHTMLUseUndo = function(pattern, replacement, next) {
+  TestRunner.addResult('Replacing \'' + pattern + '\' with \'' + replacement + '\'\n');
+  ElementsTestRunner.setOuterHTMLUseUndo(ElementsTestRunner.containerText.replace(pattern, replacement), next);
+};
+
+ElementsTestRunner.setOuterHTML = function(newText, next) {
+  ElementsTestRunner.innerSetOuterHTML(newText, false, bringBack);
+
+  function bringBack() {
+    TestRunner.addResult('\nBringing things back\n');
+    ElementsTestRunner.innerSetOuterHTML(ElementsTestRunner.containerText, true, next);
+  }
+};
+
+ElementsTestRunner.setOuterHTMLUseUndo = function(newText, next) {
+  ElementsTestRunner.innerSetOuterHTML(newText, false, bringBack);
+
+  async function bringBack() {
+    TestRunner.addResult('\nBringing things back\n');
+    await TestRunner.domModel.undo();
+    ElementsTestRunner._dumpOuterHTML(true, next);
+  }
+};
+
+ElementsTestRunner.innerSetOuterHTML = async function(newText, last, next) {
+  await TestRunner.DOMAgent.setOuterHTML(ElementsTestRunner.containerId, newText);
+  ElementsTestRunner._dumpOuterHTML(last, next);
+};
+
+ElementsTestRunner._dumpOuterHTML = async function(last, next) {
+  var result = await TestRunner.RuntimeAgent.evaluate('document.getElementById("identity").wrapperIdentity');
+  TestRunner.addResult('Wrapper identity: ' + result.value);
+  ElementsTestRunner.events.sort();
+
+  for (var i = 0; i < ElementsTestRunner.events.length; ++i)
+    TestRunner.addResult(ElementsTestRunner.events[i]);
+
+  ElementsTestRunner.events = [];
+  var text = await TestRunner.DOMAgent.getOuterHTML(ElementsTestRunner.containerId);
+  TestRunner.addResult('==========8<==========');
+  TestRunner.addResult(text);
+  TestRunner.addResult('==========>8==========');
+
+  if (last)
+    TestRunner.addResult('\n\n\n');
+
+  next();
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/elements_test_runner/StylesUpdateLinksTestRunner.js b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/StylesUpdateLinksTestRunner.js
new file mode 100644
index 0000000..a48b193
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/StylesUpdateLinksTestRunner.js
@@ -0,0 +1,129 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+function flattenRuleRanges(rule) {
+  var ranges = [];
+  var medias = rule.media || [];
+
+  for (var i = 0; i < medias.length; ++i) {
+    var media = medias[i];
+
+    if (!media.range)
+      continue;
+
+    ranges.push({range: media.range, name: 'media #' + i});
+  }
+
+  for (var i = 0; i < rule.selectors.length; ++i) {
+    var selector = rule.selectors[i];
+
+    if (!selector.range)
+      continue;
+
+    ranges.push({range: selector.range, name: 'selector #' + i});
+  }
+
+  if (rule.style.range)
+    ranges.push({range: rule.style.range, name: 'style range'});
+
+
+  var properties = rule.style.allProperties();
+
+  for (var i = 0; i < properties.length; ++i) {
+    var property = properties[i];
+
+    if (!property.range)
+      continue;
+
+    ranges.push({range: property.range, name: 'property >>' + property.text + '<<'});
+  }
+
+  return ranges;
+}
+
+function compareRuleRanges(lazyRule, originalRule) {
+  if (lazyRule.selectorText !== originalRule.selectorText) {
+    TestRunner.addResult(
+        'Error: rule selectors are not equal: ' + lazyRule.selectorText + ' != ' + originalRule.selectorText);
+    return false;
+  }
+
+  var flattenLazy = flattenRuleRanges(lazyRule);
+  var flattenOriginal = flattenRuleRanges(originalRule);
+
+  if (flattenLazy.length !== flattenOriginal.length) {
+    TestRunner.addResult(
+        'Error: rule range amount is not equal: ' + flattenLazy.length + ' != ' + flattenOriginal.length);
+    return false;
+  }
+
+  for (var i = 0; i < flattenLazy.length; ++i) {
+    var lazyRange = flattenLazy[i];
+    var originalRange = flattenOriginal[i];
+
+    if (lazyRange.name !== originalRange.name) {
+      TestRunner.addResult('Error: rule names are not equal: ' + lazyRange.name + ' != ' + originalRange.name);
+      return false;
+    }
+
+    if (!lazyRange.range.equal(originalRange.range)) {
+      TestRunner.addResult(
+          'Error: ranges \'' + lazyRange.name + '\' are not equal: ' + lazyRange.range.toString() +
+          ' != ' + originalRange.range.toString());
+
+      return false;
+    }
+  }
+
+  TestRunner.addResult(flattenLazy.length + ' rule ranges are equal.');
+  return true;
+}
+
+ElementsTestRunner.validateRuleRanges = function(selector, rules, callback) {
+  ElementsTestRunner.selectNodeAndWaitForStyles('other', onOtherSelected);
+
+  function onOtherSelected() {
+    ElementsTestRunner.selectNodeAndWaitForStyles(selector, onContainerSelected);
+  }
+
+  function onContainerSelected() {
+    var fetchedRules = ElementsTestRunner.getMatchedRules();
+
+    if (fetchedRules.length !== rules.length) {
+      TestRunner.addResult(String.sprintf(
+          'Error: rules sizes are not equal! Expected: %d, actual: %d', fetchedRules.length, rules.length));
+      TestRunner.completeTest();
+      return;
+    }
+
+    for (var i = 0; i < fetchedRules.length; ++i) {
+      if (!compareRuleRanges(rules[i], fetchedRules[i])) {
+        TestRunner.completeTest();
+        return;
+      }
+    }
+
+    callback();
+  }
+};
+
+ElementsTestRunner.getMatchedRules = function() {
+  var rules = [];
+
+  for (var block of UI.panels.elements._stylesWidget._sectionBlocks) {
+    for (var section of block.sections) {
+      var rule = section.style().parentRule;
+
+      if (rule)
+        rules.push(rule);
+    }
+  }
+
+  return rules;
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/elements_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/module.json
index f39e9e9b..6111fce0 100644
--- a/third_party/WebKit/Source/devtools/front_end/elements_test_runner/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/module.json
@@ -3,9 +3,21 @@
     "test_runner",
     "integration_test_runner",
     "elements",
-    "event_listeners"
+    "event_listeners",
+    "animation"
   ],
   "scripts": [
-    "ElementsTestRunner.js"
+    "ElementsTestRunner.js",
+    "EditDOMTestRunner.js",
+    "SetOuterHTMLTestRunner.js",
+    "ElementsPanelShadowSelectionOnRefreshTestRunner.js",
+    "StylesUpdateLinksTestRunner.js"
+  ],
+  "skip_compilation": [
+    "ElementsTestRunner.js",
+    "EditDOMTestRunner.js",
+    "SetOuterHTMLTestRunner.js",
+    "ElementsPanelShadowSelectionOnRefreshTestRunner.js",
+    "StylesUpdateLinksTestRunner.js"
   ]
 }
diff --git a/third_party/WebKit/Source/devtools/front_end/extensions_test_runner/ExtensionsNetworkTestRunner.js b/third_party/WebKit/Source/devtools/front_end/extensions_test_runner/ExtensionsNetworkTestRunner.js
new file mode 100644
index 0000000..497078f1
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/extensions_test_runner/ExtensionsNetworkTestRunner.js
@@ -0,0 +1,28 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+function extension_getRequestByUrl(urls, callback) {
+  function onHAR(response) {
+    var entries = response.entries;
+
+    for (var i = 0; i < entries.length; ++i) {
+      for (var url = 0; url < urls.length; ++url) {
+        if (urls[url].test(entries[i].request.url)) {
+          callback(entries[i]);
+          return;
+        }
+      }
+    }
+
+    output('no item found');
+    callback(null);
+  }
+
+  webInspector.network.getHAR(onHAR);
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/extensions_test_runner/ExtensionsTestRunner.js b/third_party/WebKit/Source/devtools/front_end/extensions_test_runner/ExtensionsTestRunner.js
new file mode 100644
index 0000000..21cb4d88
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/extensions_test_runner/ExtensionsTestRunner.js
@@ -0,0 +1,75 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+var extensionsHost = 'devtools-extensions.oopif.test';
+var extensionsOrigin = `http://${extensionsHost}:8000`;
+Extensions.extensionServer._registerHandler('evaluateForTestInFrontEnd', onEvaluate);
+
+Extensions.extensionServer._extensionAPITestHook = function(extensionServerClient, coreAPI) {
+  window.webInspector = coreAPI;
+  window._extensionServerForTests = extensionServerClient;
+  coreAPI.panels.themeName = 'themeNameForTest';
+};
+
+ExtensionsTestRunner._replyToExtension = function(requestId, port) {
+  Extensions.extensionServer._dispatchCallback(requestId, port);
+};
+
+function onEvaluate(message, port) {
+  try {
+    eval(message.expression);
+  } catch (e) {
+    TestRunner.addResult('Exception while running: ' + message.expression + '\n' + (e.stack || e));
+    TestRunner.completeTest();
+  }
+}
+
+ExtensionsTestRunner.runExtensionTests = async function() {
+  var result = await TestRunner.RuntimeAgent.evaluate('location.href', 'console', false);
+
+  if (!result)
+    return;
+
+  var pageURL = result.value;
+  var extensionURL = ((/^https?:/.test(pageURL) ? pageURL.replace(/^(https?:\/\/[^\/]*\/).*$/, '$1') :
+                                                  pageURL.replace(/\/inspector\/extensions\/[^\/]*$/, '/http/tests'))) +
+      'inspector/resources/extension-main.html';
+  extensionURL = extensionURL.replace('127.0.0.1', extensionsHost);
+
+  InspectorFrontendAPI.addExtensions(
+      [{startPage: extensionURL, name: 'test extension', exposeWebInspectorNamespace: true}]);
+
+  Extensions.extensionServer.initializeExtensions();
+};
+
+(async function() {
+  await TestRunner.evaluateInPagePromise(`
+    function extensionFunctions() {
+      var functions = '';
+
+      for (symbol in window) {
+        if (/^extension_/.exec(symbol) && typeof window[symbol] === 'function')
+          functions += window[symbol].toString();
+      }
+
+      return functions;
+    }
+
+    var extensionsOrigin = 'http://devtools-extensions.oopif.test:8000';
+
+    function extension_showPanel(panelId, callback) {
+      evaluateOnFrontend('InspectorTest.showPanel(unescape(\'' + escape(panelId) + '\')).then(function() { reply(); });', callback);
+    }
+
+    var test = function() {
+      Common.moduleSetting('shortcutPanelSwitch').set(true);
+      InspectorTest.runExtensionTests();
+    };
+  `);
+})();
diff --git a/third_party/WebKit/Source/devtools/front_end/extensions_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/extensions_test_runner/module.json
new file mode 100644
index 0000000..82e956c
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/extensions_test_runner/module.json
@@ -0,0 +1,15 @@
+{
+  "dependencies": [
+    "test_runner",
+    "integration_test_runner",
+    "extensions"
+  ],
+  "scripts": [
+    "ExtensionsNetworkTestRunner.js",
+    "ExtensionsTestRunner.js"
+  ],
+  "skip_compilation": [
+    "ExtensionsNetworkTestRunner.js",
+    "ExtensionsTestRunner.js"
+  ]
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/integration_test_runner.json b/third_party/WebKit/Source/devtools/front_end/integration_test_runner.json
index c327aab4..0242b890 100644
--- a/third_party/WebKit/Source/devtools/front_end/integration_test_runner.json
+++ b/third_party/WebKit/Source/devtools/front_end/integration_test_runner.json
@@ -1,5 +1,18 @@
 {
   "modules" : [
+    { "name": "application_test_runner" },
+    { "name": "audits_test_runner" },
+    { "name": "bindings_test_runner" },
+    { "name": "extensions_test_runner" },
+    { "name": "layers_test_runner" },
+    { "name": "network_test_runner" },
+    { "name": "security_test_runner" },
+    { "name": "performance_test_runner" },
+    { "name": "coverage_test_runner" },
+    { "name": "device_mode_test_runner" },
+    { "name": "accessibility_test_runner" },
+    { "name": "profiler_test_runner" },
+    { "name": "sass_test_runner" },
     { "name": "test_runner", "type": "autostart" },
     { "name": "integration_test_runner", "type": "autostart" },
     { "name": "console_test_runner" },
@@ -8,6 +21,11 @@
     { "name": "data_grid_test_runner" },
 
 
+
+    { "name": "heap_snapshot_worker" },
+
+
+    
     { "name": "platform", "type": "autostart" },
     { "name": "dom_extension", "type": "autostart" },
     { "name": "main", "type": "autostart" },
diff --git a/third_party/WebKit/Source/devtools/front_end/integration_test_runner/IntegrationTestRunner.js b/third_party/WebKit/Source/devtools/front_end/integration_test_runner/IntegrationTestRunner.js
index 8c7901b..5da2f43 100644
--- a/third_party/WebKit/Source/devtools/front_end/integration_test_runner/IntegrationTestRunner.js
+++ b/third_party/WebKit/Source/devtools/front_end/integration_test_runner/IntegrationTestRunner.js
@@ -21,6 +21,7 @@
   TestRunner.HeapProfilerAgent = target.heapProfilerAgent();
   TestRunner.InspectorAgent = target.inspectorAgent();
   TestRunner.NetworkAgent = target.networkAgent();
+  TestRunner.OverlayAgent = target.overlayAgent();
   TestRunner.PageAgent = target.pageAgent();
   TestRunner.ProfilerAgent = target.profilerAgent();
   TestRunner.RuntimeAgent = target.runtimeAgent();
@@ -35,6 +36,7 @@
   TestRunner.domDebuggerModel = target.model(SDK.DOMDebuggerModel);
   TestRunner.cssModel = target.model(SDK.CSSModel);
   TestRunner.cpuProfilerModel = target.model(SDK.CPUProfilerModel);
+  TestRunner.overlayModel = target.model(SDK.OverlayModel);
   TestRunner.serviceWorkerManager = target.model(SDK.ServiceWorkerManager);
   TestRunner.tracingManager = target.model(SDK.TracingManager);
   TestRunner.mainTarget = target;
@@ -732,6 +734,41 @@
   return 'frame';
 };
 
+/**
+ * @param {string} urlSuffix
+ * @param {!Workspace.projectTypes=} projectType
+ * @return {!Promise}
+ */
+TestRunner.waitForUISourceCode = function(urlSuffix, projectType) {
+  /**
+   * @param {!Workspace.UISourceCode} uiSourceCode
+   * @return {boolean}
+   */
+  function matches(uiSourceCode) {
+    if (projectType && uiSourceCode.project().type() !== projectType)
+      return false;
+    if (!projectType && uiSourceCode.project().type() === Workspace.projectTypes.Service)
+      return false;
+    if (urlSuffix && !uiSourceCode.url().endsWith(urlSuffix))
+      return false;
+    return true;
+  }
+
+  for (var uiSourceCode of Workspace.workspace.uiSourceCodes()) {
+    if (urlSuffix && matches(uiSourceCode))
+      return Promise.resolve(uiSourceCode);
+  }
+
+  return TestRunner.waitForEvent(Workspace.Workspace.Events.UISourceCodeAdded, Workspace.workspace, matches);
+};
+
+/**
+ * @param {!Function} callback
+ */
+TestRunner.waitForUISourceCodeRemoved = function(callback) {
+  Workspace.workspace.once(Workspace.Workspace.Events.UISourceCodeRemoved).then(callback);
+};
+
 /** @type {boolean} */
 IntegrationTestRunner._startedTest = false;
 
diff --git a/third_party/WebKit/Source/devtools/front_end/integration_test_runner/PageMockTestRunner.js b/third_party/WebKit/Source/devtools/front_end/integration_test_runner/PageMockTestRunner.js
new file mode 100644
index 0000000..fe125dfb
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/integration_test_runner/PageMockTestRunner.js
@@ -0,0 +1,244 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+var id = 0;
+
+function nextId(prefix) {
+  return (prefix || '') + ++id;
+}
+
+TestRunner.connectToPage = function(targetName, pageMock, makeMainTarget) {
+  var mockTarget = SDK.targetManager.createTarget(
+      nextId('mock-target-'), targetName, pageMock.capabilities(), params => pageMock.createConnection(params));
+
+  if (makeMainTarget) {
+    SDK.targetManager._targets = SDK.targetManager._targets.filter(target => target !== mockTarget);
+    SDK.targetManager._targets.unshift(mockTarget);
+  }
+
+  return mockTarget;
+};
+
+TestRunner.PageMock = class {
+  constructor(url) {
+    this._url = url;
+    this._capabilities = SDK.Target.Capability.DOM | SDK.Target.Capability.JS | SDK.Target.Capability.Browser;
+    this._enabledDomains = new Set();
+
+    this._mainFrame =
+        {id: nextId(), loaderId: nextId(), mimeType: 'text/html', securityOrigin: this._url, url: this._url};
+
+    this._executionContexts = [];
+    this._executionContexts.push(this._createExecutionContext(this._mainFrame, false));
+    this._scripts = [];
+    this._scriptContents = new Map();
+
+    this._dispatchMap = {
+      'Debugger.enable': this._debuggerEnable,
+      'Debugger.getScriptSource': this._debuggerGetScriptSource,
+      'Debugger.setBlackboxPatterns': (id, params) => this._sendResponse(id, {}),
+      'Runtime.enable': this._runtimeEnable,
+      'Page.enable': this._pageEnable,
+      'Page.getResourceTree': this._pageGetResourceTree
+    };
+  }
+
+  capabilities() {
+    return this._capabilities;
+  }
+
+  disableDOMCapability() {
+    this._capabilities = this._capabilities & ~SDK.Target.Capability.DOM;
+  }
+
+  createConnection(params) {
+    this._enabledDomains.clear();
+    this._connection = new MockPageConnection(this, params);
+    return this._connection;
+  }
+
+  evalScript(url, content, isContentScript) {
+    var id = nextId();
+    content += '\n//# sourceURL=' + url;
+    this._scriptContents.set(id, content);
+    var context = this._executionContexts.find(context => context.auxData.isDefault !== isContentScript);
+
+    if (!context) {
+      context = this._createExecutionContext(this._mainFrame, isContentScript);
+
+      this._fireEvent('Runtime.executionContextCreated', {context: context});
+    }
+
+    var text = new TextUtils.Text(content);
+
+    var script = {
+      scriptId: id,
+      url: url,
+      startLine: 0,
+      startColumn: 0,
+      endLine: text.lineCount(),
+      endColumn: text.lineAt(text.lineCount()).length - 1,
+      executionContextId: context.id,
+      hash: String.hashCode(content),
+      executionContextAuxData: context.auxData,
+      sourceMapURL: '',
+      hasSourceURL: true,
+      isLiveEdit: false,
+      isModule: false,
+      length: content.length
+    };
+
+    this._scripts.push(script);
+    this._fireEvent('Debugger.scriptParsed', script);
+  }
+
+  reload() {
+    this._fireEvent('Page.frameStartedLoading', {frameId: this._mainFrame.id});
+
+    for (var context of this._executionContexts)
+      this._fireEvent('Runtime.executionContextDestroyed', {executionContextId: context.id});
+
+
+    this._scripts = [];
+    this._scriptContents.clear();
+    this._executionContexts = [];
+    this._fireEvent('Runtime.executionContextsCleared', {});
+    this._executionContexts.push(this._createExecutionContext(this._mainFrame, false));
+
+    for (var context of this._executionContexts)
+      this._fireEvent('Runtime.executionContextCreated', {context: context});
+
+
+    this._fireEvent('Page.frameNavigated', {frame: this._mainFrame});
+
+    this._fireEvent('Page.loadEventFired', {timestamp: Date.now() / 1000});
+
+    this._fireEvent('Page.frameStoppedLoading', {frameId: this._mainFrame.id});
+
+    this._fireEvent('Page.domContentEventFired', {timestamp: Date.now() / 1000});
+  }
+
+  close() {
+    if (this._connection) {
+      this._connection.disconnect();
+      this._connection = null;
+    }
+  }
+
+  _createExecutionContext(frame, isContentScript) {
+    return {
+      id: nextId(),
+
+      auxData: {isDefault: !isContentScript, frameId: frame.id},
+
+      origin: frame.securityOrigin,
+      name: ''
+    };
+  }
+
+  _debuggerEnable(id, params) {
+    this._enabledDomains.add('Debugger');
+    this._sendResponse(id, {});
+
+    for (var script of this._scripts)
+      this._fireEvent('Debugger.scriptParsed', script);
+  }
+
+  _debuggerGetScriptSource(id, params) {
+    if (!this._scriptContents.has(params.scriptId)) {
+      this._sendResponse(id, undefined, {message: 'Can\'t get script content for id ' + params.scriptId, code: 1});
+
+      return;
+    }
+
+    var result = {scriptSource: this._scriptContents.get(params.scriptId)};
+
+    this._sendResponse(id, result);
+  }
+
+  _runtimeEnable(id, params) {
+    this._enabledDomains.add('Runtime');
+    this._sendResponse(id, {});
+
+    for (var context of this._executionContexts)
+      this._fireEvent('Runtime.executionContextCreated', {context: context});
+  }
+
+  _pageEnable(id, params) {
+    this._enabledDomains.add('Page');
+    this._sendResponse(id, {});
+  }
+
+  _pageGetResourceTree(id, params) {
+    var result = {frameTree: {frame: this._mainFrame, resources: []}};
+
+    this._sendResponse(id, result);
+  }
+
+  _isSupportedDomain(methodName) {
+    var domain = methodName.split('.')[0];
+
+    if (domain === 'Page')
+      return !!(this._capabilities & SDK.Target.Capability.DOM);
+
+    return true;
+  }
+
+  _dispatch(id, methodName, params, message) {
+    var handler = (this._isSupportedDomain(methodName) ? this._dispatchMap[methodName] : null);
+
+    if (handler)
+      return handler.call(this, id, params);
+
+    this._sendResponse(
+        id, undefined,
+        {message: 'Can\'t handle command ' + methodName, code: Protocol.InspectorBackend.DevToolsStubErrorCode});
+  }
+
+  _sendResponse(id, result, error) {
+    var message = {id: id, result: result, error: error};
+
+    this._connection.sendMessageToDevTools(message);
+  }
+
+  _fireEvent(methodName, params) {
+    var domain = methodName.split('.')[0];
+
+    if (!this._enabledDomains.has(domain))
+      return;
+
+    var message = {method: methodName, params: params};
+
+    this._connection.sendMessageToDevTools(message);
+  }
+};
+
+var MockPageConnection = class {
+  constructor(page, params) {
+    this._page = page;
+    this._onMessage = params.onMessage;
+    this._onDisconnect = params.onDisconnect;
+  }
+
+  sendMessageToDevTools(message) {
+    setTimeout(() => this._onMessage.call(null, JSON.stringify(message)), 0);
+  }
+
+  sendMessage(message) {
+    var json = JSON.parse(message);
+    this._page._dispatch(json.id, json.method, json.params, message);
+  }
+
+  disconnect() {
+    this._onDisconnect.call(null, 'force disconnect');
+    this._onDisconnect = null;
+    this._onMessage = null;
+    return Promise.resolve();
+  }
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/integration_test_runner/SyntaxHighlightTestRunner.js b/third_party/WebKit/Source/devtools/front_end/integration_test_runner/SyntaxHighlightTestRunner.js
new file mode 100644
index 0000000..4f44a11
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/integration_test_runner/SyntaxHighlightTestRunner.js
@@ -0,0 +1,28 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+TestRunner.dumpSyntaxHighlight = function(str, mimeType) {
+  var node = document.createElement('span');
+  node.textContent = str;
+  var javascriptSyntaxHighlighter = new UI.SyntaxHighlighter(mimeType);
+  return javascriptSyntaxHighlighter.syntaxHighlightNode(node).then(dumpSyntax);
+
+  function dumpSyntax() {
+    var node_parts = [];
+
+    for (var i = 0; i < node.childNodes.length; i++) {
+      if (node.childNodes[i].getAttribute)
+        node_parts.push(node.childNodes[i].getAttribute('class'));
+      else
+        node_parts.push('*');
+    }
+
+    TestRunner.addResult(str + ': ' + node_parts.join(', '));
+  }
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/integration_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/integration_test_runner/module.json
index 511866b..6d8d3747 100644
--- a/third_party/WebKit/Source/devtools/front_end/integration_test_runner/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/integration_test_runner/module.json
@@ -2,9 +2,16 @@
   "dependencies": [
     "test_runner",
     "sdk",
-    "network_log"
+    "network_log",
+    "workspace"
   ],
   "scripts": [
-    "IntegrationTestRunner.js"
+    "IntegrationTestRunner.js",
+    "PageMockTestRunner.js",
+    "SyntaxHighlightTestRunner.js"
+  ],
+  "skip_compilation": [
+    "PageMockTestRunner.js",
+    "SyntaxHighlightTestRunner.js"
   ]
 }
diff --git a/third_party/WebKit/Source/devtools/front_end/layers_test_runner/LayersTestRunner.js b/third_party/WebKit/Source/devtools/front_end/layers_test_runner/LayersTestRunner.js
new file mode 100644
index 0000000..64dda2c6
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/layers_test_runner/LayersTestRunner.js
@@ -0,0 +1,157 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+LayersTestRunner.layerTreeModel = function() {
+  if (!LayersTestRunner._layerTreeModel)
+    LayersTestRunner._layerTreeModel = TestRunner.mainTarget.model(Layers.LayerTreeModel);
+
+  return LayersTestRunner._layerTreeModel;
+};
+
+LayersTestRunner.labelForLayer = function(layer) {
+  var node = layer.nodeForSelfOrAncestor();
+  var label = (node ? Components.DOMPresentationUtils.fullQualifiedSelector(node, false) : '<invalid node id>');
+  var height = layer.height();
+  var width = layer.width();
+
+  if (height <= 200 && width <= 200)
+    label += ' ' + height + 'x' + width;
+
+  if (typeof layer.__extraData !== 'undefined')
+    label += ' (' + layer.__extraData + ')';
+
+  return label;
+};
+
+LayersTestRunner.dumpLayerTree = function(prefix, root) {
+  if (!prefix)
+    prefix = '';
+
+  if (!root) {
+    root = LayersTestRunner.layerTreeModel().layerTree().contentRoot();
+
+    if (!root) {
+      TestRunner.addResult('No layer root, perhaps not in the composited mode! ');
+      TestRunner.completeTest();
+      return;
+    }
+  }
+
+  TestRunner.addResult(prefix + LayersTestRunner.labelForLayer(root));
+  root.children().forEach(LayersTestRunner.dumpLayerTree.bind(LayersTestRunner, prefix + '    '));
+};
+
+LayersTestRunner.dumpLayers3DView = function(prefix, root) {
+  if (!prefix)
+    prefix = '';
+
+  if (!root)
+    root = UI.panels.layers._layers3DView._rotatingContainerElement;
+
+  if (root.__layer)
+    TestRunner.addResult(prefix + LayersTestRunner.labelForLayer(root.__layer));
+
+  for (var element = root.firstElementChild; element; element = element.nextSibling)
+    LayersTestRunner.dumpLayers3DView(prefix + '    ', element);
+};
+
+LayersTestRunner.evaluateAndRunWhenTreeChanges = function(expression, callback) {
+  function eventHandler() {
+    LayersTestRunner.layerTreeModel().removeEventListener(Layers.LayerTreeModel.Events.LayerTreeChanged, eventHandler);
+    callback();
+  }
+
+  TestRunner.evaluateInPage(expression, function() {
+    LayersTestRunner.layerTreeModel().addEventListener(Layers.LayerTreeModel.Events.LayerTreeChanged, eventHandler);
+  });
+};
+
+LayersTestRunner.findLayerByNodeIdAttribute = function(nodeIdAttribute) {
+  var result;
+
+  function testLayer(layer) {
+    var node = layer.node();
+
+    if (!node)
+      return false;
+
+    if (!node || node.getAttribute('id') !== nodeIdAttribute)
+      return false;
+
+    result = layer;
+    return true;
+  }
+
+  LayersTestRunner.layerTreeModel().layerTree().forEachLayer(testLayer);
+
+  if (!result)
+    TestRunner.addResult('ERROR: No layer for ' + nodeIdAttribute);
+
+  return result;
+};
+
+LayersTestRunner.requestLayers = function(callback) {
+  LayersTestRunner.layerTreeModel().addEventListener(Layers.LayerTreeModel.Events.LayerTreeChanged, onLayerTreeChanged);
+  LayersTestRunner.layerTreeModel().enable();
+
+  function onLayerTreeChanged() {
+    LayersTestRunner.layerTreeModel().removeEventListener(
+        Layers.LayerTreeModel.Events.LayerTreeChanged, onLayerTreeChanged);
+    callback();
+  }
+};
+
+LayersTestRunner.dumpModelScrollRects = function() {
+  function dumpScrollRectsForLayer(layer) {
+    if (layer._scrollRects.length > 0)
+      TestRunner.addObject(layer._scrollRects);
+  }
+
+  TestRunner.addResult('Model elements dump');
+  LayersTestRunner.layerTreeModel().layerTree().forEachLayer(dumpScrollRectsForLayer.bind(this));
+};
+
+LayersTestRunner.dumpModelStickyPositionConstraint = function() {
+  function dumpModelStickyPositionConstraintForLayer(layer) {
+    var stickyFormatters = {
+      '_nearestLayerShiftingContainingBlock': 'formatAsTypeNameOrNull',
+      '_nearestLayerShiftingStickyBox': 'formatAsTypeNameOrNull'
+    };
+
+    if (layer._stickyPositionConstraint)
+      TestRunner.addObject(layer._stickyPositionConstraint, stickyFormatters);
+  }
+
+  TestRunner.addResult('Model elements dump');
+  LayersTestRunner.layerTreeModel().layerTree().forEachLayer(dumpModelStickyPositionConstraintForLayer.bind(this));
+};
+
+LayersTestRunner.dispatchMouseEvent = function(eventType, button, element, offsetX, offsetY) {
+  var totalOffset = element.totalOffset();
+
+  var eventArguments = {
+    bubbles: true,
+    cancelable: true,
+    view: window,
+    screenX: totalOffset.left - element.scrollLeft + offsetX,
+    screenY: totalOffset.top - element.scrollTop + offsetY,
+    clientX: totalOffset.left + offsetX,
+    clientY: totalOffset.top + offsetY,
+    button: button
+  };
+
+  if (eventType === 'mouseout') {
+    eventArguments.screenX = 0;
+    eventArguments.screenY = 0;
+    eventArguments.clientX = 0;
+    eventArguments.clientY = 0;
+  }
+
+  element.dispatchEvent(new MouseEvent(eventType, eventArguments));
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/layers_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/layers_test_runner/module.json
new file mode 100644
index 0000000..a76d127
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/layers_test_runner/module.json
@@ -0,0 +1,14 @@
+{
+  "dependencies": [
+    "test_runner",
+    "integration_test_runner",
+    "layers",
+    "components"
+  ],
+  "scripts": [
+    "LayersTestRunner.js"
+  ],
+  "skip_compilation": [
+    "LayersTestRunner.js"
+  ]
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/network_test_runner/NetworkTestRunner.js b/third_party/WebKit/Source/devtools/front_end/network_test_runner/NetworkTestRunner.js
new file mode 100644
index 0000000..eaf0454
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/network_test_runner/NetworkTestRunner.js
@@ -0,0 +1,225 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+NetworkTestRunner.waitForRequestResponse = function(request) {
+  if (request.responseReceivedTime !== -1)
+    return Promise.resolve(request);
+
+  return TestRunner.waitForEvent(
+      SDK.NetworkManager.Events.RequestUpdated, TestRunner.networkManager,
+      updateRequest => updateRequest === request && request.responseReceivedTime !== -1);
+};
+
+NetworkTestRunner.waitForNetworkLogViewNodeForRequest = function(request) {
+  var networkLogView = UI.panels.network._networkLogView;
+  var node = networkLogView.nodeForRequest(request);
+
+  if (node)
+    return Promise.resolve(node);
+
+  console.assert(networkLogView._staleRequests.has(request));
+
+  return TestRunner.addSnifferPromise(networkLogView, '_didRefreshForTest').then(() => {
+    var node = networkLogView.nodeForRequest(request);
+    console.assert(node);
+    return node;
+  });
+};
+
+NetworkTestRunner.waitForWebsocketFrameReceived = function(wsRequest, message) {
+  for (var frame of wsRequest.frames()) {
+    if (checkFrame(frame))
+      return Promise.resolve(frame);
+  }
+
+  return TestRunner.waitForEvent(SDK.NetworkRequest.Events.WebsocketFrameAdded, wsRequest, checkFrame);
+
+  function checkFrame(frame) {
+    return frame.type === SDK.NetworkRequest.WebSocketFrameType.Receive && frame.text === message;
+  }
+};
+
+NetworkTestRunner.recordNetwork = function() {
+  UI.panels.network._networkLogView.setRecording(true);
+};
+
+NetworkTestRunner.networkRequests = function() {
+  return Array.from(NetworkLog.networkLog.requests());
+};
+
+NetworkTestRunner.dumpNetworkRequests = function() {
+  var requests = NetworkTestRunner.networkRequests();
+
+  requests.sort(function(a, b) {
+    return a.url().localeCompare(b.url());
+  });
+
+  TestRunner.addResult('resources count = ' + requests.length);
+
+  for (i = 0; i < requests.length; i++)
+    TestRunner.addResult(requests[i].url());
+};
+
+NetworkTestRunner.findRequestsByURLPattern = function(urlPattern) {
+  return NetworkTestRunner.networkRequests().filter(function(value) {
+    return urlPattern.test(value.url());
+  });
+};
+
+NetworkTestRunner.makeSimpleXHR = function(method, url, async, callback) {
+  NetworkTestRunner.makeXHR(method, url, async, undefined, undefined, [], false, undefined, undefined, callback);
+};
+
+NetworkTestRunner.makeSimpleXHRWithPayload = function(method, url, async, payload, callback) {
+  NetworkTestRunner.makeXHR(method, url, async, undefined, undefined, [], false, payload, undefined, callback);
+};
+
+NetworkTestRunner.makeXHR = function(
+    method, url, async, user, password, headers, withCredentials, payload, type, callback) {
+  var args = {};
+  args.method = method;
+  args.url = url;
+  args.async = async;
+  args.user = user;
+  args.password = password;
+  args.headers = headers;
+  args.withCredentials = withCredentials;
+  args.payload = payload;
+  args.type = type;
+  var jsonArgs = JSON.stringify(args).replace(/\"/g, '\\"');
+
+  function innerCallback(msg) {
+    if (msg.messageText.indexOf('XHR loaded') !== -1) {
+      if (callback)
+        callback();
+    } else {
+      ConsoleTestRunner.addConsoleSniffer(innerCallback);
+    }
+  }
+
+  ConsoleTestRunner.addConsoleSniffer(innerCallback);
+  TestRunner.evaluateInPage('makeXHRForJSONArguments("' + jsonArgs + '")');
+};
+
+NetworkTestRunner.makeFetch = function(url, requestInitializer, callback) {
+  TestRunner.callFunctionInPageAsync('makeFetch', [url, requestInitializer]).then(callback);
+};
+
+NetworkTestRunner.makeFetchInWorker = function(url, requestInitializer, callback) {
+  TestRunner.callFunctionInPageAsync('makeFetchInWorker', [url, requestInitializer]).then(callback);
+};
+
+NetworkTestRunner.clearNetworkCache = function() {
+  var networkAgent = TestRunner.NetworkAgent;
+  var promise = networkAgent.setCacheDisabled(true);
+  return promise.then(() => networkAgent.setCacheDisabled(false));
+};
+
+NetworkTestRunner.HARPropertyFormatters = {
+  bodySize: 'formatAsTypeName',
+  compression: 'formatAsTypeName',
+  connection: 'formatAsTypeName',
+  headers: 'formatAsTypeName',
+  headersSize: 'formatAsTypeName',
+  id: 'formatAsTypeName',
+  onContentLoad: 'formatAsTypeName',
+  onLoad: 'formatAsTypeName',
+  receive: 'formatAsTypeName',
+  startedDateTime: 'formatAsRecentTime',
+  time: 'formatAsTypeName',
+  timings: 'formatAsTypeName',
+  version: 'formatAsTypeName',
+  wait: 'formatAsTypeName',
+  _transferSize: 'formatAsTypeName',
+  _error: 'skip'
+};
+
+NetworkTestRunner.HARPropertyFormattersWithSize = JSON.parse(JSON.stringify(NetworkTestRunner.HARPropertyFormatters));
+NetworkTestRunner.HARPropertyFormattersWithSize.size = 'formatAsTypeName';
+
+(async function() {
+  await TestRunner.evaluateInPagePromise(`
+    var lastXHRIndex = 0;
+
+    function xhrLoadedCallback() {
+      console.log('XHR loaded: ' + ++lastXHRIndex);
+    }
+
+    function makeSimpleXHR(method, url, async, callback) {
+      makeSimpleXHRWithPayload(method, url, async, null, callback);
+    }
+
+    function makeSimpleXHRWithPayload(method, url, async, payload, callback) {
+      makeXHR(method, url, async, undefined, undefined, [], false, payload, callback);
+    }
+
+    function makeXHR(method, url, async, user, password, headers, withCredentials, payload, type, callback) {
+      var xhr = new XMLHttpRequest();
+
+      if (type == undefined)
+        xhr.responseType = '';
+      else
+        xhr.responseType = type;
+
+      xhr.onreadystatechange = function() {
+        if (xhr.readyState === XMLHttpRequest.DONE) {
+          if (typeof callback === 'function')
+            callback();
+        }
+      };
+
+      xhr.open(method, url, async, user, password);
+      xhr.withCredentials = withCredentials;
+
+      for (var i = 0; i < headers.length; ++i)
+        xhr.setRequestHeader(headers[i][0], headers[i][1]);
+
+      xhr.send(payload);
+    }
+
+    function makeXHRForJSONArguments(jsonArgs) {
+      var args = JSON.parse(jsonArgs);
+
+      makeXHR(
+        args.method,
+        args.url,
+        args.async,
+        args.user,
+        args.password,
+        args.headers || [],
+        args.withCredentials,
+        args.payload,
+        args.type,
+        xhrLoadedCallback
+      );
+    }
+
+    function makeFetch(url, requestInitializer) {
+      return fetch(url, requestInitializer).then(res => {
+        res.text();
+        return res;
+      }).catch(e => e);
+    }
+
+    function makeFetchInWorker(url, requestInitializer) {
+      return new Promise(resolve => {
+        var worker = new Worker('/inspector/network/resources/fetch-worker.js');
+
+        worker.onmessage = event => {
+          resolve(event.data);
+        };
+
+        worker.postMessage({
+          url: url,
+          init: requestInitializer
+        });
+      });
+    }
+  `);
+})();
diff --git a/third_party/WebKit/Source/devtools/front_end/network_test_runner/ProductRegistryTestRunner.js b/third_party/WebKit/Source/devtools/front_end/network_test_runner/ProductRegistryTestRunner.js
new file mode 100644
index 0000000..9f6fb50
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/network_test_runner/ProductRegistryTestRunner.js
@@ -0,0 +1,39 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+NetworkTestRunner.resetProductRegistry = function() {
+  TestRunner.addResult('Cleared ProductRegistryImpl');
+  ProductRegistryImpl._productsByDomainHash.clear();
+};
+
+NetworkTestRunner.addProductRegistryEntry = function(domainPattern, productName, type) {
+  TestRunner.addResult('Adding entry: ' + domainPattern);
+  var wildCardPosition = domainPattern.indexOf('*');
+  var prefix = '';
+
+  if (wildCardPosition === -1) {
+  } else if (wildCardPosition === 0) {
+    prefix = '*';
+    console.assert(domainPattern.substr(1, 1) === '.', 'Domain pattern wildcard must be followed by \'.\'');
+    domainPattern = domainPattern.substr(2);
+  } else {
+    prefix = domainPattern.substr(0, wildCardPosition);
+    console.assert(
+        domainPattern.substr(wildCardPosition + 1, 1) === '.', 'Domain pattern wildcard must be followed by \'.\'');
+    domainPattern = domainPattern.substr(wildCardPosition + 2);
+  }
+
+  console.assert(domainPattern.indexOf('*') === -1, 'Domain pattern may only have 1 wildcard.');
+  var prefixes = {};
+
+  prefixes[prefix] = {product: 0, type: type};
+
+  ProductRegistryImpl.register(
+      [productName], [{hash: ProductRegistryImpl._hashForDomain(domainPattern), prefixes: prefixes}]);
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/network_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/network_test_runner/module.json
new file mode 100644
index 0000000..82029ea
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/network_test_runner/module.json
@@ -0,0 +1,16 @@
+{
+  "dependencies": [
+    "test_runner",
+    "integration_test_runner",
+    "product_registry_impl",
+    "console_test_runner"
+  ],
+  "scripts": [
+    "NetworkTestRunner.js",
+    "ProductRegistryTestRunner.js"
+  ],
+  "skip_compilation": [
+    "NetworkTestRunner.js",
+    "ProductRegistryTestRunner.js"
+  ]
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/performance_test_runner/TimelineDataTestRunner.js b/third_party/WebKit/Source/devtools/front_end/performance_test_runner/TimelineDataTestRunner.js
new file mode 100644
index 0000000..6f53685
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/performance_test_runner/TimelineDataTestRunner.js
@@ -0,0 +1,5363 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+PerformanceTestRunner.timelineData = function() {
+  return JSON.stringify([
+    {
+      'args': {'number': 32},
+
+      'cat': '__metadata',
+      'name': 'num_cpus',
+      'ph': 'M',
+      'pid': 3840,
+      'tid': 0,
+      'ts': 0
+    },
+    {
+      'args': {'sort_index': -5},
+
+      'cat': '__metadata',
+      'name': 'process_sort_index',
+      'ph': 'M',
+      'pid': 3840,
+      'tid': 12,
+      'ts': 0
+    },
+    {
+      'args': {'name': 'Renderer'},
+
+      'cat': '__metadata',
+      'name': 'process_name',
+      'ph': 'M',
+      'pid': 3840,
+      'tid': 12,
+      'ts': 0
+    },
+    {
+      'args': {'sort_index': -1},
+
+      'cat': '__metadata',
+      'name': 'thread_sort_index',
+      'ph': 'M',
+      'pid': 3840,
+      'tid': 11,
+      'ts': 0
+    },
+    {
+      'args': {'sessionId': '9.4'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'TracingStartedInPage',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673092068,
+      'tts': 170409
+    },
+    {
+      'args': {'layerTreeId': 1, 'sessionId': '9.4'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'SetLayerTreeId',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673092082,
+      'tts': 170421
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673092095,
+      'tts': 170434
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673107791,
+      'tts': 170482
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673107799,
+      'tts': 170490
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 438}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 65,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 64,
+      'tid': 9,
+      'ts': 1122673107821,
+      'tts': 170511
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 27,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 26,
+      'tid': 9,
+      'ts': 1122673107849,
+      'tts': 170539
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 439}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673107869,
+      'tts': 170559
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2688936, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673107883,
+      'tts': 170573
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673107891,
+      'tts': 170581
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673107921,
+      'tts': 170612
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673107934,
+      'tts': 170624
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673107941,
+      'tts': 170631
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673126470,
+      'tts': 170708
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673126480,
+      'tts': 170717
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 439}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 108,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 107,
+      'tid': 9,
+      'ts': 1122673126522,
+      'tts': 170759
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 47,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 46,
+      'tid': 9,
+      'ts': 1122673126569,
+      'tts': 170806
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 440}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673126606,
+      'tts': 170843
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2688952, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673126627,
+      'tts': 170864
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673126637,
+      'tts': 170874
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673126683,
+      'tts': 170920
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673126699,
+      'tts': 170936
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673126708,
+      'tts': 170944
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673141177,
+      'tts': 171002
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673141186,
+      'tts': 171010
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 440}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 110,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 109,
+      'tid': 9,
+      'ts': 1122673141212,
+      'tts': 171036
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 46,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 43,
+      'tid': 9,
+      'ts': 1122673141259,
+      'tts': 171084
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 441}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673141293,
+      'tts': 171117
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2688968, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673141318,
+      'tts': 171142
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673141329,
+      'tts': 171154
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673141379,
+      'tts': 171204
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673141406,
+      'tts': 171231
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673141421,
+      'tts': 171246
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673162929,
+      'tts': 171304
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673162938,
+      'tts': 171313
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 441}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 98,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 97,
+      'tid': 9,
+      'ts': 1122673162975,
+      'tts': 171350
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 41,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 39,
+      'tid': 9,
+      'ts': 1122673163020,
+      'tts': 171395
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 442}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673163051,
+      'tts': 171426
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2688984, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673163070,
+      'tts': 171445
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673163081,
+      'tts': 171455
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673163119,
+      'tts': 171493
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673163133,
+      'tts': 171508
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673163141,
+      'tts': 171516
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673179592,
+      'tts': 171569
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673179600,
+      'tts': 171576
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 442}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 77,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 76,
+      'tid': 9,
+      'ts': 1122673179625,
+      'tts': 171601
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 31,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 31,
+      'tid': 9,
+      'ts': 1122673179660,
+      'tts': 171635
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 443}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673179683,
+      'tts': 171659
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689000, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673179699,
+      'tts': 171675
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673179707,
+      'tts': 171682
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673179736,
+      'tts': 171711
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673179751,
+      'tts': 171727
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673179759,
+      'tts': 171735
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673196258,
+      'tts': 171788
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673196265,
+      'tts': 171794
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 443}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 73,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 72,
+      'tid': 9,
+      'ts': 1122673196291,
+      'tts': 171820
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 30,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 29,
+      'tid': 9,
+      'ts': 1122673196323,
+      'tts': 171852
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 444}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673196346,
+      'tts': 171875
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689016, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673196361,
+      'tts': 171890
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673196370,
+      'tts': 171899
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673196402,
+      'tts': 171931
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673196417,
+      'tts': 171946
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673196425,
+      'tts': 171954
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673213043,
+      'tts': 172016
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122673107747,
+      'tts': 77989
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122673107777,
+      'tts': 78018
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122673126358,
+      'tts': 78708
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122673126413,
+      'tts': 78760
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122673141111,
+      'tts': 78880
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122673141133,
+      'tts': 78902
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122673162867,
+      'tts': 79126
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122673162886,
+      'tts': 79145
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122673179534,
+      'tts': 79253
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122673179551,
+      'tts': 79269
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673313423,
+      'tts': 174171
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673313452,
+      'tts': 174200
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673313467,
+      'tts': 174215
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673329958,
+      'tts': 174302
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673329971,
+      'tts': 174314
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 451}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 98,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 96,
+      'tid': 9,
+      'ts': 1122673330000,
+      'tts': 174343
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 44,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 41,
+      'tid': 9,
+      'ts': 1122673330035,
+      'tts': 174379
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 452}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673330066,
+      'tts': 174409
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689144, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673330092,
+      'tts': 174435
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673330106,
+      'tts': 174450
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673330151,
+      'tts': 174495
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673330180,
+      'tts': 174523
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673330194,
+      'tts': 174538
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673346680,
+      'tts': 174624
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673346692,
+      'tts': 174635
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 452}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 98,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 96,
+      'tid': 9,
+      'ts': 1122673346721,
+      'tts': 174664
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 45,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 43,
+      'tid': 9,
+      'ts': 1122673346756,
+      'tts': 174699
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 453}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673346787,
+      'tts': 174730
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689160, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673346813,
+      'tts': 174756
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673346827,
+      'tts': 174770
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673346871,
+      'tts': 174814
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673346900,
+      'tts': 174843
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673346914,
+      'tts': 174857
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673363348,
+      'tts': 174943
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673363361,
+      'tts': 174954
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 453}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 98,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 95,
+      'tid': 9,
+      'ts': 1122673363390,
+      'tts': 174984
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 45,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 42,
+      'tid': 9,
+      'ts': 1122673363425,
+      'tts': 175019
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 454}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673363456,
+      'tts': 175050
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689176, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673363482,
+      'tts': 175075
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673363496,
+      'tts': 175090
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673363540,
+      'tts': 175134
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673363569,
+      'tts': 175163
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673363584,
+      'tts': 175177
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673380043,
+      'tts': 175286
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673380057,
+      'tts': 175299
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 454}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 99,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 97,
+      'tid': 9,
+      'ts': 1122673380086,
+      'tts': 175328
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 45,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 42,
+      'tid': 9,
+      'ts': 1122673380122,
+      'tts': 175364
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 455}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673380153,
+      'tts': 175396
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689192, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673380179,
+      'tts': 175421
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673380194,
+      'tts': 175436
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673380238,
+      'tts': 175480
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673380266,
+      'tts': 175508
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673380281,
+      'tts': 175523
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673396686,
+      'tts': 175611
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673396699,
+      'tts': 175622
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 455}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 99,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 96,
+      'tid': 9,
+      'ts': 1122673396735,
+      'tts': 175659
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 44,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 42,
+      'tid': 9,
+      'ts': 1122673396771,
+      'tts': 175694
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 456}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673396802,
+      'tts': 175725
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689208, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673396828,
+      'tts': 175751
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673396842,
+      'tts': 175765
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673396886,
+      'tts': 175810
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673396915,
+      'tts': 175838
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673396930,
+      'tts': 175853
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673413345,
+      'tts': 175940
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673413358,
+      'tts': 175952
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674113927,
+      'tts': 89784
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674113950,
+      'tts': 89806
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674130606,
+      'tts': 89979
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674130629,
+      'tts': 90001
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674147273,
+      'tts': 90157
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674147296,
+      'tts': 90179
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674163929,
+      'tts': 90337
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674163951,
+      'tts': 90358
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673747387,
+      'tts': 182445
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 476}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 100,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 97,
+      'tid': 9,
+      'ts': 1122673747439,
+      'tts': 182498
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 45,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 42,
+      'tid': 9,
+      'ts': 1122673747475,
+      'tts': 182534
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 477}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673747507,
+      'tts': 182565
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689544, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673747532,
+      'tts': 182591
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673747547,
+      'tts': 182605
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673747592,
+      'tts': 182650
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673747621,
+      'tts': 182680
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673747636,
+      'tts': 182694
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673764047,
+      'tts': 182781
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673764060,
+      'tts': 182792
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 477}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 99,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 97,
+      'tid': 9,
+      'ts': 1122673764089,
+      'tts': 182821
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 45,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 42,
+      'tid': 9,
+      'ts': 1122673764125,
+      'tts': 182858
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 478}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673764156,
+      'tts': 182889
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689560, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673764182,
+      'tts': 182914
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673764196,
+      'tts': 182929
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673764241,
+      'tts': 182973
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673764268,
+      'tts': 183001
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673764283,
+      'tts': 183015
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673780702,
+      'tts': 183103
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673780715,
+      'tts': 183114
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 478}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 106,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 104,
+      'tid': 9,
+      'ts': 1122673780744,
+      'tts': 183143
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 44,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 42,
+      'tid': 9,
+      'ts': 1122673780787,
+      'tts': 183186
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 479}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673780818,
+      'tts': 183217
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689576, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673780844,
+      'tts': 183243
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673780858,
+      'tts': 183257
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673780902,
+      'tts': 183302
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673780932,
+      'tts': 183331
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673780946,
+      'tts': 183346
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673797374,
+      'tts': 183434
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673797387,
+      'tts': 183445
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 479}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 106,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 104,
+      'tid': 9,
+      'ts': 1122673797416,
+      'tts': 183475
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 45,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 42,
+      'tid': 9,
+      'ts': 1122673797458,
+      'tts': 183517
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 480}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673797489,
+      'tts': 183548
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689592, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673797516,
+      'tts': 183575
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673797530,
+      'tts': 183589
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673797575,
+      'tts': 183633
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673797604,
+      'tts': 183662
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673797618,
+      'tts': 183677
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673814044,
+      'tts': 183764
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673814056,
+      'tts': 183776
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 480}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 98,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 96,
+      'tid': 9,
+      'ts': 1122673814086,
+      'tts': 183805
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 45,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 43,
+      'tid': 9,
+      'ts': 1122673814121,
+      'tts': 183840
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 481}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673814153,
+      'tts': 183872
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689608, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673814178,
+      'tts': 183897
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673814193,
+      'tts': 183912
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673814237,
+      'tts': 183956
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673814265,
+      'tts': 183985
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673814280,
+      'tts': 183999
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673830696,
+      'tts': 184086
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673830709,
+      'tts': 184097
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 481}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 99,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 97,
+      'tid': 9,
+      'ts': 1122673830738,
+      'tts': 184126
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 45,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 42,
+      'tid': 9,
+      'ts': 1122673830774,
+      'tts': 184163
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 482}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673830806,
+      'tts': 184194
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689624, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673830831,
+      'tts': 184219
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673830846,
+      'tts': 184234
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673830890,
+      'tts': 184278
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673830917,
+      'tts': 184305
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673830932,
+      'tts': 184320
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122673847325,
+      'tts': 184405
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122673847337,
+      'tts': 184417
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674030729,
+      'tts': 188070
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 493}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 98,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 96,
+      'tid': 9,
+      'ts': 1122674030758,
+      'tts': 188099
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 44,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 42,
+      'tid': 9,
+      'ts': 1122674030794,
+      'tts': 188135
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 494}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674030825,
+      'tts': 188166
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689816, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674030850,
+      'tts': 188191
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674030864,
+      'tts': 188205
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674030908,
+      'tts': 188249
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674030937,
+      'tts': 188278
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674030951,
+      'tts': 188292
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674047345,
+      'tts': 188381
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674047358,
+      'tts': 188393
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 494}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 98,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 96,
+      'tid': 9,
+      'ts': 1122674047387,
+      'tts': 188422
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 45,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 43,
+      'tid': 9,
+      'ts': 1122674047422,
+      'tts': 188457
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 495}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674047453,
+      'tts': 188489
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689832, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674047479,
+      'tts': 188514
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674047493,
+      'tts': 188528
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674047538,
+      'tts': 188573
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674047566,
+      'tts': 188601
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674047580,
+      'tts': 188615
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674064041,
+      'tts': 188723
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674064054,
+      'tts': 188735
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 495}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 114,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 112,
+      'tid': 9,
+      'ts': 1122674064084,
+      'tts': 188765
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 60,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 57,
+      'tid': 9,
+      'ts': 1122674064120,
+      'tts': 188801
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 496}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674064166,
+      'tts': 188847
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689848, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674064192,
+      'tts': 188873
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674064207,
+      'tts': 188888
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674064252,
+      'tts': 188933
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674064279,
+      'tts': 188960
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674064293,
+      'tts': 188974
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674080701,
+      'tts': 189063
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674080714,
+      'tts': 189075
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 496}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 112,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 110,
+      'tid': 9,
+      'ts': 1122674080743,
+      'tts': 189104
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 46,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 44,
+      'tid': 9,
+      'ts': 1122674080791,
+      'tts': 189152
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 497}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674080823,
+      'tts': 189185
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689864, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674080849,
+      'tts': 189210
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674080864,
+      'tts': 189225
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674080908,
+      'tts': 189269
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674080936,
+      'tts': 189297
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674080950,
+      'tts': 189312
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674097365,
+      'tts': 189401
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674097378,
+      'tts': 189412
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 497}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 97,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 95,
+      'tid': 9,
+      'ts': 1122674097407,
+      'tts': 189441
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 43,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 42,
+      'tid': 9,
+      'ts': 1122674097443,
+      'tts': 189477
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 498}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674097473,
+      'tts': 189507
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689880, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674097498,
+      'tts': 189532
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674097513,
+      'tts': 189547
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674097556,
+      'tts': 189591
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674097585,
+      'tts': 189619
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674097599,
+      'tts': 189634
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674114019,
+      'tts': 189724
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674114032,
+      'tts': 189735
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 498}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 97,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 95,
+      'tid': 9,
+      'ts': 1122674114061,
+      'tts': 189765
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 45,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 42,
+      'tid': 9,
+      'ts': 1122674114096,
+      'tts': 189800
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 499}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674114127,
+      'tts': 189830
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689896, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674114153,
+      'tts': 189856
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674114167,
+      'tts': 189870
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674114211,
+      'tts': 189914
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674114239,
+      'tts': 189942
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674114253,
+      'tts': 189957
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674130694,
+      'tts': 190042
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674130707,
+      'tts': 190054
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 499}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 98,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 95,
+      'tid': 9,
+      'ts': 1122674130736,
+      'tts': 190084
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 44,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 42,
+      'tid': 9,
+      'ts': 1122674130772,
+      'tts': 190119
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 500}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674130802,
+      'tts': 190150
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689912, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674130828,
+      'tts': 190175
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674130842,
+      'tts': 190189
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674130887,
+      'tts': 190234
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674130914,
+      'tts': 190262
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674130929,
+      'tts': 190276
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674147364,
+      'tts': 190365
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674147377,
+      'tts': 190376
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 500}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 111,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 109,
+      'tid': 9,
+      'ts': 1122674147406,
+      'tts': 190406
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 47,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 44,
+      'tid': 9,
+      'ts': 1122674147452,
+      'tts': 190453
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 501}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674147486,
+      'tts': 190486
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689928, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674147511,
+      'tts': 190511
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674147526,
+      'tts': 190526
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674147570,
+      'tts': 190570
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674147598,
+      'tts': 190598
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674147613,
+      'tts': 190613
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674164055,
+      'tts': 190720
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674164068,
+      'tts': 190732
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 501}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 113,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 111,
+      'tid': 9,
+      'ts': 1122674164097,
+      'tts': 190761
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 46,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 44,
+      'tid': 9,
+      'ts': 1122674164146,
+      'tts': 190810
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 502}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674164178,
+      'tts': 190842
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689944, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674164204,
+      'tts': 190868
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674164219,
+      'tts': 190883
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674164263,
+      'tts': 190927
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674164312,
+      'tts': 190976
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674164327,
+      'tts': 190991
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674180694,
+      'tts': 191071
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674180707,
+      'tts': 191083
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 502}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 111,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 109,
+      'tid': 9,
+      'ts': 1122674180736,
+      'tts': 191112
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 46,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 43,
+      'tid': 9,
+      'ts': 1122674180783,
+      'tts': 191160
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 503}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674180816,
+      'tts': 191192
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689960, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674180841,
+      'tts': 191217
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674180855,
+      'tts': 191232
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674180899,
+      'tts': 191276
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674180928,
+      'tts': 191305
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674180943,
+      'tts': 191319
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674197354,
+      'tts': 191407
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674197367,
+      'tts': 191418
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 503}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 98,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 96,
+      'tid': 9,
+      'ts': 1122674197396,
+      'tts': 191447
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 45,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 42,
+      'tid': 9,
+      'ts': 1122674197431,
+      'tts': 191483
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 504}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674197462,
+      'tts': 191514
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689976, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674197487,
+      'tts': 191539
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674197502,
+      'tts': 191553
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674197546,
+      'tts': 191598
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674197590,
+      'tts': 191642
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674197606,
+      'tts': 191657
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674214025,
+      'tts': 191747
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674214038,
+      'tts': 191759
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 504}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 111,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 110,
+      'tid': 9,
+      'ts': 1122674214067,
+      'tts': 191788
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 45,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 43,
+      'tid': 9,
+      'ts': 1122674214115,
+      'tts': 191836
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 505}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674214147,
+      'tts': 191868
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2689992, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674214173,
+      'tts': 191894
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674214187,
+      'tts': 191908
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674214232,
+      'tts': 191953
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674214259,
+      'tts': 191981
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674214274,
+      'tts': 191995
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674230673,
+      'tts': 192083
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674230686,
+      'tts': 192095
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 505}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 125,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 123,
+      'tid': 9,
+      'ts': 1122674230716,
+      'tts': 192124
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 48,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 46,
+      'tid': 9,
+      'ts': 1122674230775,
+      'tts': 192183
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 506}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674230809,
+      'tts': 192217
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2690008, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674230835,
+      'tts': 192243
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674230849,
+      'tts': 192258
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674230894,
+      'tts': 192303
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674230924,
+      'tts': 192332
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674230938,
+      'tts': 192347
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674247362,
+      'tts': 192436
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674247374,
+      'tts': 192447
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 506}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 97,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 95,
+      'tid': 9,
+      'ts': 1122674247403,
+      'tts': 192476
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 43,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 41,
+      'tid': 9,
+      'ts': 1122674247439,
+      'tts': 192512
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 507}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674247469,
+      'tts': 192543
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2690024, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674247494,
+      'tts': 192567
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674247509,
+      'tts': 192582
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674247553,
+      'tts': 192626
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674247581,
+      'tts': 192655
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674247596,
+      'tts': 192669
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674264048,
+      'tts': 192774
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674264062,
+      'tts': 192786
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 507}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 99,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 97,
+      'tid': 9,
+      'ts': 1122674264091,
+      'tts': 192815
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 45,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 42,
+      'tid': 9,
+      'ts': 1122674264127,
+      'tts': 192851
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 508}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674264158,
+      'tts': 192883
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2690040, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674264184,
+      'tts': 192908
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674264199,
+      'tts': 192923
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674264243,
+      'tts': 192967
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674264272,
+      'tts': 192996
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674264286,
+      'tts': 193010
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674280687,
+      'tts': 193099
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674180599,
+      'tts': 90536
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674180634,
+      'tts': 90570
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674197265,
+      'tts': 90728
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674197288,
+      'tts': 90750
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674213934,
+      'tts': 90908
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674213956,
+      'tts': 90929
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674230583,
+      'tts': 91100
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674230606,
+      'tts': 91122
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674247271,
+      'tts': 91300
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674247293,
+      'tts': 91321
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674263915,
+      'tts': 91477
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674263938,
+      'tts': 91499
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674280596,
+      'tts': 91655
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674280619,
+      'tts': 91677
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674297261,
+      'tts': 91831
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674297287,
+      'tts': 91856
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674313908,
+      'tts': 92015
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674313930,
+      'tts': 92036
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674330601,
+      'tts': 92208
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674330623,
+      'tts': 92230
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674347259,
+      'tts': 92385
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674347281,
+      'tts': 92407
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674363933,
+      'tts': 92564
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674363956,
+      'tts': 92586
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674380587,
+      'tts': 92742
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674380610,
+      'tts': 92764
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674397245,
+      'tts': 92919
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674397268,
+      'tts': 92940
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674413915,
+      'tts': 93111
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674413938,
+      'tts': 93133
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674430594,
+      'tts': 93290
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674430617,
+      'tts': 93312
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674447250,
+      'tts': 93468
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674447273,
+      'tts': 93490
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674463925,
+      'tts': 93617
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674463948,
+      'tts': 93639
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674480599,
+      'tts': 93799
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674480621,
+      'tts': 93820
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674497252,
+      'tts': 93974
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674497275,
+      'tts': 93996
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674513924,
+      'tts': 94167
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674513946,
+      'tts': 94189
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674530585,
+      'tts': 94357
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674530607,
+      'tts': 94379
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674547254,
+      'tts': 94537
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674547276,
+      'tts': 94558
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'BeginFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674563916,
+      'tts': 94716
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline.frame',
+      'name': 'RequestMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 't',
+      'tid': 17,
+      'ts': 1122674563954,
+      'tts': 94753
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674514204,
+      'tts': 198558
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674514232,
+      'tts': 198586
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674514246,
+      'tts': 198600
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674530672,
+      'tts': 198686
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674530685,
+      'tts': 198697
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 523}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 97,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 95,
+      'tid': 9,
+      'ts': 1122674530714,
+      'tts': 198727
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 44,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 41,
+      'tid': 9,
+      'ts': 1122674530749,
+      'tts': 198762
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 524}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674530780,
+      'tts': 198792
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2693784, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674530805,
+      'tts': 198817
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674530820,
+      'tts': 198832
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674530864,
+      'tts': 198876
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674530892,
+      'tts': 198905
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674530907,
+      'tts': 198919
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674547345,
+      'tts': 199009
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674547358,
+      'tts': 199020
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 524}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 98,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 95,
+      'tid': 9,
+      'ts': 1122674547387,
+      'tts': 199050
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 44,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 41,
+      'tid': 9,
+      'ts': 1122674547423,
+      'tts': 199086
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 525}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674547454,
+      'tts': 199116
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2693800, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674547479,
+      'tts': 199141
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674547493,
+      'tts': 199156
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674547538,
+      'tts': 199200
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674547566,
+      'tts': 199229
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674547581,
+      'tts': 199243
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674564053,
+      'tts': 199343
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'BeginMainThreadFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674564066,
+      'tts': 199355
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 525}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 99,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 97,
+      'tid': 9,
+      'ts': 1122674564096,
+      'tts': 199384
+    },
+    {
+      'args': {
+        'data':
+            {'frame': '0x1100e70a8000', 'scriptId': '29', 'scriptLine': 2, 'scriptName': 'http://localhost/raf.html'}
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 44,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3834,
+      'tdur': 42,
+      'tid': 9,
+      'ts': 1122674564132,
+      'tts': 199420
+    },
+    {
+      'args': {'data': {'frame': '0x1100e70a8000', 'id': 526}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674564162,
+      'tts': 199451
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 0, 'jsHeapSizeUsed': 2693816, 'nodes': 7}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674564188,
+      'tts': 199477
+    },
+    {
+      'args': {'frame': '0x1100e70a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3834,
+      's': 'g',
+      'tid': 9,
+      'ts': 1122674564203,
+      'tts': 199492
+    },
+    {
+      'args': {'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'B',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674564248,
+      'tts': 199536
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'CompositeLayers',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674564276,
+      'tts': 199565
+    },
+    {
+      'args': {},
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Program',
+      'ph': 'E',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 1122674564291,
+      'tts': 199579
+    },
+    {
+      'args': {'number': 32},
+
+      'cat': '__metadata',
+      'name': 'num_cpus',
+      'ph': 'M',
+      'pid': 3834,
+      'tid': 0,
+      'ts': 0
+    },
+    {
+      'args': {'sort_index': -5},
+
+      'cat': '__metadata',
+      'name': 'process_sort_index',
+      'ph': 'M',
+      'pid': 3834,
+      'tid': 10,
+      'ts': 0
+    },
+    {
+      'args': {'name': 'Renderer'},
+
+      'cat': '__metadata',
+      'name': 'process_name',
+      'ph': 'M',
+      'pid': 3834,
+      'tid': 10,
+      'ts': 0
+    },
+    {
+      'args': {'sort_index': -1},
+
+      'cat': '__metadata',
+      'name': 'thread_sort_index',
+      'ph': 'M',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 0
+    },
+    {
+      'args': {'name': 'CrRendererMain'},
+
+      'cat': '__metadata',
+      'name': 'thread_name',
+      'ph': 'M',
+      'pid': 3834,
+      'tid': 9,
+      'ts': 0
+    },
+    {
+      'args': {'name': 'Compositor'},
+
+      'cat': '__metadata',
+      'name': 'thread_name',
+      'ph': 'M',
+      'pid': 3834,
+      'tid': 17,
+      'ts': 0
+    },
+    {
+      'args': {'elementCount': 47},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RecalculateStyles',
+      'ph': 'E',
+      'pid': 3872,
+      'tid': 26,
+      'ts': 1122673092850,
+      'tts': 827512
+    },
+    {
+      'args':
+          {'beginData': {'dirtyObjects': 44, 'frame': '0x176b9c2a8000', 'partialLayout': false, 'totalObjects': 261}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Layout',
+      'ph': 'B',
+      'pid': 3872,
+      'tid': 26,
+      'ts': 1122673092873,
+      'tts': 827535
+    },
+    {
+      'args': {'endData': {'root': [0, 0, 1570, 0, 1570, 1472, 0, 1472], 'rootNode': 2}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'Layout',
+      'ph': 'E',
+      'pid': 3872,
+      'tid': 26,
+      'ts': 1122673093523,
+      'tts': 828186
+    },
+    {
+      'args': {'data': {'frame': '0x176b9c2a8000', 'id': 12}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 1828,
+      'name': 'FireAnimationFrame',
+      'ph': 'X',
+      'pid': 3872,
+      'tdur': 1827,
+      'tid': 26,
+      'ts': 1122673093558,
+      'tts': 828220
+    },
+    {
+      'args': {
+        'data': {
+          'frame': '0x176b9c2a8000',
+          'scriptId': '65',
+          'scriptLine': 939,
+          'scriptName': 'chrome-devtools://devtools/bundled/ui/UIUtils.js'
+        }
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 1770,
+      'name': 'FunctionCall',
+      'ph': 'X',
+      'pid': 3872,
+      'tdur': 1770,
+      'tid': 26,
+      'ts': 1122673093604,
+      'tts': 828265
+    },
+    {
+      'args': {'frame': '0x176b9c2a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'ScheduleStyleRecalculation',
+      'ph': 'I',
+      'pid': 3872,
+      's': 'g',
+      'tid': 26,
+      'ts': 1122673094798,
+      'tts': 829461
+    },
+    {
+      'args': {'frame': '0x176b9c2a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RecalculateStyles',
+      'ph': 'B',
+      'pid': 3872,
+      'tid': 26,
+      'ts': 1122673094958,
+      'tts': 829620
+    },
+    {
+      'args': {'elementCount': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RecalculateStyles',
+      'ph': 'E',
+      'pid': 3872,
+      'tid': 26,
+      'ts': 1122673094989,
+      'tts': 829651
+    },
+    {
+      'args': {'data': {'frame': '0x176b9c2a8000', 'id': 13}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'RequestAnimationFrame',
+      'ph': 'I',
+      'pid': 3872,
+      's': 'g',
+      'tid': 26,
+      'ts': 1122673095367,
+      'tts': 830030
+    },
+    {
+      'args': {'data': {'documents': 1, 'jsEventListeners': 141, 'jsHeapSizeUsed': 15850696, 'nodes': 1705}},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateCounters',
+      'ph': 'I',
+      'pid': 3872,
+      's': 'g',
+      'tid': 26,
+      'ts': 1122673095384,
+      'tts': 830046
+    },
+    {
+      'args': {'frame': '0x176b9c2a8000'},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayerTree',
+      'ph': 'I',
+      'pid': 3872,
+      's': 'g',
+      'tid': 26,
+      'ts': 1122673095390,
+      'tts': 830052
+    },
+    {
+      'args': {'layerId': 11, 'layerTreeId': 1},
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'name': 'UpdateLayer',
+      'ph': 'B',
+      'pid': 3872,
+      'tid': 26,
+      'ts': 1122673095845,
+      'tts': 830507
+    },
+    {
+      'args': {
+        'data': {
+          'clip': [-15, -15, 1585, -15, 1585, 1487, -15, 1487],
+          'frame': '0x176b9c2a8000',
+          'layerId': 11,
+          'nodeId': 2
+        }
+      },
+
+      'cat': 'disabled-by-default-devtools.timeline',
+      'dur': 4637,
+      'name': 'Paint',
+      'ph': 'X',
+      'pid': 3872,
+      'tdur': 4630,
+      'tid': 26,
+      'ts': 1122673095897,
+      'tts': 830559
+    },
+    {
+      'args': {'name': 'Browser'},
+
+      'cat': '__metadata',
+      'name': 'process_name',
+      'ph': 'M',
+      'pid': 3778,
+      'tid': 3801,
+      'ts': 0
+    },
+    {
+      'args': {'name': 'CrBrowserMain'},
+
+      'cat': '__metadata',
+      'name': 'thread_name',
+      'ph': 'M',
+      'pid': 3778,
+      'tid': 3778,
+      'ts': 0
+    }
+  ]);
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/performance_test_runner/TimelineTestRunner.js b/third_party/WebKit/Source/devtools/front_end/performance_test_runner/TimelineTestRunner.js
new file mode 100644
index 0000000..2f8442b
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/performance_test_runner/TimelineTestRunner.js
@@ -0,0 +1,408 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+PerformanceTestRunner.timelinePropertyFormatters = {
+  children: 'formatAsTypeName',
+  endTime: 'formatAsTypeName',
+  requestId: 'formatAsTypeName',
+  startTime: 'formatAsTypeName',
+  stackTrace: 'formatAsTypeName',
+  url: 'formatAsURL',
+  scriptName: 'formatAsTypeName',
+  scriptId: 'formatAsTypeName',
+  usedHeapSizeDelta: 'skip',
+  mimeType: 'formatAsTypeName',
+  id: 'formatAsTypeName',
+  timerId: 'formatAsTypeName',
+  scriptLine: 'formatAsTypeName',
+  layerId: 'formatAsTypeName',
+  lineNumber: 'formatAsTypeName',
+  columnNumber: 'formatAsTypeName',
+  frameId: 'formatAsTypeName',
+  frame: 'formatAsTypeName',
+  page: 'formatAsTypeName',
+  encodedDataLength: 'formatAsTypeName',
+  identifier: 'formatAsTypeName',
+  clip: 'formatAsTypeName',
+  root: 'formatAsTypeName',
+  backendNodeId: 'formatAsTypeName',
+  nodeId: 'formatAsTypeName',
+  rootNode: 'formatAsTypeName',
+  finishTime: 'formatAsTypeName',
+  thread: 'formatAsTypeName',
+  allottedMilliseconds: 'formatAsTypeName',
+  timedOut: 'formatAsTypeName',
+  networkTime: 'formatAsTypeName'
+};
+
+PerformanceTestRunner.InvalidationFormatters = {
+  _tracingEvent: 'skip',
+  cause: 'formatAsInvalidationCause',
+  frame: 'skip',
+  invalidatedSelectorId: 'skip',
+  invalidationList: 'skip',
+  invalidationSet: 'skip',
+  linkedRecalcStyleEvent: 'skip',
+  linkedLayoutEvent: 'skip',
+  nodeId: 'skip',
+  paintId: 'skip',
+  startTime: 'skip'
+};
+
+TestRunner.formatters.formatAsInvalidationCause = function(cause) {
+  if (!cause)
+    return '<undefined>';
+
+  var stackTrace;
+
+  if (cause.stackTrace && cause.stackTrace.length) {
+    stackTrace =
+        TestRunner.formatters.formatAsURL(cause.stackTrace[0].url) + ':' + (cause.stackTrace[0].lineNumber + 1);
+  }
+
+  return '{reason: ' + cause.reason + ', stackTrace: ' + stackTrace + '}';
+};
+
+PerformanceTestRunner.createTracingModel = function(events) {
+  var model = new SDK.TracingModel(new Bindings.TempFileBackingStorage('tracing'));
+  model.addEvents(events);
+  model.tracingComplete();
+  return model;
+};
+
+PerformanceTestRunner.tracingModel = function() {
+  return UI.panels.timeline._performanceModel.tracingModel();
+};
+
+PerformanceTestRunner.invokeWithTracing = function(functionName, callback, additionalCategories, enableJSSampling) {
+  var categories =
+      '-*,disabled-by-default-devtools.timeline*,devtools.timeline,' + SDK.TracingModel.TopLevelEventCategory;
+
+  if (additionalCategories)
+    categories += ',' + additionalCategories;
+
+  var timelinePanel = UI.panels.timeline;
+  var timelineController = PerformanceTestRunner.timelineController();
+  timelinePanel._timelineController = timelineController;
+  timelineController._startRecordingWithCategories(categories, enableJSSampling).then(tracingStarted);
+
+  function tracingStarted() {
+    timelinePanel._recordingStarted();
+    TestRunner.callFunctionInPageAsync(functionName).then(onPageActionsDone);
+  }
+
+  function onPageActionsDone() {
+    PerformanceTestRunner.runWhenTimelineIsReady(callback);
+    timelineController.stopRecording();
+  }
+};
+
+PerformanceTestRunner.performanceModel = function() {
+  return UI.panels.timeline._performanceModel;
+};
+
+PerformanceTestRunner.timelineModel = function() {
+  return PerformanceTestRunner.performanceModel().timelineModel();
+};
+
+PerformanceTestRunner.timelineFrameModel = function() {
+  return PerformanceTestRunner.performanceModel().frameModel();
+};
+
+PerformanceTestRunner.createPerformanceModelWithEvents = function(events) {
+  var tracingModel = new SDK.TracingModel(new Bindings.TempFileBackingStorage('tracing'));
+  tracingModel.addEvents(events);
+  tracingModel.tracingComplete();
+  var performanceModel = new Timeline.PerformanceModel();
+  performanceModel.setTracingModel(tracingModel);
+  return performanceModel;
+};
+
+PerformanceTestRunner.timelineController = function() {
+  var performanceModel = new Timeline.PerformanceModel();
+  UI.panels.timeline._pendingPerformanceModel = performanceModel;
+  return new Timeline.TimelineController(TestRunner.tracingManager, performanceModel, UI.panels.timeline);
+};
+
+PerformanceTestRunner.runWhenTimelineIsReady = function(callback) {
+  TestRunner.addSniffer(UI.panels.timeline, 'loadingComplete', () => callback());
+};
+
+PerformanceTestRunner.startTimeline = function(callback) {
+  var panel = UI.panels.timeline;
+  TestRunner.addSniffer(panel, '_recordingStarted', callback);
+  panel._toggleRecording();
+};
+
+PerformanceTestRunner.stopTimeline = function(callback) {
+  PerformanceTestRunner.runWhenTimelineIsReady(callback);
+  UI.panels.timeline._toggleRecording();
+};
+
+PerformanceTestRunner.evaluateWithTimeline = function(actions, doneCallback) {
+  PerformanceTestRunner.startTimeline(step1);
+
+  function step1() {
+    TestRunner.evaluateInPage(actions, step2);
+  }
+
+  function step2() {
+    PerformanceTestRunner.stopTimeline(doneCallback);
+  }
+};
+
+PerformanceTestRunner.invokeAsyncWithTimeline = function(functionName, doneCallback) {
+  PerformanceTestRunner.startTimeline(step1);
+
+  function step1() {
+    TestRunner.callFunctionInPageAsync(functionName).then(step2);
+  }
+
+  function step2() {
+    PerformanceTestRunner.stopTimeline(TestRunner.safeWrap(doneCallback));
+  }
+};
+
+PerformanceTestRunner.performActionsAndPrint = function(actions, typeName, includeTimeStamps) {
+  function callback() {
+    PerformanceTestRunner.printTimelineRecordsWithDetails(typeName);
+
+    if (includeTimeStamps) {
+      TestRunner.addResult('Timestamp records: ');
+      PerformanceTestRunner.printTimestampRecords(typeName);
+    }
+
+    TestRunner.completeTest();
+  }
+
+  PerformanceTestRunner.evaluateWithTimeline(actions, callback);
+};
+
+PerformanceTestRunner.printTimelineRecords = function(name) {
+  for (let event of PerformanceTestRunner.timelineModel().mainThreadEvents()) {
+    if (event.name === name)
+      PerformanceTestRunner.printTraceEventProperties(event);
+  }
+};
+
+PerformanceTestRunner.printTimelineRecordsWithDetails = function(name) {
+  for (let event of PerformanceTestRunner.timelineModel().mainThreadEvents()) {
+    if (name === event.name)
+      PerformanceTestRunner.printTraceEventPropertiesWithDetails(event);
+  }
+};
+
+PerformanceTestRunner.walkTimelineEventTree = function(callback) {
+  var performanceModel = PerformanceTestRunner.performanceModel();
+  var view = new Timeline.EventsTimelineTreeView(UI.panels.timeline._filters, null);
+  view.setModel(performanceModel);
+  var selection = Timeline.TimelineSelection.fromRange(
+      performanceModel.timelineModel().minimumRecordTime(), performanceModel.timelineModel().maximumRecordTime());
+  view.updateContents(selection);
+  PerformanceTestRunner.walkTimelineEventTreeUnderNode(callback, view._currentTree, 0);
+};
+
+PerformanceTestRunner.walkTimelineEventTreeUnderNode = function(callback, root, level) {
+  var event = root.event;
+
+  if (event)
+    callback(event, level);
+
+  for (var child of root.children().values())
+    PerformanceTestRunner.walkTimelineEventTreeUnderNode(callback, child, (level || 0) + 1);
+};
+
+PerformanceTestRunner.printTimestampRecords = function(typeName) {
+  var dividers = PerformanceTestRunner.timelineModel().eventDividers();
+
+  for (var event of dividers) {
+    if (event.name === typeName)
+      PerformanceTestRunner.printTraceEventProperties(event);
+  }
+};
+
+PerformanceTestRunner.forAllEvents = function(events, callback) {
+  let eventStack = [];
+
+  for (let event of events) {
+    while (eventStack.length && eventStack.peekLast().endTime <= event.startTime)
+      eventStack.pop();
+
+    callback(event, eventStack);
+
+    if (event.endTime)
+      eventStack.push(event);
+  }
+};
+
+PerformanceTestRunner.printTraceEventProperties = function(traceEvent) {
+  TestRunner.addResult(traceEvent.name + ' Properties:');
+  var data = traceEvent.args['beginData'] || traceEvent.args['data'];
+  var frameId = data && data['frame'];
+
+  var object = {
+    data: traceEvent.args['data'] || traceEvent.args,
+    endTime: traceEvent.endTime || traceEvent.startTime,
+    frameId: frameId,
+    stackTrace: TimelineModel.TimelineData.forEvent(traceEvent).stackTrace,
+    startTime: traceEvent.startTime,
+    type: traceEvent.name
+  };
+
+  for (var field in object) {
+    if (object[field] === null || object[field] === undefined)
+      delete object[field];
+  }
+
+  TestRunner.addObject(object, PerformanceTestRunner.timelinePropertyFormatters);
+};
+
+PerformanceTestRunner.printTraceEventPropertiesWithDetails = function(event) {
+  PerformanceTestRunner.printTraceEventProperties(event);
+  const details = Timeline.TimelineUIUtils.buildDetailsTextForTraceEvent(
+      event, SDK.targetManager.mainTarget(), new Components.Linkifier());
+  TestRunner.addResult(`Text details for ${event.name}: ${details}`);
+
+  if (TimelineModel.TimelineData.forEvent(event).warning)
+    TestRunner.addResult(`${event.name} has a warning`);
+};
+
+PerformanceTestRunner.findTimelineEvent = function(name, index) {
+  return PerformanceTestRunner.timelineModel().mainThreadEvents().filter(e => e.name === name)[index || 0];
+};
+
+PerformanceTestRunner.findChildEvent = function(events, parentIndex, name) {
+  var endTime = events[parentIndex].endTime;
+
+  for (var i = parentIndex + 1; i < events.length && (!events[i].endTime || events[i].endTime <= endTime); ++i) {
+    if (events[i].name === name)
+      return events[i];
+  }
+
+  return null;
+};
+
+PerformanceTestRunner.dumpFrame = function(frame) {
+  var fieldsToDump = [
+    'cpuTime', 'duration', 'startTime', 'endTime', 'id', 'mainThreadFrameId', 'timeByCategory', 'other', 'scripting',
+    'painting', 'rendering', 'committedFrom', 'idle'
+  ];
+
+  function formatFields(object) {
+    var result = {};
+
+    for (var key in object) {
+      if (fieldsToDump.indexOf(key) < 0)
+        continue;
+
+      var value = object[key];
+
+      if (typeof value === 'number')
+        value = Number(value.toFixed(7));
+      else if (typeof value === 'object' && value)
+        value = formatFields(value);
+
+      result[key] = value;
+    }
+
+    return result;
+  }
+
+  TestRunner.addObject(formatFields(frame));
+};
+
+PerformanceTestRunner.dumpInvalidations = function(recordType, index, comment) {
+  var event = PerformanceTestRunner.findTimelineEvent(recordType, index || 0);
+
+  TestRunner.addArray(
+      TimelineModel.InvalidationTracker.invalidationEventsFor(event), PerformanceTestRunner.InvalidationFormatters, '',
+      comment);
+};
+
+PerformanceTestRunner.dumpFlameChartProvider = function(provider, includeGroups) {
+  var includeGroupsSet = includeGroups && new Set(includeGroups);
+  var timelineData = provider.timelineData();
+  var stackDepth = provider.maxStackDepth();
+  var entriesByLevel = new Multimap();
+
+  for (let i = 0; i < timelineData.entryLevels.length; ++i)
+    entriesByLevel.set(timelineData.entryLevels[i], i);
+
+  for (let groupIndex = 0; groupIndex < timelineData.groups.length; ++groupIndex) {
+    const group = timelineData.groups[groupIndex];
+
+    if (includeGroupsSet && !includeGroupsSet.has(group.name))
+      continue;
+
+    var maxLevel =
+        (groupIndex + 1 < timelineData.groups.length ? timelineData.groups[groupIndex + 1].firstLevel : stackDepth);
+    TestRunner.addResult(`Group: ${group.name}`);
+
+    for (let level = group.startLevel; level < maxLevel; ++level) {
+      TestRunner.addResult(`Level ${level - group.startLevel}`);
+      var entries = entriesByLevel.get(level);
+
+      for (const index of entries) {
+        const title = provider.entryTitle(index);
+        const color = provider.entryColor(index);
+        TestRunner.addResult(`${title} (${color})`);
+      }
+    }
+  }
+};
+
+PerformanceTestRunner.dumpTimelineFlameChart = function(includeGroups) {
+  const provider = UI.panels.timeline._flameChart._mainDataProvider;
+  TestRunner.addResult('Timeline Flame Chart');
+  PerformanceTestRunner.dumpFlameChartProvider(provider, includeGroups);
+};
+
+PerformanceTestRunner.loadTimeline = function(timelineData) {
+  var promise = new Promise(fulfill => PerformanceTestRunner.runWhenTimelineIsReady(fulfill));
+
+  UI.panels.timeline._loadFromFile(new Blob([timelineData], {type: 'text/plain'}));
+
+  return promise;
+};
+
+(async function() {
+  await TestRunner.evaluateInPagePromise(`
+    function wrapCallFunctionForTimeline(f) {
+      var script = document.createElement('script');
+      script.textContent = '(' + f.toString() + ')()\n//# sourceURL=wrapCallFunctionForTimeline.js';
+      document.body.appendChild(script);
+    }
+
+    function generateFrames(count) {
+      var promise = Promise.resolve();
+
+      for (let i = count; i > 0; --i)
+        promise = promise.then(changeBackgroundAndWaitForFrame.bind(null, i));
+
+      return promise;
+
+      function changeBackgroundAndWaitForFrame(i) {
+        document.body.style.backgroundColor = (i & 1 ? 'rgb(200, 200, 200)' : 'rgb(240, 240, 240)');
+        return waitForFrame();
+      }
+    }
+
+    function waitForFrame() {
+      var callback;
+      var promise = new Promise(fulfill => callback = fulfill);
+
+      if (window.testRunner)
+        testRunner.capturePixelsAsyncThen(() => window.requestAnimationFrame(callback));
+      else
+        window.requestAnimationFrame(callback);
+
+      return promise;
+    }
+  `);
+})();
diff --git a/third_party/WebKit/Source/devtools/front_end/performance_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/performance_test_runner/module.json
new file mode 100644
index 0000000..c3e98e8
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/performance_test_runner/module.json
@@ -0,0 +1,16 @@
+{
+  "dependencies": [
+    "test_runner",
+    "integration_test_runner",
+    "timeline_model",
+    "timeline"
+  ],
+  "scripts": [
+    "TimelineTestRunner.js",
+    "TimelineDataTestRunner.js"
+  ],
+  "skip_compilation": [
+    "TimelineTestRunner.js",
+    "TimelineDataTestRunner.js"
+  ]
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler_test_runner/HeapSnapshotTestRunner.js b/third_party/WebKit/Source/devtools/front_end/profiler_test_runner/HeapSnapshotTestRunner.js
new file mode 100644
index 0000000..c6a2e2d
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/profiler_test_runner/HeapSnapshotTestRunner.js
@@ -0,0 +1,641 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+ProfilerTestRunner.createHeapSnapshotMockFactories = function() {
+  ProfilerTestRunner.createJSHeapSnapshotMockObject = function() {
+    return {
+      _rootNodeIndex: 0,
+      _nodeTypeOffset: 0,
+      _nodeNameOffset: 1,
+      _nodeEdgeCountOffset: 2,
+      _nodeFieldCount: 3,
+      _edgeFieldsCount: 3,
+      _edgeTypeOffset: 0,
+      _edgeNameOffset: 1,
+      _edgeToNodeOffset: 2,
+      _nodeTypes: ['hidden', 'object'],
+      _edgeTypes: ['element', 'property', 'shortcut'],
+      _edgeShortcutType: -1,
+      _edgeHiddenType: -1,
+      _edgeElementType: 0,
+      _realNodesLength: 18,
+      nodes: new Uint32Array([0, 0, 2, 1, 1, 2, 1, 2, 2, 1, 3, 1, 1, 4, 0, 1, 5, 0]),
+      containmentEdges: new Uint32Array([2, 6, 3, 1, 7, 6, 0, 1, 6, 1, 8, 9, 1, 9, 9, 1, 10, 12, 1, 11, 15]),
+      strings: ['', 'A', 'B', 'C', 'D', 'E', 'a', 'b', 'ac', 'bc', 'bd', 'ce'],
+      _firstEdgeIndexes: new Uint32Array([0, 6, 12, 18, 21, 21, 21]),
+      createNode: HeapSnapshotWorker.JSHeapSnapshot.prototype.createNode,
+      createEdge: HeapSnapshotWorker.JSHeapSnapshot.prototype.createEdge,
+      createRetainingEdge: HeapSnapshotWorker.JSHeapSnapshot.prototype.createRetainingEdge
+    };
+  };
+
+  ProfilerTestRunner.createHeapSnapshotMockRaw = function() {
+    return {
+      snapshot: {
+        meta: {
+          node_fields: ['type', 'name', 'id', 'self_size', 'retained_size', 'dominator', 'edge_count'],
+          node_types: [['hidden', 'object'], '', '', '', '', '', ''],
+          edge_fields: ['type', 'name_or_index', 'to_node'],
+          edge_types: [['element', 'property', 'shortcut'], '', '']
+        },
+
+        node_count: 6,
+        edge_count: 7
+      },
+
+      nodes: [
+        0, 0, 1, 0, 20, 0, 2, 1, 1, 2, 2, 2, 0,  2, 1, 2, 3, 3, 8, 0,  2,
+        1, 3, 4, 4, 10, 0, 1, 1, 4, 5, 5, 5, 14, 0, 1, 5, 6, 6, 6, 21, 0
+      ],
+
+      edges: [1, 6, 7, 1, 7, 14, 0, 1, 14, 1, 8, 21, 1, 9, 21, 1, 10, 28, 1, 11, 35],
+      strings: ['', 'A', 'B', 'C', 'D', 'E', 'a', 'b', 'ac', 'bc', 'bd', 'ce']
+    };
+  };
+
+  ProfilerTestRunner._postprocessHeapSnapshotMock = function(mock) {
+    mock.nodes = new Uint32Array(mock.nodes);
+    mock.edges = new Uint32Array(mock.edges);
+    return mock;
+  };
+
+  ProfilerTestRunner.createHeapSnapshotMock = function() {
+    return ProfilerTestRunner._postprocessHeapSnapshotMock(ProfilerTestRunner.createHeapSnapshotMockRaw());
+  };
+
+  ProfilerTestRunner.createHeapSnapshotMockWithDOM = function() {
+    return ProfilerTestRunner._postprocessHeapSnapshotMock({
+      snapshot: {
+        meta: {
+          node_fields: ['type', 'name', 'id', 'edge_count'],
+          node_types: [['hidden', 'object', 'synthetic'], '', '', ''],
+          edge_fields: ['type', 'name_or_index', 'to_node'],
+          edge_types: [['element', 'hidden', 'internal'], '', '']
+        },
+
+        node_count: 13,
+        edge_count: 13
+      },
+
+      nodes: [
+        2, 0, 1, 4, 1, 11, 2, 2, 1, 11, 3, 3, 2,  5, 4, 0, 2,  6, 5, 1,  1,  1, 6, 0, 1,  2,
+        7, 1, 1, 4, 8, 2,  1, 8, 9, 0,  1, 7, 10, 0, 1, 3, 11, 0, 1, 10, 12, 0, 1, 9, 13, 0
+      ],
+
+      edges: [
+        0,  1, 4, 0,  2, 8, 0,  3, 12, 0,  4, 16, 0,  1, 20, 0,  2, 24, 0, 1,
+        24, 0, 2, 28, 1, 3, 32, 0, 1,  36, 0, 1,  40, 2, 12, 44, 2, 1,  48
+      ],
+
+      strings: ['', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'M', 'N', 'Window', 'native']
+    });
+  };
+
+  ProfilerTestRunner.HeapNode = function(name, selfSize, type, id) {
+    this._type = type || ProfilerTestRunner.HeapNode.Type.object;
+    this._name = name;
+    this._selfSize = selfSize || 0;
+    this._builder = null;
+    this._edges = {};
+    this._edgesCount = 0;
+    this._id = id;
+  };
+
+  ProfilerTestRunner.HeapNode.Type = {
+    'hidden': 'hidden',
+    'array': 'array',
+    'string': 'string',
+    'object': 'object',
+    'code': 'code',
+    'closure': 'closure',
+    'regexp': 'regexp',
+    'number': 'number',
+    'native': 'native',
+    'synthetic': 'synthetic'
+  };
+
+  ProfilerTestRunner.HeapNode.prototype = {
+    linkNode: function(node, type, nameOrIndex) {
+      if (!this._builder)
+        throw new Error('parent node is not connected to a snapshot');
+
+      if (!node._builder)
+        node._setBuilder(this._builder);
+
+      if (nameOrIndex === undefined)
+        nameOrIndex = this._edgesCount;
+
+      ++this._edgesCount;
+
+      if (nameOrIndex in this._edges) {
+        throw new Error(
+            'Can\'t add edge with the same nameOrIndex. nameOrIndex: ' + nameOrIndex +
+            ' oldNodeName: ' + this._edges[nameOrIndex]._name + ' newNodeName: ' + node._name);
+      }
+
+      this._edges[nameOrIndex] = new ProfilerTestRunner.HeapEdge(node, type, nameOrIndex);
+    },
+
+    _setBuilder: function(builder) {
+      if (this._builder)
+        throw new Error('node reusing is prohibited');
+
+      this._builder = builder;
+      this._ordinal = this._builder._registerNode(this);
+    },
+
+    _serialize: function(rawSnapshot) {
+      rawSnapshot.nodes.push(this._builder.lookupNodeType(this._type));
+      rawSnapshot.nodes.push(this._builder.lookupOrAddString(this._name));
+      rawSnapshot.nodes.push(this._id || this._ordinal * 2 + 1);
+      rawSnapshot.nodes.push(this._selfSize);
+      rawSnapshot.nodes.push(0);
+      rawSnapshot.nodes.push(0);
+      rawSnapshot.nodes.push(Object.keys(this._edges).length);
+
+      for (var i in this._edges)
+        this._edges[i]._serialize(rawSnapshot);
+    }
+  };
+
+  ProfilerTestRunner.HeapEdge = function(targetNode, type, nameOrIndex) {
+    this._targetNode = targetNode;
+    this._type = type;
+    this._nameOrIndex = nameOrIndex;
+  };
+
+  ProfilerTestRunner.HeapEdge.prototype = {
+    _serialize: function(rawSnapshot) {
+      if (!this._targetNode._builder)
+        throw new Error('Inconsistent state of node: ' + this._name + ' no builder assigned');
+
+      var builder = this._targetNode._builder;
+      rawSnapshot.edges.push(builder.lookupEdgeType(this._type));
+      rawSnapshot.edges.push(
+          (typeof this._nameOrIndex === 'string' ? builder.lookupOrAddString(this._nameOrIndex) : this._nameOrIndex));
+      rawSnapshot.edges.push(this._targetNode._ordinal * builder.nodeFieldsCount);
+    }
+  };
+
+  ProfilerTestRunner.HeapEdge.Type = {
+    'context': 'context',
+    'element': 'element',
+    'property': 'property',
+    'internal': 'internal',
+    'hidden': 'hidden',
+    'shortcut': 'shortcut',
+    'weak': 'weak'
+  };
+
+  ProfilerTestRunner.HeapSnapshotBuilder = function() {
+    this._nodes = [];
+    this._string2id = {};
+    this._strings = [];
+    this.nodeFieldsCount = 7;
+    this._nodeTypesMap = {};
+    this._nodeTypesArray = [];
+
+    for (var nodeType in ProfilerTestRunner.HeapNode.Type) {
+      this._nodeTypesMap[nodeType] = this._nodeTypesArray.length;
+      this._nodeTypesArray.push(nodeType);
+    }
+
+    this._edgeTypesMap = {};
+    this._edgeTypesArray = [];
+
+    for (var edgeType in ProfilerTestRunner.HeapEdge.Type) {
+      this._edgeTypesMap[edgeType] = this._edgeTypesArray.length;
+      this._edgeTypesArray.push(edgeType);
+    }
+
+    this.rootNode = new ProfilerTestRunner.HeapNode('root', 0, 'object');
+    this.rootNode._setBuilder(this);
+  };
+
+  ProfilerTestRunner.HeapSnapshotBuilder.prototype = {
+    generateSnapshot: function() {
+      var rawSnapshot = {
+        'snapshot': {
+          'meta': {
+            'node_fields': ['type', 'name', 'id', 'self_size', 'retained_size', 'dominator', 'edge_count'],
+            'node_types': [this._nodeTypesArray, 'string', 'number', 'number', 'number', 'number', 'number'],
+            'edge_fields': ['type', 'name_or_index', 'to_node'],
+            'edge_types': [this._edgeTypesArray, 'string_or_number', 'node']
+          }
+        },
+
+        'nodes': [],
+        'edges': [],
+        'strings': []
+      };
+
+      for (var i = 0; i < this._nodes.length; ++i)
+        this._nodes[i]._serialize(rawSnapshot);
+
+      rawSnapshot.strings = this._strings.slice();
+      var meta = rawSnapshot.snapshot.meta;
+      rawSnapshot.snapshot.edge_count = rawSnapshot.edges.length / meta.edge_fields.length;
+      rawSnapshot.snapshot.node_count = rawSnapshot.nodes.length / meta.node_fields.length;
+      return rawSnapshot;
+    },
+
+    createJSHeapSnapshot: function() {
+      var parsedSnapshot = ProfilerTestRunner._postprocessHeapSnapshotMock(this.generateSnapshot());
+      return new HeapSnapshotWorker.JSHeapSnapshot(parsedSnapshot, new HeapSnapshotWorker.HeapSnapshotProgress());
+    },
+
+    _registerNode: function(node) {
+      this._nodes.push(node);
+      return this._nodes.length - 1;
+    },
+
+    lookupNodeType: function(typeName) {
+      if (typeName === undefined)
+        throw new Error('wrong node type: ' + typeName);
+
+      if (!(typeName in this._nodeTypesMap))
+        throw new Error('wrong node type name: ' + typeName);
+
+      return this._nodeTypesMap[typeName];
+    },
+
+    lookupEdgeType: function(typeName) {
+      if (!(typeName in this._edgeTypesMap))
+        throw new Error('wrong edge type name: ' + typeName);
+
+      return this._edgeTypesMap[typeName];
+    },
+
+    lookupOrAddString: function(string) {
+      if (string in this._string2id)
+        return this._string2id[string];
+
+      this._string2id[string] = this._strings.length;
+      this._strings.push(string);
+      return this._strings.length - 1;
+    }
+  };
+
+  ProfilerTestRunner.createHeapSnapshot = function(instanceCount, firstId) {
+    var seed = 881669;
+
+    function pseudoRandom(limit) {
+      seed = seed * 355109 + 153763 >> 2 & 65535;
+      return seed % limit;
+    }
+
+    var builder = new ProfilerTestRunner.HeapSnapshotBuilder();
+    var rootNode = builder.rootNode;
+    var gcRootsNode = new ProfilerTestRunner.HeapNode('(GC roots)', 0, ProfilerTestRunner.HeapNode.Type.synthetic);
+    rootNode.linkNode(gcRootsNode, ProfilerTestRunner.HeapEdge.Type.element);
+    var windowNode = new ProfilerTestRunner.HeapNode('Window', 20);
+    rootNode.linkNode(windowNode, ProfilerTestRunner.HeapEdge.Type.shortcut);
+    gcRootsNode.linkNode(windowNode, ProfilerTestRunner.HeapEdge.Type.element);
+
+    for (var i = 0; i < instanceCount; ++i) {
+      var sizeOfB = pseudoRandom(20) + 1;
+      var nodeB = new ProfilerTestRunner.HeapNode('B', sizeOfB, undefined, firstId++);
+      windowNode.linkNode(nodeB, ProfilerTestRunner.HeapEdge.Type.element);
+      var sizeOfA = pseudoRandom(50) + 1;
+      var nodeA = new ProfilerTestRunner.HeapNode('A', sizeOfA, undefined, firstId++);
+      nodeB.linkNode(nodeA, ProfilerTestRunner.HeapEdge.Type.property, 'a');
+      nodeA.linkNode(nodeA, ProfilerTestRunner.HeapEdge.Type.property, 'a');
+    }
+
+    return builder.generateSnapshot();
+  };
+};
+
+ProfilerTestRunner.createHeapSnapshotMockFactories();
+
+ProfilerTestRunner.startProfilerTest = function(callback) {
+  TestRunner.addResult('Profiler was enabled.');
+  ProfilerTestRunner._panelReset = TestRunner.override(UI.panels.heap_profiler, '_reset', function() {}, true);
+  TestRunner.addSniffer(Profiler.HeapSnapshotView.prototype, 'show', ProfilerTestRunner._snapshotViewShown, true);
+
+  Profiler.HeapSnapshotContainmentDataGrid.prototype.defaultPopulateCount = function() {
+    return 10;
+  };
+
+  Profiler.HeapSnapshotConstructorsDataGrid.prototype.defaultPopulateCount = function() {
+    return 10;
+  };
+
+  Profiler.HeapSnapshotDiffDataGrid.prototype.defaultPopulateCount = function() {
+    return 5;
+  };
+
+  TestRunner.addResult('Detailed heap profiles were enabled.');
+  TestRunner.safeWrap(callback)();
+};
+
+ProfilerTestRunner.completeProfilerTest = function() {
+  TestRunner.addResult('');
+  TestRunner.addResult('Profiler was disabled.');
+  TestRunner.completeTest();
+};
+
+ProfilerTestRunner.runHeapSnapshotTestSuite = function(testSuite) {
+  var testSuiteTests = testSuite.slice();
+  var completeTestStack;
+
+  function runner() {
+    if (!testSuiteTests.length) {
+      if (completeTestStack)
+        TestRunner.addResult('FAIL: test already completed at ' + completeTestStack);
+
+      ProfilerTestRunner.completeProfilerTest();
+      completeTestStack = new Error().stack;
+      return;
+    }
+
+    var nextTest = testSuiteTests.shift();
+    TestRunner.addResult('');
+    TestRunner.addResult(
+        'Running: ' +
+        /function\s([^(]*)/.exec(nextTest)[1]);
+    ProfilerTestRunner._panelReset.call(UI.panels.heap_profiler);
+    TestRunner.safeWrap(nextTest)(runner, runner);
+  }
+
+  ProfilerTestRunner.startProfilerTest(runner);
+};
+
+ProfilerTestRunner.assertColumnContentsEqual = function(reference, actual) {
+  var length = Math.min(reference.length, actual.length);
+
+  for (var i = 0; i < length; ++i)
+    TestRunner.assertEquals(reference[i], actual[i], 'row ' + i);
+
+  if (reference.length > length)
+    TestRunner.addResult('extra rows in reference array:\n' + reference.slice(length).join('\n'));
+  else if (actual.length > length)
+    TestRunner.addResult('extra rows in actual array:\n' + actual.slice(length).join('\n'));
+};
+
+ProfilerTestRunner.checkArrayIsSorted = function(contents, sortType, sortOrder) {
+  function simpleComparator(a, b) {
+    return (a < b ? -1 : (a > b ? 1 : 0));
+  }
+
+  function parseSize(size) {
+    return parseInt(size.replace(/[\xa0,]/g, ''), 10);
+  }
+
+  var extractor = {
+    text: function(data) {
+      data;
+    },
+
+    number: function(data) {
+      return parseInt(data, 10);
+    },
+
+    size: parseSize,
+
+    name: function(data) {
+      return data;
+    },
+
+    id: function(data) {
+      return parseInt(data, 10);
+    }
+  }[sortType];
+
+  if (!extractor) {
+    TestRunner.addResult('Invalid sort type: ' + sortType);
+    return;
+  }
+
+  var acceptableComparisonResult;
+
+  if (sortOrder === DataGrid.DataGrid.Order.Ascending) {
+    acceptableComparisonResult = -1;
+  } else if (sortOrder === DataGrid.DataGrid.Order.Descending) {
+    acceptableComparisonResult = 1;
+  } else {
+    TestRunner.addResult('Invalid sort order: ' + sortOrder);
+    return;
+  }
+
+  for (var i = 0; i < contents.length - 1; ++i) {
+    var a = extractor(contents[i]);
+    var b = extractor(contents[i + 1]);
+    var result = simpleComparator(a, b);
+
+    if (result !== 0 && result !== acceptableComparisonResult) {
+      TestRunner.addResult(
+          'Elements ' + i + ' and ' + (i + 1) + ' are out of order: ' + a + ' ' + b + ' (' + sortOrder + ')');
+    }
+  }
+};
+
+ProfilerTestRunner.clickColumn = function(column, callback) {
+  callback = TestRunner.safeWrap(callback);
+  var cell = this._currentGrid()._headerTableHeaders[column.id];
+
+  var event = {
+    target: {
+      enclosingNodeOrSelfWithNodeName: function() {
+        return cell;
+      }
+    }
+  };
+
+  function sortingComplete() {
+    ProfilerTestRunner._currentGrid().removeEventListener(
+        Profiler.HeapSnapshotSortableDataGrid.Events.SortingComplete, sortingComplete, this);
+    TestRunner.assertEquals(column.id, this._currentGrid().sortColumnId(), 'unexpected sorting');
+    column.sort = this._currentGrid().sortOrder();
+
+    function callCallback() {
+      callback(column);
+    }
+
+    setTimeout(callCallback, 0);
+  }
+
+  ProfilerTestRunner._currentGrid().addEventListener(
+      Profiler.HeapSnapshotSortableDataGrid.Events.SortingComplete, sortingComplete, this);
+  this._currentGrid()._clickInHeaderCell(event);
+};
+
+ProfilerTestRunner.clickRowAndGetRetainers = function(row, callback) {
+  callback = TestRunner.safeWrap(callback);
+
+  var event = {
+    target: {
+      enclosingNodeOrSelfWithNodeName: function() {
+        return row._element;
+      },
+
+      selectedNode: row
+    }
+  };
+
+  this._currentGrid()._mouseDownInDataTable(event);
+  var rootNode = ProfilerTestRunner.currentProfileView()._retainmentDataGrid.rootNode();
+  rootNode.once(Profiler.HeapSnapshotGridNode.Events.PopulateComplete).then(() => callback(rootNode));
+};
+
+ProfilerTestRunner.clickShowMoreButton = function(buttonName, row, callback) {
+  callback = TestRunner.safeWrap(callback);
+  var parent = row.parent;
+  parent.once(Profiler.HeapSnapshotGridNode.Events.PopulateComplete).then(() => setTimeout(() => callback(parent), 0));
+  row[buttonName].click();
+};
+
+ProfilerTestRunner.columnContents = function(column, row) {
+  this._currentGrid().updateVisibleNodes();
+  var columnOrdinal = ProfilerTestRunner.viewColumns().indexOf(column);
+  var result = [];
+  var parent = row || this._currentGrid().rootNode();
+
+  for (var node = parent.children[0]; node; node = node.traverseNextNode(true, parent, true)) {
+    if (!node.selectable)
+      continue;
+
+    var content = node.element().children[columnOrdinal];
+
+    if (content.firstElementChild)
+      content = content.firstElementChild;
+
+    result.push(content.textContent);
+  }
+
+  return result;
+};
+
+ProfilerTestRunner.countDataRows = function(row, filter) {
+  var result = 0;
+
+  filter = filter || function(node) {
+    return node.selectable;
+  };
+
+  for (var node = row.children[0]; node; node = node.traverseNextNode(true, row, true)) {
+    if (filter(node))
+      ++result;
+  }
+
+  return result;
+};
+
+ProfilerTestRunner.expandRow = function(row, callback) {
+  callback = TestRunner.safeWrap(callback);
+  row.once(Profiler.HeapSnapshotGridNode.Events.PopulateComplete).then(() => setTimeout(() => callback(row), 0));
+
+  (function expand() {
+    if (row.hasChildren())
+      row.expand();
+    else
+      setTimeout(expand, 0);
+  })();
+};
+
+ProfilerTestRunner.findAndExpandGCRoots = function(callback) {
+  ProfilerTestRunner.findAndExpandRow('(GC roots)', callback);
+};
+
+ProfilerTestRunner.findAndExpandWindow = function(callback) {
+  ProfilerTestRunner.findAndExpandRow('Window', callback);
+};
+
+ProfilerTestRunner.findAndExpandRow = function(name, callback) {
+  callback = TestRunner.safeWrap(callback);
+  var row = ProfilerTestRunner.findRow(name);
+  TestRunner.assertEquals(true, !!row, '"' + name + '" row');
+  ProfilerTestRunner.expandRow(row, callback);
+};
+
+ProfilerTestRunner.findButtonsNode = function(row, startNode) {
+  for (var node = startNode || row.children[0]; node; node = node.traverseNextNode(true, row, true)) {
+    if (!node.selectable && node.showNext)
+      return node;
+  }
+
+  return null;
+};
+
+ProfilerTestRunner.findRow = function(name, parent) {
+  function matcher(x) {
+    return x._name === name;
+  }
+
+  return ProfilerTestRunner.findMatchingRow(matcher, parent);
+};
+
+ProfilerTestRunner.findMatchingRow = function(matcher, parent) {
+  parent = parent || this._currentGrid().rootNode();
+
+  for (var node = parent.children[0]; node; node = node.traverseNextNode(true, parent, true)) {
+    if (matcher(node))
+      return node;
+  }
+
+  return null;
+};
+
+ProfilerTestRunner.switchToView = function(title, callback) {
+  callback = TestRunner.safeWrap(callback);
+  var view = UI.panels.heap_profiler.visibleView;
+  view._changePerspectiveAndWait(title).then(callback);
+  ProfilerTestRunner._currentGrid().scrollContainer.style.height = '10000px';
+};
+
+ProfilerTestRunner.takeAndOpenSnapshot = function(generator, callback) {
+  callback = TestRunner.safeWrap(callback);
+  var snapshot = generator();
+  var profileType = Profiler.ProfileTypeRegistry.instance.heapSnapshotProfileType;
+
+  function pushGeneratedSnapshot(reportProgress) {
+    if (reportProgress) {
+      profileType._reportHeapSnapshotProgress({data: {done: 50, total: 100, finished: false}});
+
+      profileType._reportHeapSnapshotProgress({data: {done: 100, total: 100, finished: true}});
+    }
+
+    snapshot.snapshot.typeId = 'HEAP';
+
+    profileType._addHeapSnapshotChunk({data: JSON.stringify(snapshot)});
+
+    return Promise.resolve();
+  }
+
+  TestRunner.override(TestRunner.HeapProfilerAgent, 'takeHeapSnapshot', pushGeneratedSnapshot);
+  ProfilerTestRunner._takeAndOpenSnapshotCallback = callback;
+  profileType._takeHeapSnapshot();
+};
+
+ProfilerTestRunner.viewColumns = function() {
+  return ProfilerTestRunner._currentGrid()._columnsArray;
+};
+
+ProfilerTestRunner.currentProfileView = function() {
+  return UI.panels.heap_profiler.visibleView;
+};
+
+ProfilerTestRunner._currentGrid = function() {
+  return this.currentProfileView()._dataGrid;
+};
+
+ProfilerTestRunner._snapshotViewShown = function() {
+  if (ProfilerTestRunner._takeAndOpenSnapshotCallback) {
+    var callback = ProfilerTestRunner._takeAndOpenSnapshotCallback;
+    ProfilerTestRunner._takeAndOpenSnapshotCallback = null;
+    var dataGrid = this._dataGrid;
+
+    function sortingComplete() {
+      dataGrid.removeEventListener(Profiler.HeapSnapshotSortableDataGrid.Events.SortingComplete, sortingComplete, null);
+      callback();
+    }
+
+    dataGrid.addEventListener(Profiler.HeapSnapshotSortableDataGrid.Events.SortingComplete, sortingComplete, null);
+  }
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler_test_runner/ProfilerTestRunner.js b/third_party/WebKit/Source/devtools/front_end/profiler_test_runner/ProfilerTestRunner.js
new file mode 100644
index 0000000..2200015
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/profiler_test_runner/ProfilerTestRunner.js
@@ -0,0 +1,79 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+ProfilerTestRunner.startProfilerTest = function(callback) {
+  TestRunner.addResult('Profiler was enabled.');
+  TestRunner.addSniffer(UI.panels.js_profiler, '_addProfileHeader', ProfilerTestRunner._profileHeaderAdded, true);
+  TestRunner.addSniffer(Profiler.ProfileView.prototype, 'refresh', ProfilerTestRunner._profileViewRefresh, true);
+  TestRunner.safeWrap(callback)();
+};
+
+ProfilerTestRunner.completeProfilerTest = function() {
+  TestRunner.addResult('');
+  TestRunner.addResult('Profiler was disabled.');
+  TestRunner.completeTest();
+};
+
+ProfilerTestRunner.runProfilerTestSuite = function(testSuite) {
+  var testSuiteTests = testSuite.slice();
+
+  function runner() {
+    if (!testSuiteTests.length) {
+      ProfilerTestRunner.completeProfilerTest();
+      return;
+    }
+
+    var nextTest = testSuiteTests.shift();
+    TestRunner.addResult('');
+    TestRunner.addResult(
+        'Running: ' +
+        /function\s([^(]*)/.exec(nextTest)[1]);
+    TestRunner.safeWrap(nextTest)(runner, runner);
+  }
+
+  ProfilerTestRunner.startProfilerTest(runner);
+};
+
+ProfilerTestRunner.showProfileWhenAdded = function(title) {
+  ProfilerTestRunner._showProfileWhenAdded = title;
+};
+
+ProfilerTestRunner._profileHeaderAdded = function(profile) {
+  if (ProfilerTestRunner._showProfileWhenAdded === profile.title)
+    UI.panels.js_profiler.showProfile(profile);
+};
+
+ProfilerTestRunner.waitUntilProfileViewIsShown = function(title, callback) {
+  callback = TestRunner.safeWrap(callback);
+  var profilesPanel = UI.panels.js_profiler;
+
+  if (profilesPanel.visibleView && profilesPanel.visibleView.profile &&
+      profilesPanel.visibleView._profileHeader.title === title)
+    callback(profilesPanel.visibleView);
+  else
+    ProfilerTestRunner._waitUntilProfileViewIsShownCallback = {title: title, callback: callback};
+
+};
+
+ProfilerTestRunner._profileViewRefresh = function() {
+  if (ProfilerTestRunner._waitUntilProfileViewIsShownCallback &&
+      ProfilerTestRunner._waitUntilProfileViewIsShownCallback.title === this._profileHeader.title) {
+    var callback = ProfilerTestRunner._waitUntilProfileViewIsShownCallback;
+    delete ProfilerTestRunner._waitUntilProfileViewIsShownCallback;
+    callback.callback(this);
+  }
+};
+
+ProfilerTestRunner.startSamplingHeapProfiler = function() {
+  Profiler.SamplingHeapProfileType.instance.startRecordingProfile();
+};
+
+ProfilerTestRunner.stopSamplingHeapProfiler = function() {
+  Profiler.SamplingHeapProfileType.instance.stopRecordingProfile();
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/profiler_test_runner/module.json
new file mode 100644
index 0000000..1ea4ac0
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/profiler_test_runner/module.json
@@ -0,0 +1,17 @@
+{
+  "dependencies": [
+    "test_runner",
+    "integration_test_runner",
+    "profiler",
+    "data_grid",
+    "heap_snapshot_worker"
+  ],
+  "scripts": [
+    "HeapSnapshotTestRunner.js",
+    "ProfilerTestRunner.js"
+  ],
+  "skip_compilation": [
+    "HeapSnapshotTestRunner.js",
+    "ProfilerTestRunner.js"
+  ]
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/resources/DOMStorageItemsView.js b/third_party/WebKit/Source/devtools/front_end/resources/DOMStorageItemsView.js
index 0a3fae67..2bf85cc8 100644
--- a/third_party/WebKit/Source/devtools/front_end/resources/DOMStorageItemsView.js
+++ b/third_party/WebKit/Source/devtools/front_end/resources/DOMStorageItemsView.js
@@ -36,8 +36,8 @@
     this.element.classList.add('storage-view', 'table');
 
     var columns = /** @type {!Array<!DataGrid.DataGrid.ColumnDescriptor>} */ ([
-      {id: 'key', title: Common.UIString('Key'), sortable: false, editable: true, weight: 50},
-      {id: 'value', title: Common.UIString('Value'), sortable: false, editable: true, weight: 50}
+      {id: 'key', title: Common.UIString('Key'), sortable: false, editable: true, longText: true, weight: 50},
+      {id: 'value', title: Common.UIString('Value'), sortable: false, editable: true, longText: true, weight: 50}
     ]);
     this._dataGrid = new DataGrid.DataGrid(columns, this._editingCallback.bind(this), this._deleteCallback.bind(this));
     this._dataGrid.setStriped(true);
diff --git a/third_party/WebKit/Source/devtools/front_end/sass_test_runner/SASSTestRunner.js b/third_party/WebKit/Source/devtools/front_end/sass_test_runner/SASSTestRunner.js
new file mode 100644
index 0000000..9e8d661
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/sass_test_runner/SASSTestRunner.js
@@ -0,0 +1,331 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+var sassSourceMapFactory = null;
+
+SASSTestRunner.sassSourceMapFactory = function() {
+  if (!sassSourceMapFactory)
+    sassSourceMapFactory = new Sass.SASSSourceMapFactory();
+
+  return sassSourceMapFactory;
+};
+
+SASSTestRunner.parseSCSS = function(url, text) {
+  return Sass.SASSSupport.parseSCSS(url, text);
+};
+
+SASSTestRunner.parseCSS = SASSTestRunner.parseSCSS;
+
+SASSTestRunner.loadASTMapping = function(header, callback) {
+  var sourceMapManager = header.cssModel().sourceMapManager();
+  var sourceMap = sourceMapManager.sourceMapForClient(header);
+
+  if (sourceMap) {
+    callback((sourceMap.editable() ? sourceMap : null));
+    return;
+  }
+
+  sourceMapManager.addEventListener(SDK.SourceMapManager.Events.SourceMapAttached, onAttached);
+
+  function onAttached(event) {
+    if (event.data.client !== header)
+      return;
+
+    sourceMapManager.removeEventListener(SDK.SourceMapManager.Events.SourceMapAttached, onAttached);
+    var sourceMap = event.data.sourceMap;
+    callback((sourceMap.editable() ? sourceMap : null));
+  }
+};
+
+SASSTestRunner.dumpAST = function(ast) {
+  var lines = [String.sprintf('=== AST === %s', ast.document.url)];
+
+  for (var i = 0; i < ast.rules.length; ++i) {
+    var rule = ast.rules[i];
+    lines.push(String.sprintf('rule %d', i));
+    var ruleLines = dumpRule(rule);
+    lines = lines.concat(indent(ruleLines));
+  }
+
+  lines.push('======');
+  TestRunner.addResult(lines.join('\n'));
+  return ast;
+
+  function dumpRule(rule) {
+    var lines = [];
+
+    for (var i = 0; i < rule.selectors.length; ++i) {
+      var selector = rule.selectors[i];
+      lines.push(`selector ${i}: "${selector.text}"`);
+      var selectorLines = dumpTextNode(selector);
+      lines = lines.concat(indent(selectorLines));
+    }
+
+    for (var i = 0; i < rule.properties.length; ++i) {
+      var property = rule.properties[i];
+      lines.push('property ' + i);
+      var propertyLines = dumpProperty(property);
+      lines = lines.concat(indent(propertyLines));
+    }
+
+    return lines;
+  }
+
+  function dumpProperty(property) {
+    var lines = [];
+    lines.push(String.sprintf('name: "%s"', property.name.text));
+    lines = lines.concat(indent(dumpTextNode(property.name)));
+    lines.push(String.sprintf('value: "%s"', property.value.text));
+    lines = lines.concat(indent(dumpTextNode(property.value)));
+    lines.push(String.sprintf('range: %s', property.range.toString()));
+    lines.push(String.sprintf('disabled: %s', property.disabled));
+    return lines;
+  }
+
+  function dumpTextNode(textNode) {
+    return [String.sprintf('range: %s', textNode.range.toString())];
+  }
+};
+
+function indent(lines) {
+  return lines.map(line => '    ' + line);
+}
+
+SASSTestRunner.dumpASTDiff = function(diff) {
+  TestRunner.addResult('=== Diff ===');
+  var changesPerRule = new Map();
+
+  for (var change of diff.changes) {
+    var oldRule = change.oldRule;
+    var ruleChanges = changesPerRule.get(oldRule);
+
+    if (!ruleChanges) {
+      ruleChanges = [];
+      changesPerRule.set(oldRule, ruleChanges);
+    }
+
+    ruleChanges.push(change);
+  }
+
+  var T = Sass.SASSSupport.PropertyChangeType;
+
+  for (var rule of changesPerRule.keys()) {
+    var changes = changesPerRule.get(rule);
+    var names = [];
+    var values = [];
+
+    for (var property of rule.properties) {
+      names.push(str(property.name, '    '));
+      values.push(str(property.value));
+    }
+
+    for (var i = changes.length - 1; i >= 0; --i) {
+      var change = changes[i];
+      var newProperty = change.newRule.properties[change.newPropertyIndex];
+      var oldProperty = change.oldRule.properties[change.oldPropertyIndex];
+
+      switch (change.type) {
+        case T.PropertyAdded:
+          names.splice(change.oldPropertyIndex, 0, str(newProperty.name, '[+] '));
+          values.splice(change.oldPropertyIndex, 0, str(newProperty.value));
+          break;
+        case T.PropertyRemoved:
+          names[change.oldPropertyIndex] = str(oldProperty.name, '[-] ');
+          break;
+        case T.PropertyToggled:
+          names[change.oldPropertyIndex] = str(oldProperty.name, '[T] ');
+          break;
+        case T.NameChanged:
+          names[change.oldPropertyIndex] = str(oldProperty.name, '[M] ');
+          break;
+        case T.ValueChanged:
+          values[change.oldPropertyIndex] = str(oldProperty.value, '[M] ');
+          break;
+      }
+    }
+
+    var selectorText = rule.selectors.map(selector => selector.text).join(',');
+    TestRunner.addResult('Changes for rule: ' + selectorText);
+    names = indent(names);
+
+    for (var i = 0; i < names.length; ++i)
+      TestRunner.addResult(names[i] + ': ' + values[i]);
+  }
+
+  function str(node, prefix) {
+    prefix = prefix || '';
+    return prefix + node.text.trim();
+  }
+};
+
+SASSTestRunner.validateASTRanges = function(ast) {
+  var invalidNodes = [];
+
+  for (var rule of ast.rules) {
+    for (var property of rule.properties) {
+      validate(property.name);
+      validate(property.value);
+    }
+  }
+
+  if (invalidNodes.length) {
+    TestRunner.addResult('Bad ranges: ' + invalidNodes.length);
+
+    for (var node of invalidNodes)
+      TestRunner.addResult(String.sprintf('  - range: %s text: %s', node.range.toString(), node.text));
+  } else {
+    TestRunner.addResult('Ranges OK.');
+  }
+
+  return ast;
+
+  function validate(textNode) {
+    if (textNode.document.text.extract(textNode.range) !== textNode.text)
+      invalidNodes.push(textNode);
+  }
+};
+
+SASSTestRunner.validateMapping = function(mapping) {
+  TestRunner.addResult('Mapped CSS: ' + mapping._compiledToSource.size);
+  TestRunner.addResult('Mapped SCSS: ' + mapping._sourceToCompiled.size);
+  var cssNodes = mapping._compiledToSource.keysArray();
+  var staleCSS = 0;
+  var staleSASS = 0;
+
+  for (var i = 0; i < cssNodes.length; ++i) {
+    var cssNode = cssNodes[i];
+    staleCSS += (cssNode.document !== mapping.compiledModel().document ? 1 : 0);
+    var sassNode = mapping.toSourceNode(cssNode);
+    var sassAST = mapping.sourceModels().get(sassNode.document.url);
+    staleSASS += (sassNode.document !== sassAST.document ? 1 : 0);
+  }
+
+  if (staleCSS || staleSASS) {
+    TestRunner.addResult('ERROR: found stale entries');
+    TestRunner.addResult('   -stale CSS: ' + staleCSS);
+    TestRunner.addResult('   -stale SASS: ' + staleSASS);
+  } else {
+    TestRunner.addResult('No stale entries found.');
+  }
+};
+
+SASSTestRunner.updateCSSText = function(url, newText) {
+  var styleSheetIds = TestRunner.cssModel.styleSheetIdsForURL(url);
+  var promises = styleSheetIds.map(id => TestRunner.cssModel.setStyleSheetText(id, newText, true));
+  return Promise.all(promises);
+};
+
+SASSTestRunner.updateSASSText = function(url, newText) {
+  var uiSourceCode = Workspace.workspace.uiSourceCodeForURL(url);
+  uiSourceCode.addRevision(newText);
+};
+
+SASSTestRunner.runCSSEditTests = function(header, tests) {
+  var astSourceMap;
+  SASSTestRunner.loadASTMapping(header, onMapping);
+
+  function onMapping(map) {
+    astSourceMap = map;
+    TestRunner.addResult('INITIAL MODELS');
+    logASTText(map.compiledModel(), true);
+
+    for (var ast of map.sourceModels().values())
+      logASTText(ast, true);
+
+    runTests();
+  }
+
+  function runTests() {
+    if (!tests.length) {
+      TestRunner.completeTest();
+      return;
+    }
+
+    var test = tests.shift();
+    logTestName(test.name);
+    var text = astSourceMap.compiledModel().document.text.value();
+    var edits = test(text);
+    logSourceEdits(text, edits);
+    var ranges = edits.map(edit => edit.oldRange);
+    var texts = edits.map(edit => edit.newText);
+    astSourceMap.editCompiled(ranges, texts).then(onEditsDone);
+  }
+
+  function onEditsDone(result) {
+    if (!result.map) {
+      TestRunner.addResult('SASSProcessor failed to process edits.');
+      runTests();
+      return;
+    }
+
+    logASTText(result.map.compiledModel());
+
+    for (var sassURL of result.newSources.keys()) {
+      var ast = result.map.sourceModels().get(sassURL);
+      logASTText(ast);
+    }
+
+    runTests();
+  }
+
+  function logASTText(ast, avoidIndent, customTitle) {
+    customTitle = customTitle || ast.document.url.split('/').pop();
+    TestRunner.addResult('===== ' + customTitle + ' =====');
+    var text = ast.document.text.value().replace(/ /g, '.');
+    var lines = text.split('\n');
+
+    if (!avoidIndent)
+      lines = indent(lines);
+
+    TestRunner.addResult(lines.join('\n'));
+  }
+
+  function logTestName(testName) {
+    var titleText = ' TEST: ' + testName + ' ';
+    var totalLength = 80;
+    var prefixLength = (totalLength - titleText.length) / 2 | 0;
+    var suffixLength = totalLength - titleText.length - prefixLength;
+    var prefix = new Array(prefixLength).join('-');
+    var suffix = new Array(suffixLength).join('-');
+    TestRunner.addResult('\n' + prefix + titleText + suffix + '\n');
+  }
+
+  function logSourceEdits(text, edits) {
+    var lines = [];
+
+    for (var i = 0; i < edits.length; ++i) {
+      var edit = edits[i];
+      var range = edit.oldRange;
+      var line = String.sprintf('{%d, %d, %d, %d}', range.startLine, range.startColumn, range.endLine, range.endColumn);
+      line += String.sprintf(' \'%s\' => \'%s\'', new TextUtils.Text(text).extract(range), edit.newText);
+      lines.push(line);
+    }
+
+    lines = indent(lines);
+    lines.unshift('Edits:');
+    TestRunner.addResult(lines.join('\n'));
+  }
+};
+
+SASSTestRunner.createEdit = function(source, pattern, newText, matchNumber) {
+  matchNumber = matchNumber || 0;
+  var re = new RegExp(pattern.escapeForRegExp(), 'g');
+  var match;
+
+  while ((match = re.exec(source)) !== null && matchNumber)
+    --matchNumber;
+
+
+  if (!match)
+    return null;
+
+  var sourceRange = new TextUtils.SourceRange(match.index, match[0].length);
+  var textRange = new TextUtils.Text(source).toTextRange(sourceRange);
+  return new TextUtils.SourceEdit('', textRange, newText);
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/sass_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/sass_test_runner/module.json
new file mode 100644
index 0000000..3aace150
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/sass_test_runner/module.json
@@ -0,0 +1,13 @@
+{
+  "dependencies": [
+    "test_runner",
+    "integration_test_runner",
+    "sass"
+  ],
+  "scripts": [
+    "SASSTestRunner.js"
+  ],
+  "skip_compilation": [
+    "SASSTestRunner.js"
+  ]
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/security/SecurityModel.js b/third_party/WebKit/Source/devtools/front_end/security/SecurityModel.js
index 411c70d..a90a173e 100644
--- a/third_party/WebKit/Source/devtools/front_end/security/SecurityModel.js
+++ b/third_party/WebKit/Source/devtools/front_end/security/SecurityModel.js
@@ -58,10 +58,6 @@
 
     return aScore - bScore;
   }
-
-  showCertificateViewer() {
-    this._securityAgent.showCertificateViewer();
-  }
 };
 
 SDK.SDKModel.register(Security.SecurityModel, SDK.Target.Capability.Security, false);
diff --git a/third_party/WebKit/Source/devtools/front_end/security/SecurityPanel.js b/third_party/WebKit/Source/devtools/front_end/security/SecurityPanel.js
index 3407caa..1cb04de 100644
--- a/third_party/WebKit/Source/devtools/front_end/security/SecurityPanel.js
+++ b/third_party/WebKit/Source/devtools/front_end/security/SecurityPanel.js
@@ -38,37 +38,27 @@
 
   /**
    * @param {string} text
-   * @param {!Security.SecurityPanel} panel
+   * @param {string} origin
    * @return {!Element}
    */
-  static createCertificateViewerButton(text, panel) {
-    /**
-     * @param {!Event} e
-     */
-    function showCertificateViewer(e) {
+  static createCertificateViewerButtonForOrigin(text, origin) {
+    return UI.createTextButton(text, async e => {
       e.consume();
-      panel.showCertificateViewer();
-    }
-
-    return UI.createTextButton(text, showCertificateViewer, 'security-certificate-button');
+      var names = await SDK.multitargetNetworkManager.getCertificate(origin);
+      InspectorFrontendHost.showCertificateViewer(names);
+    }, 'security-certificate-button');
   }
 
   /**
    * @param {string} text
-   * @param {string} origin
+   * @param {!Array<string>} names
    * @return {!Element}
    */
-  static createCertificateViewerButton2(text, origin) {
-    /**
-     * @param {!Event} e
-     */
-    function showCertificateViewer(e) {
+  static createCertificateViewerButtonForCert(text, names) {
+    return UI.createTextButton(text, e => {
       e.consume();
-      SDK.multitargetNetworkManager.getCertificate(origin).then(
-          names => InspectorFrontendHost.showCertificateViewer(names));
-    }
-
-    return UI.createTextButton(text, showCertificateViewer, 'security-certificate-button');
+      InspectorFrontendHost.showCertificateViewer(names);
+    }, 'security-certificate-button');
   }
 
   /**
@@ -258,10 +248,6 @@
     return this._filterRequestCounts.get(filterKey) || 0;
   }
 
-  showCertificateViewer() {
-    this._securityModel.showCertificateViewer();
-  }
-
   /**
    * @param {!Protocol.Security.SecurityState} stateA
    * @param {!Protocol.Security.SecurityState} stateB
@@ -614,11 +600,10 @@
     text.createChild('div', 'security-explanation-title').textContent = explanation.summary;
     text.createChild('div').textContent = explanation.description;
 
-    if (explanation.hasCertificate) {
-      text.appendChild(
-          Security.SecurityPanel.createCertificateViewerButton(Common.UIString('View certificate'), this._panel));
+    if (explanation.certificate.length) {
+      text.appendChild(Security.SecurityPanel.createCertificateViewerButtonForCert(
+          Common.UIString('View certificate'), explanation.certificate));
     }
-
     return text;
   }
 
@@ -682,10 +667,11 @@
 
     if (this._panel.filterRequestCount(Network.NetworkLogView.MixedContentFilterValues.Blocked) > 0) {
       var explanation = /** @type {!Protocol.Security.SecurityStateExplanation} */ ({
-        'securityState': Protocol.Security.SecurityState.Info,
-        'summary': Common.UIString('Blocked mixed content'),
-        'description': Common.UIString('Your page requested non-secure resources that were blocked.'),
-        'mixedContentType': Protocol.Security.MixedContentType.Blockable
+        securityState: Protocol.Security.SecurityState.Info,
+        summary: Common.UIString('Blocked mixed content'),
+        description: Common.UIString('Your page requested non-secure resources that were blocked.'),
+        mixedContentType: Protocol.Security.MixedContentType.Blockable,
+        certificate: []
       });
       this._addMixedContentExplanation(
           this._securityExplanationsMain, explanation, Network.NetworkLogView.MixedContentFilterValues.Blocked);
@@ -805,9 +791,11 @@
       table.addRow(Common.UIString('Valid from'), validFromString);
       table.addRow(Common.UIString('Valid until'), validUntilString);
       table.addRow(Common.UIString('Issuer'), originState.securityDetails.issuer);
+
       table.addRow(
-          '', Security.SecurityPanel.createCertificateViewerButton2(
-                  Common.UIString('Open full certificate details'), origin));
+          '',
+          Security.SecurityPanel.createCertificateViewerButtonForOrigin(
+              Common.UIString('Open full certificate details'), origin));
 
       if (!originState.securityDetails.signedCertificateTimestampList.length)
         return;
diff --git a/third_party/WebKit/Source/devtools/front_end/security_test_runner/SecurityTestRunner.js b/third_party/WebKit/Source/devtools/front_end/security_test_runner/SecurityTestRunner.js
new file mode 100644
index 0000000..b50fa77
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/security_test_runner/SecurityTestRunner.js
@@ -0,0 +1,28 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+SecurityTestRunner.dumpSecurityPanelSidebarOrigins = function() {
+  for (var key in Security.SecurityPanelSidebarTree.OriginGroupName) {
+    var originGroupName = Security.SecurityPanelSidebarTree.OriginGroupName[key];
+    var originGroup = Security.SecurityPanel._instance()._sidebarTree._originGroups.get(originGroupName);
+
+    if (originGroup.hidden)
+      continue;
+
+    TestRunner.addResult('Group: ' + originGroupName);
+    var originTitles = originGroup.childrenListElement.getElementsByClassName('title');
+
+    for (var originTitle of originTitles)
+      TestRunner.dumpDeepInnerHTML(originTitle);
+  }
+};
+
+SecurityTestRunner.dispatchRequestFinished = function(request) {
+  TestRunner.networkManager.dispatchEventToListeners(SDK.NetworkManager.Events.RequestFinished, request);
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/security_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/security_test_runner/module.json
new file mode 100644
index 0000000..20d36679
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/security_test_runner/module.json
@@ -0,0 +1,13 @@
+{
+  "dependencies": [
+    "test_runner",
+    "integration_test_runner",
+    "security"
+  ],
+  "scripts": [
+    "SecurityTestRunner.js"
+  ],
+  "skip_compilation": [
+    "SecurityTestRunner.js"
+  ]
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/AutocompleteTestRunner.js b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/AutocompleteTestRunner.js
new file mode 100644
index 0000000..8a71653
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/AutocompleteTestRunner.js
@@ -0,0 +1,42 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+SourcesTestRunner.dumpSuggestions = function(textEditor, lines) {
+  var resolve;
+  var promise = new Promise(fulfill => resolve = fulfill);
+  var lineNumber = -1, columnNumber;
+
+  for (var i = 0; i < lines.length; ++i) {
+    var columnNumber = lines[i].indexOf('|');
+
+    if (columnNumber !== -1) {
+      lineNumber = i;
+      break;
+    }
+  }
+
+  if (lineNumber === -1)
+    throw new Error('Test case is invalid: cursor position is not marked with \'|\' symbol.');
+
+  textEditor.setText(lines.join('\n').replace('|', ''));
+  textEditor.setSelection(TextUtils.TextRange.createFromLocation(lineNumber, columnNumber));
+  TestRunner.addSniffer(
+      TextEditor.TextEditorAutocompleteController.prototype, '_onSuggestionsShownForTest', suggestionsShown);
+  textEditor._autocompleteController.autocomplete();
+
+  function suggestionsShown(words) {
+    TestRunner.addResult('========= Selection In Editor =========');
+    SourcesTestRunner.dumpTextWithSelection(textEditor);
+    TestRunner.addResult('======= Autocomplete Suggestions =======');
+    TestRunner.addResult('[' + words.map(item => item.text).join(', ') + ']');
+    resolve();
+  }
+
+  return promise;
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/BreakpointManagerTestRunner.js b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/BreakpointManagerTestRunner.js
new file mode 100644
index 0000000..88aec2c
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/BreakpointManagerTestRunner.js
@@ -0,0 +1,430 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+SourcesTestRunner.createWorkspace = function() {
+  SourcesTestRunner.testTargetManager = new SDK.TargetManager();
+  SourcesTestRunner.testWorkspace = new Workspace.Workspace();
+  SourcesTestRunner.testNetworkProjectManager =
+      new Bindings.NetworkProjectManager(SourcesTestRunner.testTargetManager, SourcesTestRunner.testWorkspace);
+  SourcesTestRunner.testResourceMapping =
+      new Bindings.ResourceMapping(SourcesTestRunner.testTargetManager, SourcesTestRunner.testWorkspace);
+  SourcesTestRunner.testDebuggerWorkspaceBinding =
+      new Bindings.DebuggerWorkspaceBinding(SourcesTestRunner.testTargetManager, SourcesTestRunner.testWorkspace);
+  Bindings.resourceMapping = SourcesTestRunner.testResourceMapping;
+};
+
+function resourceMappingModelInfoForTarget(target) {
+  var resourceTreeModel = target.model(SDK.ResourceTreeModel);
+  var binding = (resourceTreeModel ? SourcesTestRunner.testResourceMapping._modelToInfo.get(resourceTreeModel) : null);
+  return binding;
+}
+
+SourcesTestRunner.createMockTarget = function(id) {
+  var capabilities = SDK.Target.Capability.AllForTests;
+
+  var target = SourcesTestRunner.testTargetManager.createTarget(
+      'mock-target-id-' + id, 'mock-target-' + id, capabilities & ~SDK.Target.Capability.JS,
+      params => new SDK.StubConnection(params), null);
+
+  SourcesTestRunner.testNetworkProject = Bindings.NetworkProject.forTarget(target);
+  SourcesTestRunner.testResourceMappingModelInfo = resourceMappingModelInfoForTarget(target);
+  target._capabilitiesMask = capabilities;
+  target._inspectedURL = TestRunner.mainTarget.inspectedURL();
+  target.resourceTreeModel = target.model(SDK.ResourceTreeModel);
+  target.resourceTreeModel._cachedResourcesProcessed = true;
+  target.resourceTreeModel._frameAttached('42', 0);
+  target.runtimeModel = target.model(SDK.RuntimeModel);
+  target.debuggerModel = new SourcesTestRunner.DebuggerModelMock(target);
+  target._modelByConstructor.set(SDK.DebuggerModel, target.debuggerModel);
+  SourcesTestRunner.testTargetManager.modelAdded(target, SDK.DebuggerModel, target.debuggerModel);
+  return target;
+};
+
+SourcesTestRunner.uiSourceCodes = {};
+
+SourcesTestRunner.initializeDefaultMappingOnTarget = function(target) {
+  var defaultMapping = {
+    rawLocationToUILocation: function(rawLocation) {
+      return null;
+    },
+
+    uiLocationToRawLocation: function(uiSourceCode, lineNumber) {
+      if (!SourcesTestRunner.uiSourceCodes[uiSourceCode.url()])
+        return null;
+
+      return new SDK.DebuggerModel.Location(target.debuggerModel, uiSourceCode.url(), lineNumber, 0);
+    },
+
+    isIdentity: function() {
+      return true;
+    }
+  };
+
+  target.defaultMapping = defaultMapping;
+};
+
+SourcesTestRunner.DebuggerModelMock = class extends SDK.SDKModel {
+  sourceMapManager() {
+    return this._sourceMapManager;
+  }
+
+  constructor(target) {
+    super(target);
+    this._sourceMapManager = new SDK.SourceMapManager();
+    this._target = target;
+    this._breakpointResolvedEventTarget = new Common.Object();
+    this._scripts = {};
+    this._breakpoints = {};
+    this._debuggerWorkspaceBinding = SourcesTestRunner.testDebuggerWorkspaceBinding;
+  }
+
+  target() {
+    return this._target;
+  }
+
+  runtimeModel() {
+    return this._target.runtimeModel;
+  }
+
+  setBeforePausedCallback(callback) {
+  }
+
+  debuggerEnabled() {
+    return true;
+  }
+
+  scriptsForSourceURL(url) {
+    var script = this._scriptForURL(url);
+    return (script ? [script] : []);
+  }
+
+  _addScript(scriptId, url) {
+    var script = new SDK.Script(this, scriptId, url);
+    this._scripts[scriptId] = script;
+    var modelData = this._debuggerWorkspaceBinding._debuggerModelToData.get(this);
+
+    modelData._defaultMapping._parsedScriptSource({data: script});
+
+    modelData._resourceMapping._parsedScriptSource({data: script});
+  }
+
+  _scriptForURL(url) {
+    for (var scriptId in this._scripts) {
+      var script = this._scripts[scriptId];
+
+      if (script.sourceURL === url)
+        return script;
+    }
+  }
+
+  _scheduleSetBeakpointCallback(callback, breakpointId, locations) {
+    setTimeout(innerCallback.bind(this), 0);
+
+    function innerCallback() {
+      if (callback)
+        callback(breakpointId, locations);
+
+      if (window.setBreakpointCallback) {
+        var savedCallback = window.setBreakpointCallback;
+        delete window.setBreakpointCallback;
+        savedCallback();
+      }
+    }
+  }
+
+  createRawLocation(script, line, column) {
+    return new SDK.DebuggerModel.Location(this, script.scriptId, line, column);
+  }
+
+  createRawLocationByURL(url, line, column) {
+    var script = this._scriptForURL(url);
+
+    if (!script)
+      return null;
+
+    return new SDK.DebuggerModel.Location(this, script.scriptId, line, column);
+  }
+
+  setBreakpointByURL(url, lineNumber, columnNumber, condition, callback) {
+    TestRunner.addResult('    debuggerModel.setBreakpoint(' + [url, lineNumber, condition].join(':') + ')');
+    var breakpointId = url + ':' + lineNumber;
+
+    if (this._breakpoints[breakpointId]) {
+      this._scheduleSetBeakpointCallback(callback, null);
+      return;
+    }
+
+    this._breakpoints[breakpointId] = true;
+
+    if (lineNumber >= 2000) {
+      this._scheduleSetBeakpointCallback(callback, breakpointId, []);
+      return;
+    }
+
+    if (lineNumber >= 1000) {
+      var shiftedLocation = new SDK.DebuggerModel.Location(this, url, lineNumber + 10, columnNumber);
+      this._scheduleSetBeakpointCallback(callback, breakpointId, [shiftedLocation]);
+      return;
+    }
+
+    var locations = [];
+    var script = this._scriptForURL(url);
+
+    if (script) {
+      var location = new SDK.DebuggerModel.Location(this, script.scriptId, lineNumber, 0);
+      locations.push(location);
+    }
+
+    this._scheduleSetBeakpointCallback(callback, breakpointId, locations);
+  }
+
+  async removeBreakpoint(breakpointId) {
+    TestRunner.addResult('    debuggerModel.removeBreakpoint(' + breakpointId + ')');
+    delete this._breakpoints[breakpointId];
+  }
+
+  setBreakpointsActive() {
+  }
+
+  scriptForId(scriptId) {
+    return this._scripts[scriptId];
+  }
+
+  reset() {
+    TestRunner.addResult('  Resetting debugger.');
+    this._scripts = {};
+    this._debuggerWorkspaceBinding._reset(this);
+  }
+
+  addBreakpointListener(breakpointId, listener, thisObject) {
+    this._breakpointResolvedEventTarget.addEventListener(breakpointId, listener, thisObject);
+  }
+
+  removeBreakpointListener(breakpointId, listener, thisObject) {
+    this._breakpointResolvedEventTarget.removeEventListener(breakpointId, listener, thisObject);
+  }
+
+  _breakpointResolved(breakpointId, location) {
+    this._breakpointResolvedEventTarget.dispatchEventToListeners(breakpointId, location);
+  }
+};
+
+SourcesTestRunner.setupLiveLocationSniffers = function() {
+  TestRunner.addSniffer(Bindings.DebuggerWorkspaceBinding.prototype, 'createLiveLocation', function(rawLocation) {
+    TestRunner.addResult('    Location created: ' + rawLocation.scriptId + ':' + rawLocation.lineNumber);
+  }, true);
+
+  TestRunner.addSniffer(Bindings.DebuggerWorkspaceBinding.Location.prototype, 'dispose', function() {
+    TestRunner.addResult('    Location disposed: ' + this._rawLocation.scriptId + ':' + this._rawLocation.lineNumber);
+  }, true);
+};
+
+SourcesTestRunner.addScript = function(target, breakpointManager, url) {
+  target.debuggerModel._addScript(url, url);
+  TestRunner.addResult('  Adding script: ' + url);
+};
+
+SourcesTestRunner.addUISourceCode = function(target, breakpointManager, url, doNotSetSourceMapping, doNotAddScript) {
+  if (!doNotAddScript)
+    SourcesTestRunner.addScript(target, breakpointManager, url);
+
+  TestRunner.addResult('  Adding UISourceCode: ' + url);
+  var resourceMappingModelInfo = resourceMappingModelInfoForTarget(target);
+
+  if (resourceMappingModelInfo._bindings.has(url)) {
+    resourceMappingModelInfo._bindings.get(url).dispose();
+    resourceMappingModelInfo._bindings.delete(url);
+  }
+
+  var resource =
+      new SDK.Resource(target, null, url, url, '', '', Common.resourceTypes.Document, 'text/html', null, null);
+
+  resourceMappingModelInfo._resourceAdded({data: resource});
+
+  uiSourceCode = SourcesTestRunner.testWorkspace.uiSourceCodeForURL(url);
+  SourcesTestRunner.uiSourceCodes[url] = uiSourceCode;
+
+  if (!doNotSetSourceMapping)
+    breakpointManager._debuggerWorkspaceBinding.updateLocations(target.debuggerModel.scriptForId(url));
+
+
+  return uiSourceCode;
+};
+
+SourcesTestRunner.createBreakpointManager = function(targetManager, debuggerWorkspaceBinding, persistentBreakpoints) {
+  SourcesTestRunner._pendingBreakpointUpdates = 0;
+  TestRunner.addSniffer(
+      Bindings.BreakpointManager.ModelBreakpoint.prototype, '_updateInDebugger', updateInDebugger, true);
+  TestRunner.addSniffer(
+      Bindings.BreakpointManager.ModelBreakpoint.prototype, '_didUpdateInDebugger', didUpdateInDebugger, true);
+
+  function updateInDebugger() {
+    SourcesTestRunner._pendingBreakpointUpdates++;
+  }
+
+  function didUpdateInDebugger() {
+    SourcesTestRunner._pendingBreakpointUpdates--;
+    SourcesTestRunner._notifyAfterBreakpointUpdate();
+  }
+
+  persistentBreakpoints = persistentBreakpoints || [];
+
+  var setting = {
+    get: function() {
+      return persistentBreakpoints;
+    },
+
+    set: function(breakpoints) {
+      persistentBreakpoints = breakpoints;
+    }
+  };
+
+  function breakpointAdded(event) {
+    var breakpoint = event.data.breakpoint;
+    var uiLocation = event.data.uiLocation;
+
+    TestRunner.addResult('    breakpointAdded(' + [
+      uiLocation.uiSourceCode.url(), uiLocation.lineNumber, uiLocation.columnNumber, breakpoint.condition(),
+      breakpoint.enabled()
+    ].join(', ') + ')');
+  }
+
+  function breakpointRemoved(event) {
+    var uiLocation = event.data.uiLocation;
+
+    TestRunner.addResult('    breakpointRemoved(' + [
+      uiLocation.uiSourceCode.url(), uiLocation.lineNumber, uiLocation.columnNumber
+    ].join(', ') + ')');
+  }
+
+  var targets = targetManager.targets();
+  var mappingForManager;
+
+  for (var i = 0; i < targets.length; ++i) {
+    SourcesTestRunner.initializeDefaultMappingOnTarget(targets[i]);
+
+    if (!mappingForManager)
+      mappingForManager = targets[i].defaultMapping;
+  }
+
+  var breakpointManager = new Bindings.BreakpointManager(
+      setting, debuggerWorkspaceBinding._workspace, targetManager, debuggerWorkspaceBinding);
+  breakpointManager.defaultMapping = mappingForManager;
+  breakpointManager.addEventListener(Bindings.BreakpointManager.Events.BreakpointAdded, breakpointAdded);
+  breakpointManager.addEventListener(Bindings.BreakpointManager.Events.BreakpointRemoved, breakpointRemoved);
+  TestRunner.addResult('  Created breakpoints manager');
+  SourcesTestRunner.dumpBreakpointStorage(breakpointManager);
+  return breakpointManager;
+};
+
+SourcesTestRunner.setBreakpoint = function(
+    breakpointManager, uiSourceCode, lineNumber, columnNumber, condition, enabled, setBreakpointCallback) {
+  TestRunner.addResult(
+      '  Setting breakpoint at ' + uiSourceCode.url() + ':' + lineNumber + ':' + columnNumber + ' enabled:' + enabled +
+      ' condition:' + condition);
+
+  if (setBreakpointCallback)
+    window.setBreakpointCallback = setBreakpointCallback;
+
+  return breakpointManager.setBreakpoint(uiSourceCode, lineNumber, columnNumber, condition, enabled);
+};
+
+SourcesTestRunner.removeBreakpoint = function(breakpointManager, uiSourceCode, lineNumber, columnNumber) {
+  TestRunner.addResult('  Removing breakpoint at ' + uiSourceCode.url() + ':' + lineNumber + ':' + columnNumber);
+  breakpointManager.findBreakpoint(uiSourceCode, lineNumber, columnNumber).remove();
+};
+
+SourcesTestRunner.dumpBreakpointStorage = function(breakpointManager) {
+  var breakpoints = breakpointManager._storage._setting.get();
+  TestRunner.addResult('  Dumping Storage');
+
+  for (var i = 0; i < breakpoints.length; ++i) {
+    TestRunner.addResult(
+        '    ' + breakpoints[i].url + ':' + breakpoints[i].lineNumber + ' enabled:' + breakpoints[i].enabled +
+        ' condition:' + breakpoints[i].condition);
+  }
+};
+
+SourcesTestRunner.dumpBreakpointLocations = function(breakpointManager) {
+  var allBreakpointLocations = breakpointManager.allBreakpointLocations();
+  TestRunner.addResult('  Dumping Breakpoint Locations');
+  var lastUISourceCode = null;
+  var locations = [];
+
+  function dumpLocations(uiSourceCode, locations) {
+    locations.sort(function(a, b) {
+      return a.lineNumber - b.lineNumber;
+    });
+
+    TestRunner.addResult('    UISourceCode (url=\'' + uiSourceCode.url() + '\', uri=\'' + uiSourceCode.url() + '\')');
+
+    for (var i = 0; i < locations.length; ++i)
+      TestRunner.addResult('      Location: (' + locations[i].lineNumber + ', ' + locations[i].columnNumber + ')');
+  }
+
+  for (var i = 0; i < allBreakpointLocations.length; ++i) {
+    var uiLocation = allBreakpointLocations[i].uiLocation;
+    var uiSourceCode = uiLocation.uiSourceCode;
+
+    if (lastUISourceCode && lastUISourceCode !== uiSourceCode) {
+      dumpLocations(uiSourceCode, locations);
+      locations = [];
+    }
+
+    lastUISourceCode = uiSourceCode;
+    locations.push(uiLocation);
+  }
+
+  if (lastUISourceCode)
+    dumpLocations(lastUISourceCode, locations);
+};
+
+SourcesTestRunner.resetBreakpointManager = function(breakpointManager, next) {
+  TestRunner.addResult('  Resetting breakpoint manager');
+  breakpointManager.removeAllBreakpoints();
+  breakpointManager.removeProvisionalBreakpointsForTest();
+  SourcesTestRunner.uiSourceCodes = {};
+  next();
+};
+
+SourcesTestRunner.runAfterPendingBreakpointUpdates = function(breakpointManager, callback) {
+  SourcesTestRunner._pendingBreakpointUpdatesCallback = callback;
+  SourcesTestRunner._notifyAfterBreakpointUpdate();
+};
+
+SourcesTestRunner._notifyAfterBreakpointUpdate = function() {
+  if (!SourcesTestRunner._pendingBreakpointUpdates && SourcesTestRunner._pendingBreakpointUpdatesCallback) {
+    var callback = SourcesTestRunner._pendingBreakpointUpdatesCallback;
+    delete SourcesTestRunner._pendingBreakpointUpdatesCallback;
+    callback();
+  }
+};
+
+SourcesTestRunner.finishBreakpointTest = function(breakpointManager, next) {
+  SourcesTestRunner.runAfterPendingBreakpointUpdates(breakpointManager, dump);
+
+  function dump() {
+    SourcesTestRunner.dumpBreakpointLocations(breakpointManager);
+    SourcesTestRunner.dumpBreakpointStorage(breakpointManager);
+    SourcesTestRunner.runAfterPendingBreakpointUpdates(breakpointManager, reset);
+  }
+
+  function reset() {
+    SourcesTestRunner.resetBreakpointManager(breakpointManager, didReset);
+  }
+
+  function didReset() {
+    SourcesTestRunner.runAfterPendingBreakpointUpdates(breakpointManager, finish);
+  }
+
+  function finish() {
+    SourcesTestRunner.dumpBreakpointLocations(breakpointManager);
+    next();
+  }
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/DebuggerTestRunner.js b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/DebuggerTestRunner.js
new file mode 100644
index 0000000..3f52c02
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/DebuggerTestRunner.js
@@ -0,0 +1,757 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+SourcesTestRunner.startDebuggerTest = function(callback, quiet) {
+  console.assert(TestRunner.debuggerModel.debuggerEnabled(), 'Debugger has to be enabled');
+
+  if (quiet !== undefined)
+    SourcesTestRunner._quiet = quiet;
+
+  UI.viewManager.showView('sources');
+  TestRunner.addSniffer(SDK.DebuggerModel.prototype, '_pausedScript', SourcesTestRunner._pausedScript, true);
+  TestRunner.addSniffer(SDK.DebuggerModel.prototype, '_resumedScript', SourcesTestRunner._resumedScript, true);
+  TestRunner.safeWrap(callback)();
+};
+
+SourcesTestRunner.startDebuggerTestPromise = function(quiet) {
+  var cb;
+  var p = new Promise(fullfill => cb = fullfill);
+  SourcesTestRunner.startDebuggerTest(cb, quiet);
+  return p;
+};
+
+SourcesTestRunner.completeDebuggerTest = function() {
+  Bindings.breakpointManager.setBreakpointsActive(true);
+  SourcesTestRunner.resumeExecution(TestRunner.completeTest.bind(TestRunner));
+};
+
+(function() {
+var origThen = Promise.prototype.then;
+var origCatch = Promise.prototype.catch;
+
+Promise.prototype.then = function() {
+  var result = origThen.apply(this, arguments);
+  origThen.call(result, undefined, onUncaughtPromiseReject.bind(null, new Error().stack));
+  return result;
+};
+
+Promise.prototype.catch = function() {
+  var result = origCatch.apply(this, arguments);
+  origThen.call(result, undefined, onUncaughtPromiseReject.bind(null, new Error().stack));
+  return result;
+};
+
+function onUncaughtPromiseReject(stack, e) {
+  var message = typeof e === 'object' && e.stack || e;
+  TestRunner.addResult('FAIL: Uncaught exception in promise: ' + message + ' ' + stack);
+  SourcesTestRunner.completeDebuggerTest();
+}
+})();
+
+SourcesTestRunner.runDebuggerTestSuite = function(testSuite) {
+  var testSuiteTests = testSuite.slice();
+
+  function runner() {
+    if (!testSuiteTests.length) {
+      SourcesTestRunner.completeDebuggerTest();
+      return;
+    }
+
+    var nextTest = testSuiteTests.shift();
+    TestRunner.addResult('');
+    TestRunner.addResult(
+        'Running: ' +
+        /function\s([^(]*)/.exec(nextTest)[1]);
+    TestRunner.safeWrap(nextTest)(runner, runner);
+  }
+
+  SourcesTestRunner.startDebuggerTest(runner);
+};
+
+SourcesTestRunner.runTestFunction = function() {
+  TestRunner.evaluateInPage('scheduleTestFunction()');
+  TestRunner.addResult('Set timer for test function.');
+};
+
+SourcesTestRunner.runTestFunctionAndWaitUntilPaused = function(callback) {
+  SourcesTestRunner.runTestFunction();
+  SourcesTestRunner.waitUntilPaused(callback);
+};
+
+SourcesTestRunner.runTestFunctionAndWaitUntilPausedPromise = function() {
+  return new Promise(SourcesTestRunner.runTestFunctionAndWaitUntilPaused);
+};
+
+SourcesTestRunner.runAsyncCallStacksTest = function(totalDebuggerStatements, maxAsyncCallStackDepth) {
+  var defaultMaxAsyncCallStackDepth = 32;
+  SourcesTestRunner.setQuiet(true);
+  SourcesTestRunner.startDebuggerTest(step1);
+
+  async function step1() {
+    await TestRunner.DebuggerAgent.setAsyncCallStackDepth(maxAsyncCallStackDepth || defaultMaxAsyncCallStackDepth);
+    SourcesTestRunner.runTestFunctionAndWaitUntilPaused(didPause);
+  }
+
+  var step = 0;
+  var callStacksOutput = [];
+
+  function didPause(callFrames, reason, breakpointIds, asyncStackTrace) {
+    ++step;
+    callStacksOutput.push(SourcesTestRunner.captureStackTraceIntoString(callFrames, asyncStackTrace) + '\n');
+
+    if (step < totalDebuggerStatements) {
+      SourcesTestRunner.resumeExecution(SourcesTestRunner.waitUntilPaused.bind(SourcesTestRunner, didPause));
+    } else {
+      TestRunner.addResult('Captured call stacks in no particular order:');
+      callStacksOutput.sort();
+      TestRunner.addResults(callStacksOutput);
+      SourcesTestRunner.completeDebuggerTest();
+    }
+  }
+};
+
+SourcesTestRunner.dumpSourceFrameMessages = function(sourceFrame, dumpFullURL) {
+  var messages = [];
+
+  for (var bucket of sourceFrame._rowMessageBuckets.values()) {
+    for (var rowMessage of bucket._messages) {
+      var message = rowMessage.message();
+      messages.push(String.sprintf(
+          '  %d:%d [%s] %s', message.lineNumber(), message.columnNumber(), message.level(), message.text()));
+    }
+  }
+
+  var name = (dumpFullURL ? sourceFrame.uiSourceCode().url() : sourceFrame.uiSourceCode().displayName());
+  TestRunner.addResult('SourceFrame ' + name + ': ' + messages.length + ' message(s)');
+  TestRunner.addResult(messages.join('\n'));
+};
+
+SourcesTestRunner.waitUntilPausedNextTime = function(callback) {
+  SourcesTestRunner._waitUntilPausedCallback = TestRunner.safeWrap(callback);
+};
+
+SourcesTestRunner.waitUntilPaused = function(callback) {
+  callback = TestRunner.safeWrap(callback);
+
+  if (SourcesTestRunner._pausedScriptArguments)
+    callback.apply(callback, SourcesTestRunner._pausedScriptArguments);
+  else
+    SourcesTestRunner._waitUntilPausedCallback = callback;
+};
+
+SourcesTestRunner.waitUntilPausedPromise = function() {
+  return new Promise(resolve => SourcesTestRunner.waitUntilPaused(resolve));
+};
+
+SourcesTestRunner.waitUntilResumedNextTime = function(callback) {
+  SourcesTestRunner._waitUntilResumedCallback = TestRunner.safeWrap(callback);
+};
+
+SourcesTestRunner.waitUntilResumed = function(callback) {
+  callback = TestRunner.safeWrap(callback);
+
+  if (!SourcesTestRunner._pausedScriptArguments)
+    callback();
+  else
+    SourcesTestRunner._waitUntilResumedCallback = callback;
+};
+
+SourcesTestRunner.resumeExecution = function(callback) {
+  if (UI.panels.sources.paused())
+    UI.panels.sources._togglePause();
+
+  SourcesTestRunner.waitUntilResumed(callback);
+};
+
+SourcesTestRunner.waitUntilPausedAndDumpStackAndResume = function(callback, options) {
+  SourcesTestRunner.waitUntilPaused(paused);
+  TestRunner.addSniffer(Sources.SourcesPanel.prototype, '_updateDebuggerButtonsAndStatus', setStatus);
+  var caption;
+  var callFrames;
+  var asyncStackTrace;
+
+  function setStatus() {
+    var statusElement = this.element.querySelector('.paused-message');
+    caption = statusElement.deepTextContent();
+
+    if (callFrames)
+      step1();
+  }
+
+  function paused(frames, reason, breakpointIds, async) {
+    callFrames = frames;
+    asyncStackTrace = async;
+
+    if (typeof caption === 'string')
+      step1();
+  }
+
+  function step1() {
+    SourcesTestRunner.captureStackTrace(callFrames, asyncStackTrace, options);
+    TestRunner.addResult(TestRunner.clearSpecificInfoFromStackFrames(caption));
+    TestRunner.deprecatedRunAfterPendingDispatches(step2);
+  }
+
+  function step2() {
+    SourcesTestRunner.resumeExecution(TestRunner.safeWrap(callback));
+  }
+};
+
+SourcesTestRunner.stepOver = function() {
+  Promise.resolve().then(function() {
+    UI.panels.sources._stepOver();
+  });
+};
+
+SourcesTestRunner.stepInto = function() {
+  Promise.resolve().then(function() {
+    UI.panels.sources._stepInto();
+  });
+};
+
+SourcesTestRunner.stepOut = function() {
+  Promise.resolve().then(function() {
+    UI.panels.sources._stepOut();
+  });
+};
+
+SourcesTestRunner.togglePause = function() {
+  Promise.resolve().then(function() {
+    UI.panels.sources._togglePause();
+  });
+};
+
+SourcesTestRunner.waitUntilPausedAndPerformSteppingActions = function(actions, callback) {
+  callback = TestRunner.safeWrap(callback);
+  SourcesTestRunner.waitUntilPaused(didPause);
+
+  function didPause(callFrames, reason, breakpointIds, asyncStackTrace) {
+    var action = actions.shift();
+
+    if (action === 'Print') {
+      SourcesTestRunner.captureStackTrace(callFrames, asyncStackTrace);
+      TestRunner.addResult('');
+
+      while (action === 'Print')
+        action = actions.shift();
+    }
+
+    if (!action) {
+      callback();
+      return;
+    }
+
+    TestRunner.addResult('Executing ' + action + '...');
+
+    switch (action) {
+      case 'StepInto':
+        SourcesTestRunner.stepInto();
+        break;
+      case 'StepOver':
+        SourcesTestRunner.stepOver();
+        break;
+      case 'StepOut':
+        SourcesTestRunner.stepOut();
+        break;
+      case 'Resume':
+        SourcesTestRunner.togglePause();
+        break;
+      default:
+        TestRunner.addResult('FAIL: Unknown action: ' + action);
+        callback();
+        return;
+    }
+
+    SourcesTestRunner.waitUntilResumed(
+        (actions.length ? SourcesTestRunner.waitUntilPaused.bind(SourcesTestRunner, didPause) : callback));
+  }
+};
+
+SourcesTestRunner.captureStackTrace = function(callFrames, asyncStackTrace, options) {
+  TestRunner.addResult(SourcesTestRunner.captureStackTraceIntoString(callFrames, asyncStackTrace, options));
+};
+
+SourcesTestRunner.captureStackTraceIntoString = function(callFrames, asyncStackTrace, options) {
+  var results = [];
+  options = options || {};
+
+  function printCallFrames(callFrames, locationFunction, returnValueFunction) {
+    var printed = 0;
+
+    for (var i = 0; i < callFrames.length; i++) {
+      var frame = callFrames[i];
+      var location = locationFunction.call(frame);
+      var script = location.script();
+      var uiLocation = Bindings.debuggerWorkspaceBinding.rawLocationToUILocation(location);
+      var isFramework = Bindings.blackboxManager.isBlackboxedRawLocation(location);
+
+      if (options.dropFrameworkCallFrames && isFramework)
+        continue;
+
+      var url;
+      var lineNumber;
+
+      if (uiLocation && uiLocation.uiSourceCode.project().type() !== Workspace.projectTypes.Debugger) {
+        url = uiLocation.uiSourceCode.name();
+        lineNumber = uiLocation.lineNumber + 1;
+      } else {
+        url = Bindings.displayNameForURL(script.sourceURL);
+        lineNumber = location.lineNumber + 1;
+      }
+
+      var s = ((isFramework ? '  * ' : '    ')) + printed++ + ') ' + frame.functionName + ' (' + url +
+          ((options.dropLineNumbers ? '' : ':' + lineNumber)) + ')';
+      results.push(s);
+
+      if (options.printReturnValue && returnValueFunction && returnValueFunction.call(frame))
+        results.push('       <return>: ' + returnValueFunction.call(frame).description);
+
+      if (frame.functionName === 'scheduleTestFunction') {
+        var remainingFrames = callFrames.length - 1 - i;
+
+        if (remainingFrames)
+          results.push('    <... skipped remaining frames ...>');
+
+        break;
+      }
+    }
+
+    return printed;
+  }
+
+  function runtimeCallFramePosition() {
+    return new SDK.DebuggerModel.Location(debuggerModel, this.scriptId, this.lineNumber, this.columnNumber);
+  }
+
+  results.push('Call stack:');
+  printCallFrames(
+      callFrames, SDK.DebuggerModel.CallFrame.prototype.location, SDK.DebuggerModel.CallFrame.prototype.returnValue);
+
+  while (asyncStackTrace) {
+    results.push('    [' + (asyncStackTrace.description || 'Async Call') + ']');
+    var debuggerModel = TestRunner.debuggerModel;
+    var printed = printCallFrames(asyncStackTrace.callFrames, runtimeCallFramePosition);
+
+    if (!printed)
+      results.pop();
+
+    asyncStackTrace = asyncStackTrace.parent;
+  }
+
+  return results.join('\n');
+};
+
+SourcesTestRunner.dumpSourceFrameContents = function(sourceFrame) {
+  TestRunner.addResult('==Source frame contents start==');
+  var textEditor = sourceFrame._textEditor;
+
+  for (var i = 0; i < textEditor.linesCount; ++i)
+    TestRunner.addResult(textEditor.line(i));
+
+  TestRunner.addResult('==Source frame contents end==');
+};
+
+SourcesTestRunner._pausedScript = function(callFrames, reason, auxData, breakpointIds, asyncStackTrace) {
+  if (!SourcesTestRunner._quiet)
+    TestRunner.addResult('Script execution paused.');
+
+  var debuggerModel = this.target().model(SDK.DebuggerModel);
+  SourcesTestRunner._pausedScriptArguments = [
+    SDK.DebuggerModel.CallFrame.fromPayloadArray(debuggerModel, callFrames), reason, breakpointIds, asyncStackTrace,
+    auxData
+  ];
+
+  if (SourcesTestRunner._waitUntilPausedCallback) {
+    var callback = SourcesTestRunner._waitUntilPausedCallback;
+    delete SourcesTestRunner._waitUntilPausedCallback;
+    setTimeout(() => callback.apply(callback, SourcesTestRunner._pausedScriptArguments));
+  }
+};
+
+SourcesTestRunner._resumedScript = function() {
+  if (!SourcesTestRunner._quiet)
+    TestRunner.addResult('Script execution resumed.');
+
+  delete SourcesTestRunner._pausedScriptArguments;
+
+  if (SourcesTestRunner._waitUntilResumedCallback) {
+    var callback = SourcesTestRunner._waitUntilResumedCallback;
+    delete SourcesTestRunner._waitUntilResumedCallback;
+    callback();
+  }
+};
+
+SourcesTestRunner.showUISourceCode = function(uiSourceCode, callback) {
+  var panel = UI.panels.sources;
+  panel.showUISourceCode(uiSourceCode);
+  var sourceFrame = panel.visibleView;
+
+  if (sourceFrame.loaded)
+    callback(sourceFrame);
+  else
+    TestRunner.addSniffer(sourceFrame, 'onTextEditorContentSet', callback && callback.bind(null, sourceFrame));
+};
+
+SourcesTestRunner.showUISourceCodePromise = function(uiSourceCode) {
+  var fulfill;
+  var promise = new Promise(x => fulfill = x);
+  SourcesTestRunner.showUISourceCode(uiSourceCode, fulfill);
+  return promise;
+};
+
+SourcesTestRunner.showScriptSource = function(scriptName, callback) {
+  SourcesTestRunner.waitForScriptSource(scriptName, onScriptSource);
+
+  function onScriptSource(uiSourceCode) {
+    SourcesTestRunner.showUISourceCode(uiSourceCode, callback);
+  }
+};
+
+SourcesTestRunner.waitForScriptSource = function(scriptName, callback) {
+  var panel = UI.panels.sources;
+  var uiSourceCodes = panel._workspace.uiSourceCodes();
+
+  for (var i = 0; i < uiSourceCodes.length; ++i) {
+    if (uiSourceCodes[i].project().type() === Workspace.projectTypes.Service)
+      continue;
+
+    if (uiSourceCodes[i].name() === scriptName) {
+      callback(uiSourceCodes[i]);
+      return;
+    }
+  }
+
+  TestRunner.addSniffer(
+      Sources.SourcesView.prototype, '_addUISourceCode',
+      SourcesTestRunner.waitForScriptSource.bind(SourcesTestRunner, scriptName, callback));
+};
+
+SourcesTestRunner.setBreakpoint = function(sourceFrame, lineNumber, condition, enabled) {
+  if (!sourceFrame._muted)
+    sourceFrame._setBreakpoint(lineNumber, 0, condition, enabled);
+};
+
+SourcesTestRunner.removeBreakpoint = function(sourceFrame, lineNumber) {
+  sourceFrame._breakpointManager.findBreakpoints(sourceFrame._uiSourceCode, lineNumber)[0].remove();
+};
+
+SourcesTestRunner.createNewBreakpoint = function(sourceFrame, lineNumber, condition, enabled) {
+  var promise =
+      new Promise(resolve => TestRunner.addSniffer(sourceFrame.__proto__, '_breakpointWasSetForTest', resolve));
+  sourceFrame._createNewBreakpoint(lineNumber, condition, enabled);
+  return promise;
+};
+
+SourcesTestRunner.toggleBreakpoint = function(sourceFrame, lineNumber, disableOnly) {
+  if (!sourceFrame._muted)
+    sourceFrame._toggleBreakpoint(lineNumber, disableOnly);
+};
+
+SourcesTestRunner.waitBreakpointSidebarPane = function(waitUntilResolved) {
+  return new Promise(
+             resolve => TestRunner.addSniffer(
+                 Sources.JavaScriptBreakpointsSidebarPane.prototype, '_didUpdateForTest', resolve))
+      .then(checkIfReady);
+
+  function checkIfReady() {
+    if (!waitUntilResolved)
+      return;
+
+    for (var breakpoint of Bindings.breakpointManager._allBreakpoints()) {
+      if (breakpoint._fakePrimaryLocation && breakpoint.enabled())
+        return SourcesTestRunner.waitBreakpointSidebarPane();
+    }
+  }
+};
+
+SourcesTestRunner.breakpointsSidebarPaneContent = function() {
+  var paneElement = self.runtime.sharedInstance(Sources.JavaScriptBreakpointsSidebarPane).contentElement;
+  var empty = paneElement.querySelector('.gray-info-message');
+
+  if (empty)
+    return TestRunner.textContentWithLineBreaks(empty);
+
+  var entries = Array.from(paneElement.querySelectorAll('.breakpoint-entry'));
+  return entries.map(TestRunner.textContentWithLineBreaks).join('\n');
+};
+
+SourcesTestRunner.dumpBreakpointSidebarPane = function(title) {
+  TestRunner.addResult('Breakpoint sidebar pane ' + (title || ''));
+  TestRunner.addResult(SourcesTestRunner.breakpointsSidebarPaneContent());
+};
+
+SourcesTestRunner.dumpScopeVariablesSidebarPane = function() {
+  TestRunner.addResult('Scope variables sidebar pane:');
+  var sections = SourcesTestRunner.scopeChainSections();
+
+  for (var i = 0; i < sections.length; ++i) {
+    var textContent = TestRunner.textContentWithLineBreaks(sections[i].element);
+    var text = TestRunner.clearSpecificInfoFromStackFrames(textContent);
+
+    if (text.length > 0)
+      TestRunner.addResult(text);
+
+    if (!sections[i].objectTreeElement().expanded)
+      TestRunner.addResult('    <section collapsed>');
+  }
+};
+
+SourcesTestRunner.scopeChainSections = function() {
+  var children = self.runtime.sharedInstance(Sources.ScopeChainSidebarPane).contentElement.children;
+  var sections = [];
+
+  for (var i = 0; i < children.length; ++i)
+    sections.push(children[i]._section);
+
+  return sections;
+};
+
+SourcesTestRunner.expandScopeVariablesSidebarPane = function(callback) {
+  var sections = SourcesTestRunner.scopeChainSections();
+
+  for (var i = 0; i < sections.length - 1; ++i)
+    sections[i].expand();
+
+  TestRunner.deprecatedRunAfterPendingDispatches(callback);
+};
+
+SourcesTestRunner.expandProperties = function(properties, callback) {
+  var index = 0;
+
+  function expandNextPath() {
+    if (index === properties.length) {
+      TestRunner.safeWrap(callback)();
+      return;
+    }
+
+    var parentTreeElement = properties[index++];
+    var path = properties[index++];
+    SourcesTestRunner._expandProperty(parentTreeElement, path, 0, expandNextPath);
+  }
+
+  TestRunner.deprecatedRunAfterPendingDispatches(expandNextPath);
+};
+
+SourcesTestRunner._expandProperty = function(parentTreeElement, path, pathIndex, callback) {
+  if (pathIndex === path.length) {
+    TestRunner.addResult('Expanded property: ' + path.join('.'));
+    callback();
+    return;
+  }
+
+  var name = path[pathIndex++];
+  var propertyTreeElement = SourcesTestRunner._findChildPropertyTreeElement(parentTreeElement, name);
+
+  if (!propertyTreeElement) {
+    TestRunner.addResult('Failed to expand property: ' + path.slice(0, pathIndex).join('.'));
+    SourcesTestRunner.completeDebuggerTest();
+    return;
+  }
+
+  propertyTreeElement.expand();
+  TestRunner.deprecatedRunAfterPendingDispatches(
+      SourcesTestRunner._expandProperty.bind(SourcesTestRunner, propertyTreeElement, path, pathIndex, callback));
+};
+
+SourcesTestRunner._findChildPropertyTreeElement = function(parent, childName) {
+  var children = parent.children();
+
+  for (var i = 0; i < children.length; i++) {
+    var treeElement = children[i];
+    var property = treeElement.property;
+
+    if (property.name === childName)
+      return treeElement;
+  }
+};
+
+SourcesTestRunner.setQuiet = function(quiet) {
+  SourcesTestRunner._quiet = quiet;
+};
+
+SourcesTestRunner.queryScripts = function(filter) {
+  var scripts = TestRunner.debuggerModel.scripts();
+  return (filter ? scripts.filter(filter) : scripts);
+};
+
+SourcesTestRunner.createScriptMock = function(
+    url, startLine, startColumn, isContentScript, source, target, preRegisterCallback) {
+  target = target || SDK.targetManager.mainTarget();
+  var debuggerModel = target.model(SDK.DebuggerModel);
+  var scriptId = ++SourcesTestRunner._lastScriptId + '';
+  var lineCount = source.computeLineEndings().length;
+  var endLine = startLine + lineCount - 1;
+  var endColumn =
+      (lineCount === 1 ? startColumn + source.length : source.length - source.computeLineEndings()[lineCount - 2]);
+  var hasSourceURL =
+      !!source.match(/\/\/#\ssourceURL=\s*(\S*?)\s*$/m) || !!source.match(/\/\/@\ssourceURL=\s*(\S*?)\s*$/m);
+
+  var script = new SDK.Script(
+      debuggerModel, scriptId, url, startLine, startColumn, endLine, endColumn, 0, '', isContentScript, false,
+      undefined, hasSourceURL, source.length);
+
+  script.requestContent = function() {
+    var trimmedSource = SDK.Script._trimSourceURLComment(source);
+    return Promise.resolve(trimmedSource);
+  };
+
+  if (preRegisterCallback)
+    preRegisterCallback(script);
+
+  debuggerModel._registerScript(script);
+  return script;
+};
+
+SourcesTestRunner._lastScriptId = 0;
+
+SourcesTestRunner.checkRawLocation = function(script, lineNumber, columnNumber, location) {
+  TestRunner.assertEquals(script.scriptId, location.scriptId, 'Incorrect scriptId');
+  TestRunner.assertEquals(lineNumber, location.lineNumber, 'Incorrect lineNumber');
+  TestRunner.assertEquals(columnNumber, location.columnNumber, 'Incorrect columnNumber');
+};
+
+SourcesTestRunner.checkUILocation = function(uiSourceCode, lineNumber, columnNumber, location) {
+  TestRunner.assertEquals(
+      uiSourceCode, location.uiSourceCode,
+      'Incorrect uiSourceCode, expected \'' + ((uiSourceCode ? uiSourceCode.url() : null)) + '\',' +
+          ' but got \'' + ((location.uiSourceCode ? location.uiSourceCode.url() : null)) + '\'');
+
+  TestRunner.assertEquals(
+      lineNumber, location.lineNumber,
+      'Incorrect lineNumber, expected \'' + lineNumber + '\', but got \'' + location.lineNumber + '\'');
+
+  TestRunner.assertEquals(
+      columnNumber, location.columnNumber,
+      'Incorrect columnNumber, expected \'' + columnNumber + '\', but got \'' + location.columnNumber + '\'');
+};
+
+SourcesTestRunner.scriptFormatter = function() {
+  return self.runtime.allInstances(Sources.SourcesView.EditorAction).then(function(editorActions) {
+    for (var i = 0; i < editorActions.length; ++i) {
+      if (editorActions[i] instanceof Sources.ScriptFormatterEditorAction)
+        return editorActions[i];
+    }
+
+    return null;
+  });
+};
+
+SourcesTestRunner.waitForExecutionContextInTarget = function(target, callback) {
+  var runtimeModel = target.model(SDK.RuntimeModel);
+
+  if (runtimeModel.executionContexts().length) {
+    callback(runtimeModel.executionContexts()[0]);
+    return;
+  }
+
+  runtimeModel.addEventListener(SDK.RuntimeModel.Events.ExecutionContextCreated, contextCreated);
+
+  function contextCreated() {
+    runtimeModel.removeEventListener(SDK.RuntimeModel.Events.ExecutionContextCreated, contextCreated);
+    callback(runtimeModel.executionContexts()[0]);
+  }
+};
+
+SourcesTestRunner.selectThread = function(target) {
+  var threadsPane = self.runtime.sharedInstance(Sources.ThreadsSidebarPane);
+  threadsPane._list.selectItem(target.model(SDK.DebuggerModel));
+};
+
+SourcesTestRunner.evaluateOnCurrentCallFrame = function(code) {
+  return new Promise(
+      succ => TestRunner.debuggerModel.evaluateOnSelectedCallFrame(
+          code, 'console', false, true, false, false, TestRunner.safeWrap(succ)));
+};
+
+SourcesTestRunner.waitJavaScriptSourceFrameBreakpoints = function(sourceFrame, inline) {
+  return waitUpdate().then(checkIfReady);
+
+  function waitUpdate() {
+    return new Promise(
+        resolve => TestRunner.addSniffer(sourceFrame.__proto__, '_breakpointDecorationsUpdatedForTest', resolve));
+  }
+
+  function checkIfReady() {
+    for (var breakpoint of Bindings.breakpointManager._allBreakpoints()) {
+      if (breakpoint._fakePrimaryLocation && breakpoint.enabled())
+        return waitUpdate().then(checkIfReady);
+    }
+
+    return Promise.resolve();
+  }
+};
+
+SourcesTestRunner.dumpJavaScriptSourceFrameBreakpoints = function(sourceFrame) {
+  var textEditor = sourceFrame._textEditor;
+
+  for (var lineNumber = 0; lineNumber < textEditor.linesCount; ++lineNumber) {
+    if (!textEditor.hasLineClass(lineNumber, 'cm-breakpoint'))
+      continue;
+
+    var disabled = textEditor.hasLineClass(lineNumber, 'cm-breakpoint-disabled');
+    var conditional = textEditor.hasLineClass(lineNumber, 'cm-breakpoint-conditional');
+    TestRunner.addResult(
+        'breakpoint at ' + lineNumber + ((disabled ? ' disabled' : '')) + ((conditional ? ' conditional' : '')));
+    var range = new TextUtils.TextRange(lineNumber, 0, lineNumber, textEditor.line(lineNumber).length);
+    var bookmarks = textEditor.bookmarks(range, Sources.JavaScriptSourceFrame.BreakpointDecoration._bookmarkSymbol);
+    bookmarks = bookmarks.filter(bookmark => !!bookmark.position());
+    bookmarks.sort((bookmark1, bookmark2) => bookmark1.position().startColumn - bookmark2.position().startColumn);
+
+    for (var bookmark of bookmarks) {
+      var position = bookmark.position();
+      var element = bookmark[Sources.JavaScriptSourceFrame.BreakpointDecoration._elementSymbolForTest];
+      var disabled = element.classList.contains('cm-inline-disabled');
+      var conditional = element.classList.contains('cm-inline-conditional');
+
+      TestRunner.addResult(
+          '  inline breakpoint at (' + position.startLine + ', ' + position.startColumn + ')' +
+          ((disabled ? ' disabled' : '')) + ((conditional ? ' conditional' : '')));
+    }
+  }
+};
+
+SourcesTestRunner.clickJavaScriptSourceFrameBreakpoint = function(sourceFrame, lineNumber, index, next) {
+  var textEditor = sourceFrame._textEditor;
+  var lineLength = textEditor.line(lineNumber).length;
+  var lineRange = new TextUtils.TextRange(lineNumber, 0, lineNumber, lineLength);
+  var bookmarks = textEditor.bookmarks(lineRange, Sources.JavaScriptSourceFrame.BreakpointDecoration._bookmarkSymbol);
+  bookmarks.sort((bookmark1, bookmark2) => bookmark1.position().startColumn - bookmark2.position().startColumn);
+  var bookmark = bookmarks[index];
+
+  if (bookmark) {
+    bookmark[Sources.JavaScriptSourceFrame.BreakpointDecoration._elementSymbolForTest].click();
+  } else {
+    TestRunner.addResult(`Could not click on Javascript breakpoint - lineNumber: ${lineNumber}, index: ${index}`);
+    next();
+  }
+};
+
+SourcesTestRunner.setEventListenerBreakpoint = function(id, enabled, targetName) {
+  var pane = self.runtime.sharedInstance(Sources.EventListenerBreakpointsSidebarPane);
+
+  var auxData = {'eventName': id};
+
+  if (targetName)
+    auxData.targetName = targetName;
+
+  var breakpoint = SDK.domDebuggerManager.resolveEventListenerBreakpoint(auxData);
+
+  if (breakpoint.enabled() !== enabled) {
+    pane._breakpoints.get(breakpoint).checkbox.checked = enabled;
+    pane._breakpointCheckboxClicked(breakpoint);
+  }
+};
+
+(async function() {
+  await TestRunner.evaluateInPagePromise(`
+    function scheduleTestFunction() {
+      setTimeout(testFunction, 0);
+    }
+  `);
+})();
diff --git a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/EditorTestRunner.js b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/EditorTestRunner.js
new file mode 100644
index 0000000..59983cc
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/EditorTestRunner.js
@@ -0,0 +1,219 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+SourcesTestRunner.createTestEditor = function(clientHeight, textEditorDelegate) {
+  var textEditor = new SourceFrame.SourcesTextEditor(textEditorDelegate || new SourceFrame.SourcesTextEditorDelegate());
+  clientHeight = clientHeight || 100;
+  textEditor.element.style.height = clientHeight + 'px';
+  textEditor.element.style.flex = 'none';
+  textEditor.show(UI.inspectorView.element);
+  return textEditor;
+};
+
+function textWithSelection(text, selections) {
+  if (!selections.length)
+    return text;
+
+  function lineWithCursor(line, column, cursorChar) {
+    return line.substring(0, column) + cursorChar + line.substring(column);
+  }
+
+  var lines = text.split('\n');
+  selections.sort(TextUtils.TextRange.comparator);
+
+  for (var i = selections.length - 1; i >= 0; --i) {
+    var selection = selections[i];
+    selection = selection.normalize();
+    var endCursorChar = (selection.isEmpty() ? '|' : '<');
+    lines[selection.endLine] = lineWithCursor(lines[selection.endLine], selection.endColumn, endCursorChar);
+
+    if (!selection.isEmpty())
+      lines[selection.startLine] = lineWithCursor(lines[selection.startLine], selection.startColumn, '>');
+  }
+
+  return lines.join('\n');
+}
+
+SourcesTestRunner.dumpTextWithSelection = function(textEditor, dumpWhiteSpaces) {
+  var text = textWithSelection(textEditor.text(), textEditor.selections());
+
+  if (dumpWhiteSpaces)
+    text = text.replace(/ /g, '.');
+
+  TestRunner.addResult(text);
+};
+
+SourcesTestRunner.setLineSelections = function(editor, selections) {
+  var coords = [];
+
+  for (var i = 0; i < selections.length; ++i) {
+    var selection = selections[i];
+
+    if (typeof selection.column === 'number') {
+      selection.from = selection.column;
+      selection.to = selection.column;
+    }
+
+    coords.push(new TextUtils.TextRange(selection.line, selection.from, selection.line, selection.to));
+  }
+
+  editor.setSelections(coords);
+};
+
+SourcesTestRunner.typeIn = function(editor, typeText, callback) {
+  callback = callback || new Function();
+  var noop = new Function();
+
+  for (var charIndex = 0; charIndex < typeText.length; ++charIndex) {
+    var iterationCallback = (charIndex + 1 === typeText.length ? callback : noop);
+
+    switch (typeText[charIndex]) {
+      case '\n':
+        SourcesTestRunner.fakeKeyEvent(editor, 'Enter', null, iterationCallback);
+        break;
+      case 'L':
+        SourcesTestRunner.fakeKeyEvent(editor, 'ArrowLeft', null, iterationCallback);
+        break;
+      case 'R':
+        SourcesTestRunner.fakeKeyEvent(editor, 'ArrowRight', null, iterationCallback);
+        break;
+      case 'U':
+        SourcesTestRunner.fakeKeyEvent(editor, 'ArrowUp', null, iterationCallback);
+        break;
+      case 'D':
+        SourcesTestRunner.fakeKeyEvent(editor, 'ArrowDown', null, iterationCallback);
+        break;
+      default:
+        SourcesTestRunner.fakeKeyEvent(editor, typeText[charIndex], null, iterationCallback);
+    }
+  }
+};
+
+var eventCodes = {Enter: 13, Home: 36, ArrowLeft: 37, ArrowUp: 38, ArrowRight: 39, ArrowDown: 40};
+
+function createCodeMirrorFakeEvent(editor, eventType, code, charCode, modifiers) {
+  function eventPreventDefault() {
+    this._handled = true;
+  }
+
+  var event = {
+    _handled: false,
+    type: eventType,
+    keyCode: code,
+    charCode: charCode,
+    preventDefault: eventPreventDefault,
+    stopPropagation: function() {},
+    target: editor._codeMirror.display.input.textarea
+  };
+
+  if (modifiers) {
+    for (var i = 0; i < modifiers.length; ++i)
+      event[modifiers[i]] = true;
+  }
+
+  return event;
+}
+
+function fakeCodeMirrorKeyEvent(editor, eventType, code, charCode, modifiers) {
+  var event = createCodeMirrorFakeEvent(editor, eventType, code, charCode, modifiers);
+
+  switch (eventType) {
+    case 'keydown':
+      editor._codeMirror.triggerOnKeyDown(event);
+      break;
+    case 'keypress':
+      editor._codeMirror.triggerOnKeyPress(event);
+      break;
+    case 'keyup':
+      editor._codeMirror.triggerOnKeyUp(event);
+      break;
+    default:
+      throw new Error('Unknown KeyEvent type');
+  }
+
+  return event._handled;
+}
+
+function fakeCodeMirrorInputEvent(editor, character) {
+  if (typeof character === 'string')
+    editor._codeMirror.display.input.textarea.value += character;
+}
+
+SourcesTestRunner.fakeKeyEvent = function(editor, originalCode, modifiers, callback) {
+  modifiers = modifiers || [];
+  var code;
+  var charCode;
+
+  if (originalCode === '\'') {
+    code = 222;
+    charCode = 0;
+  } else if (originalCode === '"') {
+    code = 222;
+    modifiers.push('shiftKey');
+    charCode = 34;
+  } else if (originalCode === '(') {
+    code = '9'.charCodeAt(0);
+    modifiers.push('shiftKey');
+    charCode = originalCode.charCodeAt(0);
+  }
+
+  var code = code || eventCodes[originalCode] || originalCode;
+
+  if (typeof code === 'string')
+    code = code.charCodeAt(0);
+
+  if (fakeCodeMirrorKeyEvent(editor, 'keydown', code, charCode, modifiers)) {
+    callback();
+    return;
+  }
+
+  if (fakeCodeMirrorKeyEvent(editor, 'keypress', code, charCode, modifiers)) {
+    callback();
+    return;
+  }
+
+  fakeCodeMirrorInputEvent(editor, originalCode);
+  fakeCodeMirrorKeyEvent(editor, 'keyup', code, charCode, modifiers);
+
+  function callbackWrapper() {
+    editor._codeMirror.off('inputRead', callbackWrapper);
+    callback();
+  }
+
+  editor._codeMirror.on('inputRead', callbackWrapper);
+};
+
+SourcesTestRunner.dumpSelectionStats = function(textEditor) {
+  var listHashMap = {};
+  var sortedKeys = [];
+  var selections = textEditor.selections();
+
+  for (var i = 0; i < selections.length; ++i) {
+    var selection = selections[i];
+    var text = textEditor.text(selection);
+
+    if (!listHashMap[text]) {
+      listHashMap[text] = 1;
+      sortedKeys.push(text);
+    } else {
+      ++listHashMap[text];
+    }
+  }
+
+  for (var i = 0; i < sortedKeys.length; ++i) {
+    var keyName = sortedKeys[i];
+
+    if (!keyName.length)
+      keyName = '<Empty string>';
+    else
+      keyName = '\'' + keyName + '\'';
+
+    TestRunner.addResult(keyName + ': ' + listHashMap[sortedKeys[i]]);
+  }
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/LiveEditTestRunner.js b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/LiveEditTestRunner.js
new file mode 100644
index 0000000..80afde0
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/LiveEditTestRunner.js
@@ -0,0 +1,31 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+SourcesTestRunner.replaceInSource = function(sourceFrame, string, replacement) {
+  sourceFrame._textEditor.setReadOnly(false);
+
+  for (var i = 0; i < sourceFrame._textEditor.linesCount; ++i) {
+    var line = sourceFrame._textEditor.line(i);
+    var column = line.indexOf(string);
+
+    if (column === -1)
+      continue;
+
+    range = new TextUtils.TextRange(i, column, i, column + string.length);
+    break;
+  }
+};
+
+SourcesTestRunner.commitSource = function(sourceFrame) {
+  sourceFrame.commitEditing();
+};
+
+SourcesTestRunner.undoSourceEditing = function(sourceFrame) {
+  sourceFrame._textEditor.undo();
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/SearchTestRunner.js b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/SearchTestRunner.js
new file mode 100644
index 0000000..588523a
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/SearchTestRunner.js
@@ -0,0 +1,148 @@
+// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+SourcesTestRunner.dumpSearchResults = function(searchResults) {
+  function comparator(a, b) {
+    a.url.localeCompare(b.url);
+  }
+
+  searchResults.sort(comparator);
+  TestRunner.addResult('Search results: ');
+
+  for (var i = 0; i < searchResults.length; i++) {
+    TestRunner.addResult(
+        'url: ' + searchResults[i].url.replace(/VM\d+/, 'VMXX') + ', matchesCount: ' + searchResults[i].matchesCount);
+  }
+
+  TestRunner.addResult('');
+};
+
+SourcesTestRunner.dumpSearchMatches = function(searchMatches) {
+  TestRunner.addResult('Search matches: ');
+
+  for (var i = 0; i < searchMatches.length; i++) {
+    TestRunner.addResult(
+        'lineNumber: ' + searchMatches[i].lineNumber + ', line: \'' + searchMatches[i].lineContent + '\'');
+  }
+
+  TestRunner.addResult('');
+};
+
+SourcesTestRunner.runSearchAndDumpResults = function(scope, searchConfig, callback) {
+  var searchResults = [];
+  var progress = new Common.Progress();
+  scope.performSearch(searchConfig, progress, searchResultCallback, searchFinishedCallback);
+
+  function searchResultCallback(searchResult) {
+    searchResults.push(searchResult);
+  }
+
+  function searchFinishedCallback() {
+    function comparator(searchResultA, searchResultB) {
+      return searchResultA.uiSourceCode.url().compareTo(searchResultB.uiSourceCode.url());
+    }
+
+    searchResults.sort(comparator);
+
+    for (var i = 0; i < searchResults.length; ++i) {
+      var searchResult = searchResults[i];
+      var uiSourceCode = searchResult.uiSourceCode;
+      var searchMatches = searchResult.searchMatches;
+
+      if (!searchMatches.length)
+        continue;
+
+      TestRunner.addResult(
+          'Search result #' + (i + 1) + ': uiSourceCode.url = ' + uiSourceCode.url().replace(/VM\d+/, 'VMXX'));
+
+      for (var j = 0; j < searchMatches.length; ++j) {
+        var lineNumber = searchMatches[j].lineNumber;
+        var lineContent = searchMatches[j].lineContent;
+        TestRunner.addResult(
+            '  search match #' + (j + 1) + ': lineNumber = ' + lineNumber + ', lineContent = \'' + lineContent + '\'');
+      }
+    }
+
+    callback();
+  }
+};
+
+SourcesTestRunner.replaceAndDumpChange = function(sourceFrame, searchConfig, replacement, replaceAll) {
+  var modifiers = [];
+
+  if (searchConfig.isRegex)
+    modifiers.push('regex');
+
+  if (searchConfig.caseSensitive)
+    modifiers.push('caseSensitive');
+
+  if (replaceAll)
+    modifiers.push('replaceAll');
+
+  var modifiersString = (modifiers.length ? ' (' + modifiers.join(', ') + ')' : '');
+  TestRunner.addResult(
+      'Running replace test for /' + searchConfig.query + '/' + replacement + '/ ' + modifiersString + ':');
+  editor = sourceFrame._textEditor;
+  var oldLines = [];
+
+  for (var i = 0; i < editor.linesCount; ++i)
+    oldLines.push(editor.line(i));
+
+  var searchableView = UI.panels.sources.sourcesView().searchableView();
+  searchableView.showSearchField();
+  searchableView._caseSensitiveButton.setToggled(searchConfig.caseSensitive);
+  searchableView._regexButton.setToggled(searchConfig.isRegex);
+  searchableView._searchInputElement.value = searchConfig.query;
+  searchableView._replaceCheckboxElement.checked = true;
+  searchableView._updateSecondRowVisibility();
+  searchableView._replaceInputElement.value = replacement;
+  searchableView._performSearch(true, true);
+
+  if (replaceAll)
+    searchableView._replaceAll();
+  else
+    searchableView._replace();
+
+  var newLines = [];
+
+  for (var i = 0; i < editor.linesCount; ++i)
+    newLines.push(editor.line(i));
+
+  for (var i = 0; i < newLines.length; ++i) {
+    if (oldLines[i] === newLines[i])
+      continue;
+
+    var oldLine = oldLines[i];
+    var newLine = newLines[i];
+    var prefixLength = 0;
+
+    for (var j = 0; j < oldLine.length && j < newLine.length && newLine[j] === oldLine[j]; ++j)
+      ++prefixLength;
+
+    var postfixLength = 0;
+
+    for (var j = 0; j < oldLine.length && j < newLine.length &&
+         newLine[newLine.length - j - 1] === oldLine[oldLine.length - j - 1];
+         ++j)
+      ++postfixLength;
+
+    var prefix = oldLine.substring(0, prefixLength);
+    var removed = oldLine.substring(prefixLength, oldLine.length - postfixLength);
+    var added = newLine.substring(prefixLength, newLine.length - postfixLength);
+    var postfix = oldLine.substring(oldLine.length - postfixLength);
+    TestRunner.addResult('  - ' + prefix + '#' + removed + '#' + added + '#' + postfix);
+  }
+};
+
+(async function() {
+  await TestRunner.evaluateInPagePromise(`
+    if (window.GCController)
+      GCController.collect();
+  `);
+})();
diff --git a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/SourcesTestRunner.js b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/SourcesTestRunner.js
index ed36909..4b28e95 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/SourcesTestRunner.js
+++ b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/SourcesTestRunner.js
@@ -74,41 +74,6 @@
 };
 
 /**
- * @param {string} urlSuffix
- * @param {!Workspace.projectTypes=} projectType
- * @return {!Promise}
- */
-SourcesTestRunner.waitForUISourceCode = function(urlSuffix, projectType) {
-  /**
-   * @param {!Workspace.UISourceCode} uiSourceCode
-   * @return {boolean}
-   */
-  function matches(uiSourceCode) {
-    if (projectType && uiSourceCode.project().type() !== projectType)
-      return false;
-    if (!projectType && uiSourceCode.project().type() === Workspace.projectTypes.Service)
-      return false;
-    if (urlSuffix && !uiSourceCode.url().endsWith(urlSuffix))
-      return false;
-    return true;
-  }
-
-  for (var uiSourceCode of Workspace.workspace.uiSourceCodes()) {
-    if (urlSuffix && matches(uiSourceCode))
-      return Promise.resolve(uiSourceCode);
-  }
-
-  return TestRunner.waitForEvent(Workspace.Workspace.Events.UISourceCodeAdded, Workspace.workspace, matches);
-};
-
-/**
- * @param {!Function} callback
- */
-SourcesTestRunner.waitForUISourceCodeRemoved = function(callback) {
-  Workspace.workspace.once(Workspace.Workspace.Events.UISourceCodeRemoved).then(callback);
-};
-
-/**
  * @param {string} url
  * @param {string} content
  * @param {boolean=} isContentScript
@@ -120,5 +85,70 @@
   if (isContentScript)
     content = `testRunner.evaluateScriptInIsolatedWorld(${worldId}, \`${content}\`)`;
   TestRunner.evaluateInPagePromise(content);
-  return SourcesTestRunner.waitForUISourceCode(url);
+  return TestRunner.waitForUISourceCode(url);
+};
+
+function testSourceMapping(text1, text2, mapping, testToken) {
+  var originalPosition = text1.indexOf(testToken);
+  TestRunner.assertTrue(originalPosition !== -1);
+  var originalLocation = Formatter.Formatter.positionToLocation(text1.computeLineEndings(), originalPosition);
+  var formattedLocation = mapping.originalToFormatted(originalLocation[0], originalLocation[1]);
+  var formattedPosition =
+      Formatter.Formatter.locationToPosition(text2.computeLineEndings(), formattedLocation[0], formattedLocation[1]);
+  var expectedFormattedPosition = text2.indexOf(testToken);
+
+  if (expectedFormattedPosition === formattedPosition)
+    TestRunner.addResult(String.sprintf('Correct mapping for <%s>', testToken));
+  else
+    TestRunner.addResult(String.sprintf('ERROR: Wrong mapping for <%s>', testToken));
+}
+
+SourcesTestRunner.testPrettyPrint = function(mimeType, text, mappingQueries, next) {
+  new Formatter.ScriptFormatter(mimeType, text, didFormatContent);
+
+  function didFormatContent(formattedSource, mapping) {
+    TestRunner.addResult('====== 8< ------');
+    TestRunner.addResult(formattedSource);
+    TestRunner.addResult('------ >8 ======');
+
+    while (mappingQueries && mappingQueries.length)
+      testSourceMapping(text, formattedSource, mapping, mappingQueries.shift());
+
+    next();
+  }
+};
+
+SourcesTestRunner.testJavascriptOutline = function(text) {
+  var fulfill;
+  var promise = new Promise(x => fulfill = x);
+  Formatter.formatterWorkerPool().javaScriptOutline(text, onChunk);
+  var items = [];
+  return promise;
+
+  function onChunk(isLastChunk, outlineItems) {
+    items.pushAll(outlineItems);
+
+    if (!isLastChunk)
+      return;
+
+    TestRunner.addResult('Text:');
+    TestRunner.addResult(text.split('\n').map(line => '    ' + line).join('\n'));
+    TestRunner.addResult('Outline:');
+
+    for (var item of items)
+      TestRunner.addResult('    ' + item.name + (item.arguments || '') + ':' + item.line + ':' + item.column);
+
+    fulfill();
+  }
+};
+
+SourcesTestRunner.dumpSwatchPositions = function(sourceFrame, bookmarkType) {
+  var textEditor = sourceFrame.textEditor;
+  var markers = textEditor.bookmarks(textEditor.fullRange(), bookmarkType);
+
+  for (var i = 0; i < markers.length; i++) {
+    var position = markers[i].position();
+    var text = markers[i]._marker.widgetNode.firstChild.textContent;
+    TestRunner.addResult('Line ' + position.startLine + ', Column ' + position.startColumn + ': ' + text);
+  }
 };
diff --git a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/module.json
index 147271d..b9ceb99 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources_test_runner/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/sources_test_runner/module.json
@@ -3,9 +3,26 @@
     "test_runner",
     "integration_test_runner",
     "sources",
-    "workspace"
+    "workspace",
+    "source_frame",
+    "text_utils"
   ],
   "scripts": [
-    "SourcesTestRunner.js"
+    "SourcesTestRunner.js",
+    "DebuggerTestRunner.js",
+    "LiveEditTestRunner.js",
+    "SearchTestRunner.js",
+    "EditorTestRunner.js",
+    "AutocompleteTestRunner.js",
+    "BreakpointManagerTestRunner.js"
+  ],
+  "skip_compilation": [
+    "DebuggerTestRunner.js",
+    "LiveEditTestRunner.js",
+    "SearchTestRunner.js",
+    "SourcesTestRunner.js",
+    "EditorTestRunner.js",
+    "AutocompleteTestRunner.js",
+    "BreakpointManagerTestRunner.js"
   ]
-}
\ No newline at end of file
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/test_runner/TestRunner.js b/third_party/WebKit/Source/devtools/front_end/test_runner/TestRunner.js
index b03973cb0..d394f2d 100644
--- a/third_party/WebKit/Source/devtools/front_end/test_runner/TestRunner.js
+++ b/third_party/WebKit/Source/devtools/front_end/test_runner/TestRunner.js
@@ -11,7 +11,15 @@
   const testScriptURL = /** @type {string} */ (Runtime.queryParam('test'));
   fetch(testScriptURL)
       .then(data => data.text())
-      .then(testScript => eval(`(function test(){${testScript}})()\n//# sourceURL=${testScriptURL}`))
+      .then(testScript => {
+        if (!self.testRunner || Runtime.queryParam('debugFrontend')) {
+          self.eval(`function test(){${testScript}}\n//# sourceURL=${testScriptURL}`);
+          TestRunner.addResult = console.log;
+          TestRunner.completeTest = () => console.log('Test completed');
+          return;
+        }
+        eval(`(function test(){${testScript}})()\n//# sourceURL=${testScriptURL}`);
+      })
       .catch(error => {
         TestRunner.addResult(`Unable to execute test script because of error: ${error}`);
         TestRunner.completeTest();
@@ -22,10 +30,6 @@
 TestRunner._results = [];
 
 TestRunner.completeTest = function() {
-  if (!self.testRunner) {
-    console.log('Test Done');
-    return;
-  }
   TestRunner.flushResults();
   self.testRunner.notifyDone();
 };
@@ -54,10 +58,7 @@
  * @param {*} text
  */
 TestRunner.addResult = function(text) {
-  if (self.testRunner)
-    TestRunner._results.push(String(text));
-  else
-    console.log(text);
+  TestRunner._results.push(String(text));
 };
 
 /**
@@ -270,17 +271,6 @@
   return buffer;
 };
 
-/**
- * @param {!Function} testFunction
- * @return {!Function}
- */
-function debugTest(testFunction) {
-  self.test = testFunction;
-  TestRunner.addResult = console.log;
-  TestRunner.completeTest = () => console.log('Test completed');
-  return () => {};
-}
-
 (function() {
   /**
    * @param {string|!Event} message
diff --git a/third_party/WebKit/Source/devtools/scripts/compile_frontend.py b/third_party/WebKit/Source/devtools/scripts/compile_frontend.py
index 5a783d4..e1d82786 100755
--- a/third_party/WebKit/Source/devtools/scripts/compile_frontend.py
+++ b/third_party/WebKit/Source/devtools/scripts/compile_frontend.py
@@ -258,6 +258,8 @@
 def check_conditional_dependencies(modules_by_name):
     errors_found = False
     for name in modules_by_name:
+        if 'test_runner' in name:
+            continue
         for dep_name in modules_by_name[name].get('dependencies', []):
             dependency = modules_by_name[dep_name]
             if dependency.get('experiment') or dependency.get('condition'):
diff --git a/third_party/WebKit/Source/devtools/scripts/migrate_test/glob.js b/third_party/WebKit/Source/devtools/scripts/migrate_test/glob.js
new file mode 100644
index 0000000..c5ea1b9
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/scripts/migrate_test/glob.js
@@ -0,0 +1,45 @@
+// 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';
+
+const fs = require('fs');
+const path = require('path');
+
+const utils = require('../utils');
+
+const TESTS_PATH = path.resolve(__dirname, 'tests.txt');
+
+function main() {
+  const files = process.argv.slice(2);
+  const inputPaths = files.map(p => path.isAbsolute(p) ? p : path.resolve(process.cwd(), p));
+  let globbedPaths = [];
+  for (const p of inputPaths) {
+    glob(p);
+  }
+  let contents = fs.readFileSync(TESTS_PATH, 'utf-8');
+  const tests = new Set(contents.split('\n').map(l => l.split(' ')[0]));
+  for (const p of globbedPaths) {
+    const relativePath = p.slice(p.indexOf('LayoutTests') + 'LayoutTests'.length + 1);
+    if (!tests.has(relativePath))
+      contents += relativePath + '\n'
+  }
+  console.log('contents', contents);
+  fs.writeFileSync(TESTS_PATH, contents, 'utf-8');
+
+
+  function glob(globPath) {
+    for (const filename of fs.readdirSync(globPath)) {
+      const p = path.resolve(globPath, filename);
+      if (utils.isDir(p) && filename !== 'resources') {
+        glob(p);
+      }
+      if (utils.isFile(p) && p.endsWith('.html')) {
+        globbedPaths.push(p);
+      }
+    }
+  }
+}
+
+main();
diff --git a/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_helpers.js b/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_helpers.js
new file mode 100644
index 0000000..4fe0ca9
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_helpers.js
@@ -0,0 +1,519 @@
+// 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';
+
+const fs = require('fs');
+const path = require('path');
+
+const recast = require('recast');
+const types = recast.types;
+const b = recast.types.builders;
+
+const utils = require('../utils');
+const migrateUtils = require('./migrate_utils');
+/**
+ * propertyToNamespace {[testProperty:string]: {namespace: string, done: boolean}}
+ * Moved file
+ * {ETR.something: ETR}
+ * Existing helper module
+ * {ConsoleTestRunner.something: CTR}
+ */
+const BUILD_GN_PATH = path.resolve(__dirname, '..', '..', 'BUILD.gn');
+const DRY_RUN = process.env.DRY_RUN || false;
+const FRONT_END_PATH = path.resolve(__dirname, '..', '..', 'front_end');
+
+function main() {
+  const helperPaths = scanHelpers();
+  const helpers = mapTestFilesToHelperModules(helperPaths);
+  transformHelperCode(helpers);
+  if (DRY_RUN) {
+    return;
+  }
+  updateModuleDescriptors(helpers);
+  const newModules = new Set();
+  const helperFiles = [];
+  for (const h of helpers) {
+    newModules.add(h.helperModule);
+    helperFiles.push(h.newPath);
+  }
+  const existingModulesJson = require(path.resolve(FRONT_END_PATH, 'integration_test_runner.json'));
+  for (const module of existingModulesJson.modules) {
+    newModules.delete(module.name)
+  }
+  updateApplicationDescriptor('integration_test_runner.json', newModules);
+  updateBuildGN(newModules, helperFiles);
+  writeNewHelpers(helpers);
+}
+
+function updateBuildGN(newModuleSet, helperFiles) {
+  let content = fs.readFileSync(BUILD_GN_PATH).toString();
+  helperFiles =
+      helperFiles.map(p => p.split('/').slice(-3).join('/')).filter(p => content.indexOf(p) === -1).map(p => `"${p}",`);
+
+  let newContent = addContentToLinesInSortedOrder({
+    content,
+    startLine: 'all_devtools_files = [',
+    endLine: ']',
+    linesToInsert:
+        [...newModuleSet].map(module => `"front_end/${module}/module.json",`).filter(p => content.indexOf(p) === -1),
+  });
+
+  newContent = addContentToLinesInSortedOrder({
+    content: newContent,
+    startLine: 'all_devtools_files = [',
+    endLine: ']',
+    linesToInsert: helperFiles,
+  });
+
+  fs.writeFileSync(BUILD_GN_PATH, newContent);
+
+  function top(array) {
+    return array[array.length - 1];
+  }
+
+  function addContentToLinesInSortedOrder({content, startLine, endLine, linesToInsert}) {
+    if (linesToInsert.length === 0)
+      return content;
+    let lines = content.split('\n');
+    let seenStartLine = false;
+    let contentStack = linesToInsert.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())).reverse();
+    for (var i = 0; i < lines.length; i++) {
+      let line = lines[i].trim();
+      let nextLine = lines[i + 1].trim();
+      if (line === startLine)
+        seenStartLine = true;
+
+      if (line === endLine && seenStartLine)
+        break;
+
+      if (!seenStartLine)
+        continue;
+
+      const nextContent = top(contentStack) ? top(contentStack).toLowerCase() : '';
+      if ((line === startLine || nextContent >= line.toLowerCase()) &&
+          (nextLine === endLine || nextContent <= nextLine.toLowerCase()))
+        lines.splice(i + 1, 0, contentStack.pop());
+    }
+    if (contentStack.length)
+      lines.splice(i, 0, ...contentStack);
+    return lines.join('\n');
+  }
+}
+
+function updateApplicationDescriptor(descriptorFileName, newModuleSet) {
+  let descriptorPath = path.join(FRONT_END_PATH, descriptorFileName);
+  let newModules = [...newModuleSet];
+  if (newModules.length === 0)
+    return;
+  let includeNewModules = (acc, line) => {
+    if (line === '  "modules" : [') {
+      acc.push(line);
+      return acc.concat(newModules.map((m, i) => {
+        // Need spacing to preserve indentation
+        let string;
+        string = `    { "name": "${m}" },`;
+        return string;
+      }));
+    }
+    return acc.concat([line]);
+  };
+  let lines = fs.readFileSync(descriptorPath).toString().split('\n').reduce(includeNewModules, []);
+  fs.writeFileSync(descriptorPath, lines.join('\n'));
+}
+
+function updateModuleDescriptors(helpers) {
+  const dependenciesByModule = {
+    application_test_runner: ['resources', 'console_test_runner', 'sources', 'sources_test_runner'],
+    audits_test_runner: ['audits'],
+    bindings_test_runner: ['workspace', 'diff', 'bindings', 'persistence'],
+    coverage_test_runner: ['coverage', 'sources_test_runner'],
+    device_mode_test_runner: ['emulation'],
+    elements_test_runner: ['animation'],
+    accessibility_test_runner: ['accessibility', 'elements_test_runner'],
+    extensions_test_runner: ['extensions'],
+    layers_test_runner: ['layers', 'components'],
+    network_test_runner: ['product_registry_impl', 'console_test_runner'],
+    performance_test_runner: ['timeline_model', 'timeline'],
+    profiler_test_runner: ['profiler', 'data_grid', 'heap_snapshot_worker'],
+    security_test_runner: ['security'],
+    sources_test_runner: ['source_frame', 'text_utils'],
+    sass_test_runner: ['sass'],
+  };
+
+  for (const helper of helpers) {
+    const parentPath = path.dirname(helper.newPath);
+    if (!utils.isDir(parentPath))
+      fs.mkdirSync(parentPath);
+    const modulePath = path.resolve(parentPath, 'module.json');
+    const additionalDependencies = dependenciesByModule[helper.helperModule] || [];
+    let contents = {
+      dependencies: ['test_runner', 'integration_test_runner'],
+      scripts: [],
+    };
+    if (utils.isFile(modulePath)) {
+      contents = JSON.parse(fs.readFileSync(modulePath, 'utf-8'));
+    }
+    contents.dependencies = unique(contents.dependencies.concat(additionalDependencies));
+    const filename = path.basename(helper.newPath);
+    if (contents.scripts.indexOf(filename) === -1)
+      contents.scripts.push(filename);
+    contents.skip_compilation = contents.skip_compilation || [];
+    contents.skip_compilation.push(filename);
+    fs.writeFileSync(modulePath, stringifyJSON(contents));
+  }
+
+  function unique(array) {
+    const set = new Set();
+    for (const el of array)
+      set.add(el);
+    return Array.from(set);
+  }
+
+  function stringifyJSON(obj) {
+    return unicodeEscape(JSON.stringify(obj, null, 2) + '\n');
+  }
+
+  // http://stackoverflow.com/questions/7499473/need-to-escape-non-ascii-characters-in-javascript
+  function unicodeEscape(string) {
+    function padWithLeadingZeros(string) {
+      return new Array(5 - string.length).join('0') + string;
+    }
+
+    function unicodeCharEscape(charCode) {
+      return '\\u' + padWithLeadingZeros(charCode.toString(16));
+    }
+
+    return string.split('')
+        .map(function(char) {
+          var charCode = char.charCodeAt(0);
+          return charCode > 127 ? unicodeCharEscape(charCode) : char;
+        })
+        .join('');
+  }
+}
+
+function transformHelperCode(helpers) {
+  const boilerplate = `// Copyright 2017 The Chromium Authors. All
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+`;
+
+  const propertyToNamespace = scrapeTestProperties(helpers);
+
+  for (const helper of helpers) {
+    const ast = recast.parse(helper.originalContents);
+    unwrapInitializeFunction(ast);
+
+    recast.visit(ast, {
+      /**
+     * Remove all deprecated API calls
+     */
+      visitIdentifier: function(path) {
+        if (path.parentPath && path.parentPath.value && path.parentPath.value.object &&
+            path.parentPath.value.object.name === 'InspectorTest' && path.value.name !== 'InspectorTest') {
+          const identifier = path.value.name;
+          if (identifier === 'preloadPanel' || identifier === 'preloadModule') {
+            console.log('helper: ', helper.originalPath, recast.print(path.parentPath.parentPath.value).code)
+            //  Removes these types of calls: InspectorTest.preloadPanel("elements");
+            path.parentPath.parentPath.prune();
+          }
+        }
+        return false;
+      },
+      /**
+     * Skip already ported API calls
+     */
+      visitAssignmentExpression: function(path) {
+        if (!path.value.left.object) {
+          return false;
+        }
+        const namespace = path.value.left.object.name;
+        const propertyName = path.value.left.property.name;
+        if (namespace === 'InspectorTest' && propertyToNamespace.get(propertyName).done) {
+          // console.log('pruning', propertyName);
+          path.prune();
+        }
+        this.traverse(path);
+      },
+    });
+
+    /**
+   * Migrate all the call sites from InspectorTest to .*TestRunner
+   */
+    recast.visit(ast, {
+      visitIdentifier: function(path) {
+        if (path.parentPath && path.parentPath.value && path.parentPath.value.object &&
+            path.parentPath.value.object.name === 'InspectorTest' && path.value.name !== 'InspectorTest') {
+          if (!propertyToNamespace.get(path.value.name)) {
+            throw new Error('Could not find identifier for: ' + path.value.name);
+          }
+          const newParentIdentifier = propertyToNamespace.get(path.value.name).namespace;
+          path.parentPath.value.object.name = newParentIdentifier;
+        }
+        return false;
+      }
+    });
+
+    /**
+   * Migrate all the .bind call sites
+   * Example: SourcesTestRunner.waitUntilPaused.bind(InspectorTest, didPause)
+   */
+    recast.visit(ast, {
+      visitCallExpression: function(path) {
+        const node = path.value;
+        if (node.callee.property && node.callee.property.name === 'bind') {
+          const code = recast.prettyPrint(node);
+          if (node.arguments[0].name === 'InspectorTest') {
+            node.arguments[0].name = node.callee.object.object.name;
+          }
+        }
+        this.traverse(path);
+      }
+    });
+
+
+    const existingContents = utils.isFile(helper.newPath) ? fs.readFileSync(helper.newPath) : '';
+    if (existingContents)
+      helper.contents = existingContents + '\n' + print(ast);
+    else
+      helper.contents = boilerplate + print(ast);
+  }
+
+  function unwrapInitializeFunction(ast) {
+    // Handle function expression
+    let index = ast.program.body.findIndex(
+        n => n.type === 'VariableDeclaration' && n.declarations[0].id.name.indexOf('initialize_') !== -1);
+    if (index > -1) {
+      const otherNodes = ast.program.body.filter((_, i) => i !== index);
+      const testFunctionNode = ast.program.body[index];
+      ast.program.body = testFunctionNode.declarations[0].init.body.body;
+      inspectedPageNodes(otherNodes);
+      return;
+    }
+
+    // Handle function declaration
+    index =
+        ast.program.body.findIndex(n => n.type === 'FunctionDeclaration' && n.id.name.indexOf('initialize_') !== -1);
+    if (index > -1) {
+      const otherNodes = ast.program.body.filter((_, i) => i !== index);
+      const testFunctionNode = ast.program.body[index];
+      ast.program.body.splice(index, 1);
+      ast.program.body = testFunctionNode.body.body;
+      inspectedPageNodes(otherNodes);
+    }
+
+    function inspectedPageNodes(otherNodes) {
+      if (!otherNodes.length)
+        return;
+      const code = otherNodes.map(node => print(node)).join('\n').slice(0, -1);
+      ast.program.body.push(createAwaitExpressionNode(`await TestRunner.evaluateInPagePromise(\`
+${code.split('\n').map(x => x.length ? '    ' + x : x).join('\n')}
+  \`)`));
+    }
+  }
+}
+
+function print(ast) {
+  /**
+   * Not using clang-format because certain tests look bad when formatted by it.
+   * Recast pretty print is smarter about preserving existing spacing.
+   */
+  let code = recast.prettyPrint(ast, {tabWidth: 2, wrapColumn: 120, quote: 'single'}).code;
+  code = code.replace(/(\/\/\#\s*sourceURL=[\w-]+)\.html/, '$1.js');
+  code = code.replace(/\s*\$\$SECRET_IDENTIFIER_FOR_LINE_BREAK\$\$\(\);/g, '\n');
+  return code + '\n';
+}
+
+function scrapeTestProperties(helpers) {
+  const propertyToNamespace = new Map();
+  scrapeOriginalHelpers(propertyToNamespace, helpers);
+  scrapeMovedHelpers(propertyToNamespace);
+
+  // Manual overrides
+  propertyToNamespace.set('consoleModel', {
+    namespace: 'ConsoleModel',
+    done: true,
+  });
+  propertyToNamespace.set('networkLog', {
+    namespace: 'NetworkLog',
+    done: true,
+  });
+  return propertyToNamespace;
+}
+
+function scrapeMovedHelpers(propertyToNamespace) {
+  const testRunnerPaths = fs.readdirSync(FRONT_END_PATH)
+                              .filter(folder => folder.indexOf('test_runner') !== -1)
+                              .map(folder => path.resolve(FRONT_END_PATH, folder))
+                              .filter(file => utils.isDir(file));
+
+  testRunnerPaths.forEach((helperPath) => {
+    const files = fs.readdirSync(helperPath)
+                      .filter(file => file.indexOf('TestRunner') !== -1)
+                      .map(file => path.resolve(helperPath, file));
+    files.forEach(file => scrapeTestHelperIdentifiers(file));
+  });
+
+  function scrapeTestHelperIdentifiers(filePath) {
+    var content = fs.readFileSync(filePath).toString();
+    var lines = content.split('\n');
+    for (var line of lines) {
+      var line = line.trim();
+      if (line.indexOf('TestRunner.') === -1)
+        continue;
+      var match = line.match(/^\s*(\b\w*TestRunner.[a-z_A-Z0-9]+)\s*(\=[^,}]|[;])/) ||
+          line.match(/^(TestRunner.[a-z_A-Z0-9]+)\s*\=$/);
+      if (!match)
+        continue;
+      var name = match[1];
+      var components = name.split('.');
+      if (components.length !== 2)
+        continue;
+      propertyToNamespace.set(components[1], {
+        namespace: components[0],
+        done: true,
+      });
+    }
+  }
+}
+
+function scrapeOriginalHelpers(propertyToNamespace, helpers) {
+  const testRunnerPaths = fs.readdirSync(FRONT_END_PATH)
+                              .filter(folder => folder.indexOf('test_runner') !== -1)
+                              .map(folder => path.resolve(FRONT_END_PATH, folder));
+
+  for (const helper of helpers) {
+    scrapeTestHelperIdentifiers(helper.originalContents, helper.namespace);
+  }
+
+  function scrapeTestHelperIdentifiers(content, namespace) {
+    var lines = content.split('\n');
+    for (var line of lines) {
+      var line = line.trim();
+      if (line.indexOf('InspectorTest.') === -1)
+        continue;
+      var match = line.match(/^\s*(\b\w*InspectorTest.[a-z_A-Z0-9]+)\s*(\=[^,}]|[;])/) ||
+          line.match(/^(InspectorTest.[a-z_A-Z0-9]+)\s*\=$/);
+      if (!match)
+        continue;
+      var name = match[1];
+      var components = name.split('.');
+      if (components.length !== 2)
+        continue;
+      propertyToNamespace.set(components[1], {
+        namespace: namespace,
+        done: false,
+      });
+    }
+  }
+}
+
+// Causes too much diff in test expectations
+// function appendComment(helpers) {
+//   for (const {originalPath, originalContents, helperModule, filename} of helpers) {
+//     const comment = `// This file is being deprecated and is moving to front_end/${helperModule}/${filename}
+// // Please see crbug.com/667560 for more details\n\n`;
+//     fs.writeFileSync(originalPath, comment + originalContents);
+//   }
+// }
+
+function writeNewHelpers(helpers) {
+  for (const {contents, helperModule, filename} of helpers) {
+    const modulePath = path.resolve(FRONT_END_PATH, helperModule);
+    if (!utils.isDir(modulePath))
+      fs.mkdirSync(modulePath);
+    const destPath = path.resolve(modulePath, filename);
+    fs.writeFileSync(destPath, contents);
+  }
+}
+
+function mapTestFilesToHelperModules(helperPaths) {
+  const helpers = new Set();
+  for (const p of helperPaths) {
+    const inputFilename = path.basename(p);
+    let namespacePrefix = path.basename(p)
+                              .split('-test')[0]
+                              .split('-')
+                              .map(a => a.substring(0, 1).toUpperCase() + a.substring(1))
+                              .join('');
+    let filenamePrefix = namespacePrefix;
+
+    // Already migrated or n/a
+    if (namespacePrefix === 'Inspector' || namespacePrefix === 'Console' || namespacePrefix === 'Protocol' ||
+        namespacePrefix === 'ExampleFilesetFor') {
+      continue;
+    }
+
+    // Needs to be manually migrated
+    if (namespacePrefix === 'CspInline' || namespacePrefix === 'Stacktrace')
+      continue;
+
+    const res = migrateUtils.mapTestFilename(inputFilename);
+    namespacePrefix = res.namespacePrefix;
+    filenamePrefix = res.filenamePrefix;
+
+    const contents = fs.readFileSync(p, 'utf-8');
+    const namespace = namespacePrefix + 'TestRunner';
+    const helperModule = namespacePrefix === 'SASS' ?
+        'sass_test_runner' :
+        namespacePrefix === '' ? 'integration_test_runner' :
+                                 namespace.replace(/([A-Z])/g, '_$1').replace(/^_/, '').toLowerCase();
+    const filename = filenamePrefix + 'TestRunner.js';
+    helpers.add({
+      originalPath: p,
+      newPath: path.resolve(FRONT_END_PATH, helperModule, filename),
+      namespace,
+      helperModule,
+      filename,
+      originalContents: contents,
+      contents,
+    });
+  }
+  return helpers;
+}
+
+main();
+
+function scanHelpers() {
+  const paths = [];
+
+  const http_root = path.resolve(__dirname, '..', '..', '..', '..', 'LayoutTests', 'http', 'tests', 'inspector');
+  const non_http_root = path.resolve(__dirname, '..', '..', '..', '..', 'LayoutTests', 'inspector');
+  scan(http_root);
+  scan(non_http_root);
+
+  function scan(p) {
+    const files = fs.readdirSync(p).map(file => path.resolve(p, file));
+    for (const file of files) {
+      if (utils.isDir(file))
+        scan(file);
+      else if (
+          file.indexOf('-test.js') !== -1 || file.indexOf('syntax-highlight.js') !== -1 ||
+          file.indexOf('timeline-data.js') !== -1 || file.indexOf('styles-update-links.js') !== -1 ||
+          file.indexOf('breakpoint-manager.js') !== -1 ||
+          file.indexOf('elements-panel-shadow-selection-on-refresh.js') !== -1 || file.indexOf('page-mock.js') !== -1)
+        paths.push(file);
+    }
+  }
+
+  return paths;
+}
+
+/**
+ * Hack to quickly create an AST node
+ */
+function createAwaitExpressionNode(code) {
+  return recast
+      .parse(`(async function(){
+  ${code}
+  })()`)
+      .program.body[0];
+}
\ No newline at end of file
diff --git a/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_test.js b/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_test.js
index f9face9..99774b7 100644
--- a/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_test.js
+++ b/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_test.js
@@ -9,6 +9,7 @@
 
 const cheerio = require('cheerio');
 const mkdirp = require('mkdirp');
+const prettier = require('prettier');
 const recast = require('recast');
 const types = recast.types;
 const b = recast.types.builders;
@@ -24,6 +25,7 @@
   const files = process.argv.slice(2);
   const inputPaths = files.map(p => path.isAbsolute(p) ? p : path.resolve(process.cwd(), p));
   const identifierMap = generateTestHelperMap();
+
   for (const inputPath of inputPaths) {
     migrateTest(inputPath, identifierMap);
   }
@@ -36,11 +38,12 @@
   console.log('Starting to migrate: ', inputPath);
   const htmlTestFile = fs.readFileSync(inputPath, 'utf-8');
   const $ = cheerio.load(htmlTestFile);
+  const onloadFunctionName = $('body')[0].attribs.onload ? $('body')[0].attribs.onload.slice(0, -2) : '';
   const javascriptFixtures = [];
   const inputCode = $('script:not([src])')
                         .toArray()
                         .map(n => n.children[0].data)
-                        .map(code => processScriptCode(code, javascriptFixtures))
+                        .map(code => processScriptCode(code, javascriptFixtures, onloadFunctionName))
                         .filter(x => !!x)
                         .join('\n');
   const bodyText = $('body').text().trim();
@@ -56,12 +59,6 @@
     helperScripts.push(filename);
   });
 
-  const testsPath = path.resolve(__dirname, 'tests.txt');
-  const newToOldTests = new Map(fs.readFileSync(testsPath, 'utf-8').split('\n').map(line => line.split(' ').reverse()));
-  const originalTestPath = path.resolve(
-      __dirname, '..', '..', '..', '..', 'LayoutTests', newToOldTests.get(inputPath.slice(inputPath.indexOf('http/'))));
-
-  const srcResourcePaths = resourceScripts.map(s => path.resolve(path.dirname(originalTestPath), s));
   const destResourcePaths = resourceScripts.map(s => path.resolve(path.dirname(inputPath), s));
   const relativeResourcePaths = destResourcePaths.map(p => p.slice(p.indexOf('/http/tests') + '/http/tests'.length));
 
@@ -74,14 +71,17 @@
                          // Tries to remove it if it has it's own line
                          .replace(bodyText + '\n', '')
                          // Tries to remove it if it's inline
-                         .replace(bodyText, '');
-    if (/<p>\s*<\/p>/.test(domFixture)) {
-      domFixture = undefined;
-    }
-    const onloadFunctionName = $('body')[0].attribs.onload.slice(0, -2);
+                         .replace(bodyText, '')
+                         .replace(/<p>\s*<\/p>/, '')
+                         .replace(/<div>\s*<\/div>/, '')
+                         .trim();
+    const docType = htmlTestFile.match(/<!DOCTYPE.*>/) ? htmlTestFile.match(/<!DOCTYPE.*>/)[0] : '';
+    if (docType)
+      domFixture = docType + (domFixture.length ? '\n' : '') + domFixture;
     outputCode = transformTestScript(
         inputCode, bodyText, identifierMap, testHelpers, javascriptFixtures, getPanel(inputPath), domFixture,
         onloadFunctionName, relativeResourcePaths);
+    outputCode = prettier.format(outputCode, {tabWidth: 2, printWidth: 120, singleQuote: true});
   } catch (err) {
     console.log('Unable to migrate: ', inputPath);
     console.log('ERROR: ', err);
@@ -90,13 +90,22 @@
 
   console.log(outputCode);
   if (!DRY_RUN) {
+    const testsPath = path.resolve(__dirname, 'tests.txt');
+    const newToOldTests =
+        new Map(fs.readFileSync(testsPath, 'utf-8').split('\n').map(line => line.split(' ').reverse()));
+    const originalTestPath = path.resolve(
+        __dirname, '..', '..', '..', '..', 'LayoutTests',
+        newToOldTests.get(inputPath.slice(inputPath.indexOf('http/'))));
+
+    const srcResourcePaths = resourceScripts.map(s => path.resolve(path.dirname(originalTestPath), s));
+
     fs.writeFileSync(inputPath, outputCode);
-    copyResourceScripts(srcResourcePaths, destResourcePaths);
+    copyResourceScripts(srcResourcePaths, destResourcePaths, inputPath);
     console.log('Migrated: ', inputPath);
   }
 }
 
-function copyResourceScripts(srcResourcePaths, destResourcePaths) {
+function copyResourceScripts(srcResourcePaths, destResourcePaths, inputPath) {
   destResourcePaths.forEach((p, i) => {
     mkdirp.sync(path.dirname(p));
     if (!utils.isFile(p)) {
@@ -131,8 +140,8 @@
     nonTestNodes.push(node);
   }
 
-  unwrapTestFunctionExpressionIfNecessary(ast);
-  unwrapTestFunctionDeclarationIfNecessary(ast);
+  unwrapFunctionExpression(ast, 'test');
+  unwrapFunctionDeclaration(ast, 'test');
 
 
   /**
@@ -159,6 +168,24 @@
     }
   });
 
+  /**
+   * Migrate all the .bind call sites
+   * Example: SourcesTestRunner.waitUntilPaused.bind(InspectorTest, didPause)
+   */
+  recast.visit(ast, {
+    visitCallExpression: function(path) {
+      const node = path.value;
+      if (node.callee.property && node.callee.property.name === 'bind') {
+        const code = recast.prettyPrint(node);
+        if (node.arguments[0].name === 'InspectorTest') {
+          node.arguments[0].name = node.callee.object.object.name;
+        }
+      }
+      this.traverse(path);
+    }
+  });
+
+
   const allTestHelpers = new Set();
 
   for (const helper of explicitTestHelpers) {
@@ -181,7 +208,8 @@
   for (const helper of allTestHelpers) {
     headerLines.push(createAwaitExpressionNode(`await TestRunner.loadModule('${helper}');`));
   }
-  headerLines.push(createAwaitExpressionNode(`await TestRunner.showPanel('${panel}');`));
+  if (panel)
+    headerLines.push(createAwaitExpressionNode(`await TestRunner.showPanel('${panel}');`));
 
   if (domFixture) {
     headerLines.push(createAwaitExpressionNode(`await TestRunner.loadHTML(\`
@@ -200,15 +228,15 @@
   }
 
   let nonTestCode = nonTestNodes.reduce((acc, node) => {
-    let code = recast.print(node).code.split('\n').map(line => '    ' + line).join('\n');
-    if (node.id && node.id.name === onloadFunctionName) {
-      code = code.replace('        runTest();\n', '');
-      code = `    (${code.trimLeft()})();`;
-    };
+    const ast = recast.parse(recast.print(node).code);
+    unwrapFunctionExpression(ast, onloadFunctionName);
+    unwrapFunctionDeclaration(ast, onloadFunctionName);
+    let code = recast.print(ast).code.split('\n').map(line => '    ' + line).join('\n');
+    code = code.replace(/\s*runTest\(\);?\s*/, '');
+    code = `    ${code.trim()};`;
     return acc + '\n' + code;
   }, '');
-
-  nonTestCode = nonTestCode.startsWith('\n') && nonTestCode.slice(2);
+  nonTestCode = '  ' + nonTestCode.trimLeft();
   if (nonTestCode) {
     headerLines.push((createAwaitExpressionNode(`await TestRunner.evaluateInPagePromise(\`
   ${nonTestCode}
@@ -238,7 +266,7 @@
  * If the <script></script> block doesn't contain a test function
  * assume that it needs to be serialized
  */
-function processScriptCode(code, additionalHelperBlocks) {
+function processScriptCode(code, javascriptFixtures, onloadFunctionName) {
   const ast = recast.parse(code);
   const testFunctionExpression =
       ast.program.body.find(n => n.type === 'VariableDeclaration' && n.declarations[0].id.name === 'test');
@@ -246,8 +274,16 @@
   if (testFunctionExpression || testFunctionDeclaration) {
     return code;
   }
-  const formattedCode = code.trimRight().split('\n').map(line => '    ' + line).join('\n');
-  additionalHelperBlocks.push(createAwaitExpressionNode(`await TestRunner.evaluateInPagePromise(\`${formattedCode}
+  unwrapFunctionExpression(ast, onloadFunctionName);
+  unwrapFunctionDeclaration(ast, onloadFunctionName);
+  const formattedCode = recast.print(ast)
+                            .code.trimRight()
+                            .split('\n')
+                            .map(line => '    ' + line)
+                            .join('\n')
+                            .replace(/\s*runTest\(\);?\s*/, '');
+
+  javascriptFixtures.push(createAwaitExpressionNode(`await TestRunner.evaluateInPagePromise(\`${formattedCode}
   \`)`));
   return;
 }
@@ -256,9 +292,9 @@
  * Unwrap test if it's a function expression
  * var test = function () {...}
  */
-function unwrapTestFunctionExpressionIfNecessary(ast) {
+function unwrapFunctionExpression(ast, functionName) {
   const index =
-      ast.program.body.findIndex(n => n.type === 'VariableDeclaration' && n.declarations[0].id.name === 'test');
+      ast.program.body.findIndex(n => n.type === 'VariableDeclaration' && n.declarations[0].id.name === functionName);
   if (index > -1) {
     const testFunctionNode = ast.program.body[index];
     ast.program.body = testFunctionNode.declarations[0].init.body.body;
@@ -270,8 +306,8 @@
  * Unwrap test if it's a function declaration
  * function test () {...}
  */
-function unwrapTestFunctionDeclarationIfNecessary(ast) {
-  const index = ast.program.body.findIndex(n => n.type === 'FunctionDeclaration' && n.id.name === 'test');
+function unwrapFunctionDeclaration(ast, functionName) {
+  const index = ast.program.body.findIndex(n => n.type === 'FunctionDeclaration' && n.id.name === functionName);
   if (index > -1) {
     const testFunctionNode = ast.program.body[index];
     ast.program.body.splice(index, 1);
@@ -318,6 +354,8 @@
 
   const components = inputPath.slice(inputPath.indexOf('LayoutTests/')).split('/');
   const folder = inputPath.indexOf('LayoutTests/inspector') === -1 ? components[4] : components[2];
+  if (folder.endsWith('.html'))
+    return;
   const panel = panelByFolder[folder];
   if (!panel) {
     throw new Error('Could not figure out which panel to map folder: ' + folder);
@@ -326,24 +364,18 @@
 }
 
 function mapTestHelpers(testHelpers) {
-  const SKIP = 'SKIP';
-  const testHelperMap = {
-    'inspector-test': SKIP,
-    'console-test': 'console_test_runner',
-    'elements-test': 'elements_test_runner',
-    'sources-test': 'sources_test_runner',
-  };
-  const mappedHelpers = [];
+  const mappedHelpers = new Set();
   for (const helper of testHelpers) {
-    const mappedHelper = testHelperMap[helper];
+    const namespace = migrateUtils.mapTestFilename(helper).namespacePrefix + 'TestRunner';
+    const mappedHelper = namespace.replace(/([A-Z])/g, '_$1').replace(/^_/, '').toLowerCase();
     if (!mappedHelper) {
       throw Error('Could not map helper ' + helper);
     }
-    if (mappedHelper !== SKIP) {
-      mappedHelpers.push(mappedHelper);
+    if (mappedHelper !== 'inspector_test_runner') {
+      mappedHelpers.add(mappedHelper);
     }
   }
-  return mappedHelpers;
+  return Array.from(mappedHelpers);
 }
 
 function generateTestHelperMap() {
diff --git a/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_utils.js b/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_utils.js
index be774e4..97d8124 100644
--- a/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_utils.js
+++ b/third_party/WebKit/Source/devtools/scripts/migrate_test/migrate_utils.js
@@ -18,6 +18,92 @@
   return out;
 }
 
+
+function mapTestFilename(filename) {
+  let namespacePrefix = path.basename(filename, '.js')
+                            .split('-test')[0]
+                            .split('-')
+                            .map(a => a.substring(0, 1).toUpperCase() + a.substring(1))
+                            .join('');
+  let filenamePrefix = namespacePrefix;
+  if (namespacePrefix === 'PageMock')
+    namespacePrefix = '';
+  if (namespacePrefix === 'SyntaxHighlight')
+    namespacePrefix = '';
+  if (namespacePrefix === 'Datagrid') {
+    namespacePrefix = 'DataGrid';
+    filenamePrefix = 'DataGrid';
+  }
+  if (namespacePrefix === 'TimelineData')
+    namespacePrefix = 'Performance';
+  if (namespacePrefix === 'StylesUpdateLinks')
+    namespacePrefix = 'Elements';
+  if (namespacePrefix === 'BreakpointManager')
+    namespacePrefix = 'Sources';
+  if (namespacePrefix === 'ElementsPanelShadowSelectionOnRefresh')
+    namespacePrefix = 'Elements';
+
+  if (namespacePrefix === 'ExtensionsNetwork')
+    namespacePrefix = 'Extensions';
+  if (namespacePrefix === 'CspInline')
+    namespacePrefix = 'CSPInline';
+  if (namespacePrefix === 'Debugger')
+    namespacePrefix = 'Sources';
+  if (namespacePrefix === 'Resources') {
+    namespacePrefix = 'Application';
+  }
+  if (namespacePrefix === 'Appcache')
+    namespacePrefix = 'Application';
+  if (namespacePrefix === 'ResourceTree')
+    namespacePrefix = 'Application';
+  if (namespacePrefix === 'ServiceWorkers')
+    namespacePrefix = 'Application';
+  if (namespacePrefix === 'CacheStorage')
+    namespacePrefix = 'Application';
+  if (namespacePrefix === 'Indexeddb') {
+    namespacePrefix = 'Application';
+    filenamePrefix = 'IndexedDB';
+  }
+  if (namespacePrefix === 'Timeline')
+    namespacePrefix = 'Performance';
+  if (namespacePrefix === 'ProductRegistry')
+    namespacePrefix = 'Network';
+  if (namespacePrefix === 'Editor')
+    namespacePrefix = 'Sources';
+  if (namespacePrefix === 'Search')
+    namespacePrefix = 'Sources';
+  if (namespacePrefix === 'LiveEdit')
+    namespacePrefix = 'Sources';
+  if (namespacePrefix === 'Autocomplete')
+    namespacePrefix = 'Sources';
+  if (namespacePrefix === 'Changes')
+    namespacePrefix = 'Sources';
+  if (namespacePrefix === 'Persistence')
+    namespacePrefix = 'Bindings';
+  if (namespacePrefix === 'IsolatedFilesystem')
+    namespacePrefix = 'Bindings';
+  if (namespacePrefix === 'Automapping')
+    namespacePrefix = 'Bindings';
+  if (namespacePrefix === 'AccessibilityPane')
+    namespacePrefix = 'Accessibility';
+  if (namespacePrefix === 'EditDom') {
+    namespacePrefix = 'Elements';
+    filenamePrefix = 'EditDOM';
+  }
+  if (namespacePrefix === 'SetOuterHtml') {
+    namespacePrefix = 'Elements';
+    filenamePrefix = 'SetOuterHTML';
+  }
+  if (namespacePrefix === 'HeapSnapshot')
+    namespacePrefix = 'Profiler';
+  if (namespacePrefix === 'Sass') {
+    namespacePrefix = 'SASS'
+    filenamePrefix = 'SASS'
+  }
+  return {namespacePrefix, filenamePrefix};
+}
+
 module.exports = {
   getOutPath,
+  mapTestFilename,
 };
diff --git a/third_party/WebKit/Source/devtools/scripts/migrate_test/move.js b/third_party/WebKit/Source/devtools/scripts/migrate_test/move.js
index 21b6270..5bfecfa 100644
--- a/third_party/WebKit/Source/devtools/scripts/migrate_test/move.js
+++ b/third_party/WebKit/Source/devtools/scripts/migrate_test/move.js
@@ -15,8 +15,9 @@
 
 const MIGRATE_TEST_PATH = path.resolve(__dirname, 'migrate_test.js');
 const TESTS_PATH = path.resolve(__dirname, 'tests.txt');
-const TEST_EXPECTATIONS_PATH = path.resolve(__dirname, '..', '..', '..', '..', 'LayoutTests', 'TestExpectations');
-const FLAG_EXPECTATIONS_PATH = path.resolve(__dirname, '..', '..', '..', '..', 'LayoutTests', 'FlagExpectations');
+const LAYOUT_TESTS_PATH = path.resolve(__dirname, '..', '..', '..', '..', 'LayoutTests');
+const TEST_EXPECTATIONS_PATH = path.resolve(LAYOUT_TESTS_PATH, 'TestExpectations');
+const FLAG_EXPECTATIONS_PATH = path.resolve(LAYOUT_TESTS_PATH, 'FlagExpectations');
 
 function main() {
   const originalTests = fs.readFileSync(TESTS_PATH, 'utf-8').split('\n').map(line => line.split(' ')[0]);
@@ -62,30 +63,78 @@
 
   const newTestPaths = Array.from(oldToNewTestPath.values()).filter(x => x);
 
+  const TestExpectationFailureTypes =
+      ['Crash', 'Failure', 'Rebaseline', 'Skip', 'Timeout', 'WontFix', 'Missing', 'NeedsManualRebaseline'];
+
+  const testsAlreadyExempted = new Set();
+
   // Update TestExpectations
   const testExpectations = fs.readFileSync(TEST_EXPECTATIONS_PATH, 'utf-8');
-  const updatedTestExpecations = testExpectations.split('\n').map(line => {
+  let updatedTestExpecations = testExpectations.split('\n').map(line => {
     for (const [oldTestPath, newTestPath] of oldToNewTestPath) {
       if (!newTestPath)
         continue;
-      if (line.indexOf(oldTestPath) !== -1)
+      if (line.indexOf(oldTestPath) !== -1) {
+        if (TestExpectationFailureTypes.some(x => line.indexOf(x) !== -1)) {
+          testsAlreadyExempted.add(newTestPath);
+        }
         return line.replace(oldTestPath, newTestPath);
+      }
+    }
+    return line;
+  });
+
+  updatedTestExpecations = updatedTestExpecations.map(line => {
+    for (const [oldTestPath, newTestPath] of oldToNewTestPath) {
+      if (!newTestPath)
+        continue;
       if (line === '# See crbug.com/667560 for details') {
-        return line + '\n' + Array.from(newTestPaths).map(x => `crbug.com/667560 ${x} [ Skip ]`).join('\n');
+        return line + '\n' +
+            Array.from(newTestPaths)
+                .filter(t => !testsAlreadyExempted.has(t))
+                .map(x => `crbug.com/667560 ${x} [ Skip ]`)
+                .join('\n');
       }
       if (line === '### virtual/mojo-loading/http/tests/devtools') {
         return line + '\n' +
-            Array.from(newTestPaths).map(x => `crbug.com/667560 virtual/mojo-loading/${x} [ Skip ]`).join('\n');
+            Array.from(newTestPaths)
+                .filter(t => !testsAlreadyExempted.has(t))
+                .map(x => `crbug.com/667560 virtual/mojo-loading/${x} [ Skip ]`)
+                .join('\n');
+      }
+
+      // Put mojo tests here so we don't re-enable the test after migrating
+      if (line === '### Manually fix after migration') {
+        return line + '\n' +
+            Array.from(newTestPaths)
+                .filter(t => testsAlreadyExempted.has(t))
+                .map(x => `crbug.com/667560 virtual/mojo-loading/${x} [ Skip ]`)
+                .join('\n');
       }
     }
     return line;
   });
   fs.writeFileSync(TEST_EXPECTATIONS_PATH, updatedTestExpecations.join('\n'));
 
+  // Update additional test expectations
+  for (const filename
+           of ['ASANExpectations', 'LeakExpectations', 'MSANExpectations', 'NeverFixTests', 'SlowTests', 'SmokeTests',
+               'StaleTestExpectations']) {
+    const filePath = path.resolve(LAYOUT_TESTS_PATH, filename);
+    updateExpectationsFile(filePath);
+  }
+
   // Update FlagExpectations
-  for (const folder of fs.readdirSync(FLAG_EXPECTATIONS_PATH)) {
-    const flagFilePath = path.resolve(FLAG_EXPECTATIONS_PATH, folder);
-    const expectations = fs.readFileSync(flagFilePath, 'utf-8');
+  for (const filename of fs.readdirSync(FLAG_EXPECTATIONS_PATH)) {
+    const filePath = path.resolve(FLAG_EXPECTATIONS_PATH, filename);
+    updateExpectationsFile(filePath);
+  }
+
+  for (const [oldResourcesPath, newResourcesPath] of oldToNewResourcesPath)
+    utils.copyRecursive(oldResourcesPath, path.dirname(newResourcesPath));
+
+  function updateExpectationsFile(filePath) {
+    const expectations = fs.readFileSync(filePath, 'utf-8');
     const updatedExpectations = expectations.split('\n').map(line => {
       for (const [oldTestPath, newTestPath] of oldToNewTestPath) {
         if (!newTestPath)
@@ -96,11 +145,8 @@
       }
       return line;
     });
-    fs.writeFileSync(flagFilePath, updatedExpectations.join('\n'));
+    fs.writeFileSync(filePath, updatedExpectations.join('\n'));
   }
-
-  for (const [oldResourcesPath, newResourcesPath] of oldToNewResourcesPath)
-    utils.copyRecursive(oldResourcesPath, path.dirname(newResourcesPath));
 }
 
 main();
diff --git a/third_party/WebKit/Source/devtools/scripts/migrate_test/package.json b/third_party/WebKit/Source/devtools/scripts/migrate_test/package.json
index a5279aff..8eb135ec 100644
--- a/third_party/WebKit/Source/devtools/scripts/migrate_test/package.json
+++ b/third_party/WebKit/Source/devtools/scripts/migrate_test/package.json
@@ -6,6 +6,7 @@
   "dependencies": {
     "cheerio": "^1.0.0-rc.2",
     "mkdirp": "^0.5.1",
+    "prettier": "^1.5.3",
     "recast": "^0.12.6"
   }
 }
diff --git a/third_party/WebKit/Source/devtools/scripts/migrate_test/transform.js b/third_party/WebKit/Source/devtools/scripts/migrate_test/transform.js
index 2cf305b..a27cb643 100644
--- a/third_party/WebKit/Source/devtools/scripts/migrate_test/transform.js
+++ b/third_party/WebKit/Source/devtools/scripts/migrate_test/transform.js
@@ -27,7 +27,7 @@
       continue;
     const fullTestPath = path.resolve(__dirname, '..', '..', '..', '..', 'LayoutTests', testPath);
     try {
-      childProcess.execSync(`node ${MIGRATE_SCRIPT_PATH} ${fullTestPath}`)
+      childProcess.execSync(`node ${MIGRATE_SCRIPT_PATH} ${fullTestPath}`);
     } catch (err) {
       console.log(err.stdout.toString());
       continue;
@@ -56,7 +56,7 @@
       updatedTestExpecationLines.push(line);
       continue;
     }
-    if (line === '# ====== DevTools test migration failures until here ======') {
+    if (line === '### Manually fix after migration') {
       seenEndSentinel = true;
       updatedTestExpecationLines.push(line);
       continue;
diff --git a/third_party/WebKit/Source/devtools/scripts/special_case_namespaces.json b/third_party/WebKit/Source/devtools/scripts/special_case_namespaces.json
index a973224..ff555c9 100644
--- a/third_party/WebKit/Source/devtools/scripts/special_case_namespaces.json
+++ b/third_party/WebKit/Source/devtools/scripts/special_case_namespaces.json
@@ -4,5 +4,6 @@
   "object_ui": "ObjectUI",
   "perf_ui": "PerfUI",
   "css_tracker": "CSSTracker",
-  "har_importer": "HARImporter"
+  "har_importer": "HARImporter",
+  "sass_test_runner": "SASSTestRunner"
 }
\ No newline at end of file
diff --git a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
index 4aca03a..f4c5e55e 100644
--- a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
+++ b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
@@ -44,10 +44,10 @@
 const double BaseRenderingContext2D::kCDeviceScaleFactor = 1.0;
 
 BaseRenderingContext2D::BaseRenderingContext2D()
-    : clip_antialiasing_(kNotAntiAliased), color_management_enabled_(false) {
+    : clip_antialiasing_(kNotAntiAliased),
+      color_management_enabled_(
+          RuntimeEnabledFeatures::ColorCorrectRenderingEnabled()) {
   state_stack_.push_back(CanvasRenderingContext2DState::Create());
-  color_management_enabled_ =
-      RuntimeEnabledFeatures::ColorCanvasExtensionsEnabled();
 }
 
 BaseRenderingContext2D::~BaseRenderingContext2D() {}
diff --git a/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp b/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp
index b1f679e0d..50bc156 100644
--- a/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp
+++ b/third_party/WebKit/Source/modules/exported/WebEmbeddedWorkerImpl.cpp
@@ -53,7 +53,6 @@
 #include "modules/serviceworkers/ServiceWorkerGlobalScopeProxy.h"
 #include "modules/serviceworkers/ServiceWorkerInstalledScriptsManager.h"
 #include "modules/serviceworkers/ServiceWorkerThread.h"
-#include "platform/Histogram.h"
 #include "platform/RuntimeEnabledFeatures.h"
 #include "platform/SharedBuffer.h"
 #include "platform/heap/Handle.h"
@@ -340,17 +339,6 @@
   }
   worker_context_client_->WorkerScriptLoaded();
 
-  DEFINE_STATIC_LOCAL(CustomCountHistogram, script_size_histogram,
-                      ("ServiceWorker.ScriptSize", 1000, 5000000, 50));
-  script_size_histogram.Count(main_script_loader_->SourceText().length());
-  if (main_script_loader_->CachedMetadata()) {
-    DEFINE_STATIC_LOCAL(
-        CustomCountHistogram, script_cached_metadata_size_histogram,
-        ("ServiceWorker.ScriptCachedMetadataSize", 1000, 50000000, 50));
-    script_cached_metadata_size_histogram.Count(
-        main_script_loader_->CachedMetadata()->size());
-  }
-
   if (pause_after_download_state_ == kDoPauseAfterDownload) {
     pause_after_download_state_ = kIsPausedAfterDownload;
     return;
diff --git a/third_party/WebKit/Source/modules/mediasource/TrackDefault.cpp b/third_party/WebKit/Source/modules/mediasource/TrackDefault.cpp
index 19326c2..9c0453f 100644
--- a/third_party/WebKit/Source/modules/mediasource/TrackDefault.cpp
+++ b/third_party/WebKit/Source/modules/mediasource/TrackDefault.cpp
@@ -5,9 +5,11 @@
 #include "modules/mediasource/TrackDefault.h"
 
 #include "bindings/core/v8/ExceptionState.h"
+#include "bindings/core/v8/ToV8ForCore.h"
 #include "core/html/track/AudioTrack.h"
 #include "core/html/track/TextTrack.h"
 #include "core/html/track/VideoTrack.h"
+#include "platform/bindings/ScriptState.h"
 
 namespace blink {
 
@@ -26,6 +28,10 @@
   return text;
 }
 
+ScriptValue TrackDefault::kinds(ScriptState* script_state) const {
+  return ScriptValue(script_state, ToV8(kinds_, script_state));
+}
+
 TrackDefault* TrackDefault::Create(const AtomicString& type,
                                    const String& language,
                                    const String& label,
diff --git a/third_party/WebKit/Source/modules/mediasource/TrackDefault.h b/third_party/WebKit/Source/modules/mediasource/TrackDefault.h
index c25e151f..6fb1926 100644
--- a/third_party/WebKit/Source/modules/mediasource/TrackDefault.h
+++ b/third_party/WebKit/Source/modules/mediasource/TrackDefault.h
@@ -5,12 +5,14 @@
 #ifndef TrackDefault_h
 #define TrackDefault_h
 
+#include "bindings/core/v8/ScriptValue.h"
 #include "platform/bindings/ScriptWrappable.h"
 #include "platform/wtf/text/WTFString.h"
 
 namespace blink {
 
 class ExceptionState;
+class ScriptState;
 
 class TrackDefault final : public GarbageCollectedFinalized<TrackDefault>,
                            public ScriptWrappable {
@@ -35,7 +37,7 @@
   String byteStreamTrackID() const { return byte_stream_track_id_; }
   String language() const { return language_; }
   String label() const { return label_; }
-  const Vector<String>& kinds() const { return kinds_; }
+  ScriptValue kinds(ScriptState*) const;
 
   DEFINE_INLINE_TRACE() {}
 
diff --git a/third_party/WebKit/Source/modules/mediasource/TrackDefault.idl b/third_party/WebKit/Source/modules/mediasource/TrackDefault.idl
index 89ae52a..8a8e11a9 100644
--- a/third_party/WebKit/Source/modules/mediasource/TrackDefault.idl
+++ b/third_party/WebKit/Source/modules/mediasource/TrackDefault.idl
@@ -16,9 +16,10 @@
     readonly attribute DOMString byteStreamTrackID;
     readonly attribute DOMString language;
     readonly attribute DOMString label;
-    // TODO(wolenetz): |kinds| should be [SameObject] FrozenArray<DOMString> or
-    // a getKinds() method returning sequence<DOMString>.
-    // https://github.com/w3c/media-source/issues/91
-    // https://crbug.com/619665
-    readonly attribute DOMString[] kinds;
+    // TrackDefault was removed from the spec in
+    // https://github.com/w3c/media-source/pull/138, and the last version to
+    // have it had getKinds() instead of |kinds|. Use an object here to avoid
+    // WebIDL arrays (which no longer exist) while not breaking compatibility
+    // See also: https://crbug.com/619665.
+    [CallWith=ScriptState] readonly attribute object kinds;
 };
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.cpp
index 008caf37..3cad3ec 100644
--- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.cpp
+++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.cpp
@@ -120,8 +120,31 @@
 
 ServiceWorkerGlobalScope::~ServiceWorkerGlobalScope() {}
 
-void ServiceWorkerGlobalScope::CountScript(size_t script_size,
-                                           size_t cached_metadata_size) {
+void ServiceWorkerGlobalScope::CountWorkerScript(size_t script_size,
+                                                 size_t cached_metadata_size) {
+  DEFINE_THREAD_SAFE_STATIC_LOCAL(
+      CustomCountHistogram, script_size_histogram,
+      ("ServiceWorker.ScriptSize", 1000, 5000000, 50));
+  script_size_histogram.Count(script_size);
+
+  if (cached_metadata_size) {
+    DEFINE_THREAD_SAFE_STATIC_LOCAL(
+        CustomCountHistogram, script_cached_metadata_size_histogram,
+        ("ServiceWorker.ScriptCachedMetadataSize", 1000, 50000000, 50));
+    script_cached_metadata_size_histogram.Count(cached_metadata_size);
+  }
+
+  RecordScriptSize(script_size, cached_metadata_size);
+}
+
+void ServiceWorkerGlobalScope::CountImportedScript(
+    size_t script_size,
+    size_t cached_metadata_size) {
+  RecordScriptSize(script_size, cached_metadata_size);
+}
+
+void ServiceWorkerGlobalScope::RecordScriptSize(size_t script_size,
+                                                size_t cached_metadata_size) {
   ++script_count_;
   script_total_size_ += script_size;
   script_cached_metadata_total_size_ += cached_metadata_size;
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.h b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.h
index 5d17247b..3fb1cd8 100644
--- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.h
+++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.h
@@ -65,9 +65,12 @@
   ~ServiceWorkerGlobalScope() override;
   bool IsServiceWorkerGlobalScope() const override { return true; }
 
-  // Counts an evaluated script and its size. Called for each of the main
-  // worker script and imported scripts.
-  void CountScript(size_t script_size, size_t cached_metadata_size);
+  // Counts an evaluated script and its size. Called for the main worker script.
+  void CountWorkerScript(size_t script_size, size_t cached_metadata_size);
+
+  // Counts an evaluated script and its size. Called for each of imported
+  // scripts.
+  void CountImportedScript(size_t script_size, size_t cached_metadata_size);
 
   // Called when the main worker script is evaluated.
   void DidEvaluateWorkerScript();
@@ -123,6 +126,10 @@
       const Vector<char>* meta_data) override;
   void ExceptionThrown(ErrorEvent*) override;
 
+  // Records the |script_size| and |cached_metadata_size| for UMA to measure the
+  // number of scripts and the total bytes of scripts.
+  void RecordScriptSize(size_t script_size, size_t cached_metadata_size);
+
   Member<ServiceWorkerClients> clients_;
   Member<ServiceWorkerRegistration> registration_;
   bool did_evaluate_script_;
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeProxy.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeProxy.cpp
index b789dc2..4cb7aac 100644
--- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeProxy.cpp
+++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeProxy.cpp
@@ -628,14 +628,14 @@
     size_t script_size,
     size_t cached_metadata_size) {
   DCHECK(WorkerGlobalScope()->IsContextThread());
-  WorkerGlobalScope()->CountScript(script_size, cached_metadata_size);
+  worker_global_scope_->CountWorkerScript(script_size, cached_metadata_size);
 }
 
 void ServiceWorkerGlobalScopeProxy::WillEvaluateImportedScript(
     size_t script_size,
     size_t cached_metadata_size) {
   DCHECK(WorkerGlobalScope()->IsContextThread());
-  WorkerGlobalScope()->CountScript(script_size, cached_metadata_size);
+  worker_global_scope_->CountImportedScript(script_size, cached_metadata_size);
 }
 
 void ServiceWorkerGlobalScopeProxy::DidEvaluateWorkerScript(bool success) {
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
index d818073b..04717c6 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
@@ -1462,11 +1462,9 @@
   if (isContextLost())
     return false;
 
-  bool must_clear_now = ClearIfComposited() != kSkipped;
-  if (!marked_canvas_dirty_ && !must_clear_now)
-    return false;
+  if (ClearIfComposited() != kSkipped)
+    canvas()->ClearCopiedImage();
 
-  canvas()->ClearCopiedImage();
   marked_canvas_dirty_ = false;
 
   if (!canvas()->GetOrCreateImageBuffer())
diff --git a/third_party/WebKit/Source/platform/bindings/ScopedPersistent.h b/third_party/WebKit/Source/platform/bindings/ScopedPersistent.h
index 11e12a0..559b82f 100644
--- a/third_party/WebKit/Source/platform/bindings/ScopedPersistent.h
+++ b/third_party/WebKit/Source/platform/bindings/ScopedPersistent.h
@@ -61,7 +61,7 @@
       handle_.Reset(isolate, local);
   }
 
-  virtual ~ScopedPersistent() { Clear(); }
+  ~ScopedPersistent() { Clear(); }
 
   ALWAYS_INLINE v8::Local<T> NewLocal(v8::Isolate* isolate) const {
     return v8::Local<T>::New(isolate, handle_);
@@ -85,7 +85,7 @@
   bool IsEmpty() const { return handle_.IsEmpty(); }
   bool IsWeak() const { return handle_.IsWeak(); }
 
-  virtual void Set(v8::Isolate* isolate, v8::Local<T> handle) {
+  void Set(v8::Isolate* isolate, v8::Local<T> handle) {
     handle_.Reset(isolate, handle);
   }
 
diff --git a/third_party/WebKit/Source/platform/bindings/ScriptState.h b/third_party/WebKit/Source/platform/bindings/ScriptState.h
index e2e75ee..c6c9e71 100644
--- a/third_party/WebKit/Source/platform/bindings/ScriptState.h
+++ b/third_party/WebKit/Source/platform/bindings/ScriptState.h
@@ -125,7 +125,7 @@
     // ScriptState::from() must not be called for a context that does not have
     // valid embedder data in the embedder field.
     SECURITY_CHECK(script_state);
-    SECURITY_CHECK(script_state->GetContext() == context);
+    SECURITY_CHECK(script_state->context_ == context);
     return script_state;
   }
 
diff --git a/third_party/WebKit/Source/platform/blob/BlobDataTest.cpp b/third_party/WebKit/Source/platform/blob/BlobDataTest.cpp
index b0bdd75..315de8d 100644
--- a/third_party/WebKit/Source/platform/blob/BlobDataTest.cpp
+++ b/third_party/WebKit/Source/platform/blob/BlobDataTest.cpp
@@ -68,6 +68,18 @@
                             std::move(request));
   }
 
+  void ReadRange(uint64_t offset,
+                 uint64_t length,
+                 mojo::ScopedDataPipeProducerHandle,
+                 storage::mojom::blink::BlobReaderClientPtr) override {
+    NOTREACHED();
+  }
+
+  void ReadAll(mojo::ScopedDataPipeProducerHandle,
+               storage::mojom::blink::BlobReaderClientPtr) override {
+    NOTREACHED();
+  }
+
   void GetInternalUUID(GetInternalUUIDCallback callback) override {
     std::move(callback).Run(uuid_);
   }
diff --git a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
index 64dd7ee3..f7b3175 100644
--- a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
+++ b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
@@ -165,9 +165,16 @@
 
   SkAlphaType alpha_type =
       (kOpaque == opacity_mode) ? kOpaque_SkAlphaType : kPremul_SkAlphaType;
-  SkImageInfo info = SkImageInfo::Make(
-      size.Width(), size.Height(), color_params.GetSkColorType(), alpha_type,
-      color_params.GetSkColorSpaceForSkSurfaces());
+  // If we need color correction for all color spaces, we set the proper color
+  // space when creating the surface. If color correct rendering is only toward
+  // SRGB, we leave the surface with no color space. The painting canvas will
+  // get wrapped with a proper SkColorSpaceXformCanvas in GetOrCreateSurface().
+  sk_sp<SkColorSpace> color_space = nullptr;
+  if (CanvasColorParams::ColorCorrectRenderingInAnyColorSpace())
+    color_space = color_params.GetSkColorSpaceForSkSurfaces();
+  SkImageInfo info =
+      SkImageInfo::Make(size.Width(), size.Height(),
+                        color_params.GetSkColorType(), alpha_type, color_space);
   SkSurfaceProps disable_lcd_props(0, kUnknown_SkPixelGeometry);
   sk_sp<SkSurface> surface;
 
@@ -363,7 +370,7 @@
   *out_mailbox =
       viz::TextureMailbox(mailbox, sync_token, texture_target, gfx::Size(size_),
                           is_overlay_candidate, secure_output_only);
-  if (RuntimeEnabledFeatures::ColorCorrectRenderingEnabled()) {
+  if (CanvasColorParams::ColorCorrectRenderingEnabled()) {
     gfx::ColorSpace color_space = color_params_.GetGfxColorSpace();
     out_mailbox->set_color_space(color_space);
     image_info->gpu_memory_buffer_->SetColorSpaceForScanout(color_space);
@@ -627,8 +634,13 @@
   bool surface_is_accelerated;
   surface_ = CreateSkSurface(gr, size_, msaa_sample_count_, opacity_mode_,
                              color_params_, &surface_is_accelerated);
-  surface_paint_canvas_ =
-      WTF::WrapUnique(new SkiaPaintCanvas(surface_->getCanvas()));
+  if (color_params_.ColorCorrectNoColorSpaceToSRGB()) {
+    surface_paint_canvas_ = WTF::WrapUnique(new SkiaPaintCanvas(
+        surface_->getCanvas(), color_params_.GetSkColorSpace()));
+  } else {
+    surface_paint_canvas_ =
+        WTF::WrapUnique(new SkiaPaintCanvas(surface_->getCanvas()));
+  }
 
   if (surface_) {
     // Always save an initial frame, to support resetting the top level matrix
@@ -848,8 +860,7 @@
     // be done using target space pixel values.
     SkCanvas* canvas = GetOrCreateSurface()->getCanvas();
     std::unique_ptr<SkCanvas> color_transform_canvas;
-    if (RuntimeEnabledFeatures::ColorCorrectRenderingEnabled() &&
-        color_params_.UsesOutputSpaceBlending()) {
+    if (color_params_.ColorCorrectNoColorSpaceToSRGB()) {
       color_transform_canvas = SkCreateColorSpaceXformCanvas(
           canvas, color_params_.GetSkColorSpace());
       canvas = color_transform_canvas.get();
diff --git a/third_party/WebKit/Source/platform/graphics/CanvasColorParams.cpp b/third_party/WebKit/Source/platform/graphics/CanvasColorParams.cpp
index 0c8bc37..3651c40 100644
--- a/third_party/WebKit/Source/platform/graphics/CanvasColorParams.cpp
+++ b/third_party/WebKit/Source/platform/graphics/CanvasColorParams.cpp
@@ -4,6 +4,7 @@
 
 #include "platform/graphics/CanvasColorParams.h"
 
+#include "platform/RuntimeEnabledFeatures.h"
 #include "ui/gfx/color_space.h"
 
 namespace blink {
@@ -52,6 +53,25 @@
   return color_space_ == kLegacyCanvasColorSpace;
 }
 
+bool CanvasColorParams::ColorCorrectRenderingEnabled() {
+  return RuntimeEnabledFeatures::ColorCorrectRenderingEnabled();
+}
+
+bool CanvasColorParams::ColorCorrectRenderingInSRGBOnly() {
+  return RuntimeEnabledFeatures::ColorCorrectRenderingEnabled() &&
+         !RuntimeEnabledFeatures::ColorCanvasExtensionsEnabled();
+}
+
+bool CanvasColorParams::ColorCorrectRenderingInAnyColorSpace() {
+  return RuntimeEnabledFeatures::ColorCorrectRenderingEnabled() &&
+         RuntimeEnabledFeatures::ColorCanvasExtensionsEnabled();
+}
+
+bool CanvasColorParams::ColorCorrectNoColorSpaceToSRGB() const {
+  return color_space_ == kLegacyCanvasColorSpace &&
+         RuntimeEnabledFeatures::ColorCorrectRenderingEnabled();
+}
+
 sk_sp<SkColorSpace> CanvasColorParams::GetSkColorSpaceForSkSurfaces() const {
   switch (color_space_) {
     case kLegacyCanvasColorSpace:
diff --git a/third_party/WebKit/Source/platform/graphics/CanvasColorParams.h b/third_party/WebKit/Source/platform/graphics/CanvasColorParams.h
index 08ea4846..21917ba 100644
--- a/third_party/WebKit/Source/platform/graphics/CanvasColorParams.h
+++ b/third_party/WebKit/Source/platform/graphics/CanvasColorParams.h
@@ -41,10 +41,24 @@
   void SetCanvasColorSpace(CanvasColorSpace);
   void SetCanvasPixelFormat(CanvasPixelFormat);
 
-  // Returns true if the canvas uses blends output color space values (that is,
+  // Returns true if the canvas blends output color space values (that is,
   // not linear space colors).
   bool UsesOutputSpaceBlending() const;
 
+  // Returns true if color correct rendering flag is set.
+  static bool ColorCorrectRenderingEnabled();
+  // Returns true if color correct rendering flag is set but canvas color
+  // extensions flag is not.
+  static bool ColorCorrectRenderingInSRGBOnly();
+  // Returns true if both color correct rendering and canvas color extensions
+  // flags are set. This activates the color management pipeline for all color
+  // spaces.
+  static bool ColorCorrectRenderingInAnyColorSpace();
+  // Returns true if color correct rendering flag is set but color canvas
+  // extensions flag is not set and the color space stored in CanvasColorParams
+  // object is null.
+  bool ColorCorrectNoColorSpaceToSRGB() const;
+
   // The SkColorSpace to use in the SkImageInfo for allocated SkSurfaces. This
   // is nullptr in legacy rendering mode.
   sk_sp<SkColorSpace> GetSkColorSpaceForSkSurfaces() const;
diff --git a/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp b/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp
index 2f0033b..9bc56f8 100644
--- a/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp
+++ b/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp
@@ -389,6 +389,10 @@
       rect.Width(), rect.Height(), color_type, alpha_type,
       surface_->color_params().GetSkColorSpaceForSkSurfaces());
 
+  // If color correct rendering is enabled but color canvas extensions is not,
+  // unpremul must be done in gamma encoded color space.
+  if (CanvasColorParams::ColorCorrectRenderingInSRGBOnly())
+    info = info.makeColorSpace(nullptr);
   snapshot->PaintImageForCurrentFrame().GetSkImage()->readPixels(
       info, result.Data(), bytes_per_pixel * rect.Width(), rect.X(), rect.Y());
   gpu_readback_invoked_in_current_frame_ = true;
@@ -445,6 +449,8 @@
         source_rect.Width(), source_rect.Height(),
         surface_->color_params().GetSkColorType(), alpha_type,
         surface_->color_params().GetSkColorSpaceForSkSurfaces());
+    if (info.colorType() == kN32_SkColorType)
+      info = info.makeColorType(kRGBA_8888_SkColorType);
   } else {
     info = SkImageInfo::Make(source_rect.Width(), source_rect.Height(),
                              kRGBA_8888_SkColorType, alpha_type);
diff --git a/third_party/WebKit/Source/platform/graphics/StrokeData.cpp b/third_party/WebKit/Source/platform/graphics/StrokeData.cpp
index 2c909df..f8f4d81 100644
--- a/third_party/WebKit/Source/platform/graphics/StrokeData.cpp
+++ b/third_party/WebKit/Source/platform/graphics/StrokeData.cpp
@@ -117,7 +117,6 @@
     SkScalar intervals[2] = {0, gap + dash_width - kEpsilon};
     flags->setPathEffect(SkDashPathEffect::Make(intervals, 2, 0));
   } else {
-    // TODO(schenney): WavyStroke https://crbug.com/229574
     flags->setPathEffect(0);
   }
 }
diff --git a/third_party/WebKit/Source/platform/graphics/UnacceleratedImageBufferSurface.cpp b/third_party/WebKit/Source/platform/graphics/UnacceleratedImageBufferSurface.cpp
index 0cf4c68..67ce3f140 100644
--- a/third_party/WebKit/Source/platform/graphics/UnacceleratedImageBufferSurface.cpp
+++ b/third_party/WebKit/Source/platform/graphics/UnacceleratedImageBufferSurface.cpp
@@ -30,7 +30,6 @@
 
 #include "platform/graphics/UnacceleratedImageBufferSurface.h"
 
-#include "platform/RuntimeEnabledFeatures.h"
 #include "platform/graphics/StaticBitmapImage.h"
 #include "platform/graphics/skia/SkiaUtils.h"
 #include "platform/wtf/PassRefPtr.h"
@@ -47,23 +46,30 @@
   SkAlphaType alpha_type =
       (kOpaque == opacity_mode) ? kOpaque_SkAlphaType : kPremul_SkAlphaType;
   SkImageInfo info = SkImageInfo::Make(
-      size.Width(), size.Height(), color_params.GetSkColorType(), alpha_type,
-      color_params.GetSkColorSpaceForSkSurfaces());
+      size.Width(), size.Height(), color_params.GetSkColorType(), alpha_type);
+  // In legacy mode the backing SkSurface should not have any color space.
+  // If color correct rendering is enabled only for SRGB, still the backing
+  // surface should not have any color space and the treatment of legacy data
+  // as SRGB will be managed by wrapping the internal SkCanvas inside a
+  // SkColorSpaceXformCanvas. If color correct rendering is enbaled for other
+  // color spaces, we set the color space properly.
+  if (CanvasColorParams::ColorCorrectRenderingInAnyColorSpace())
+    info = info.makeColorSpace(color_params.GetSkColorSpaceForSkSurfaces());
+
   SkSurfaceProps disable_lcd_props(0, kUnknown_SkPixelGeometry);
   surface_ = SkSurface::MakeRaster(
       info, kOpaque == opacity_mode ? 0 : &disable_lcd_props);
-
   if (!surface_)
     return;
 
+  sk_sp<SkColorSpace> xform_canvas_color_space = nullptr;
+  if (color_params.ColorCorrectNoColorSpaceToSRGB())
+    xform_canvas_color_space = color_params.GetSkColorSpace();
+  canvas_ = WTF::WrapUnique(
+      new SkiaPaintCanvas(surface_->getCanvas(), xform_canvas_color_space));
+
   // Always save an initial frame, to support resetting the top level matrix
   // and clip.
-  canvas_ = WTF::WrapUnique(new SkiaPaintCanvas(
-      surface_->getCanvas(),
-      RuntimeEnabledFeatures::ColorCorrectRenderingEnabled() &&
-              color_params.UsesOutputSpaceBlending()
-          ? color_params.GetSkColorSpace()
-          : nullptr));
   canvas_->save();
 
   if (initialization_mode == kInitializeImagePixels)
diff --git a/third_party/WebKit/Source/platform/graphics/gpu/AcceleratedImageBufferSurface.cpp b/third_party/WebKit/Source/platform/graphics/gpu/AcceleratedImageBufferSurface.cpp
index aa3402e..899cf4f 100644
--- a/third_party/WebKit/Source/platform/graphics/gpu/AcceleratedImageBufferSurface.cpp
+++ b/third_party/WebKit/Source/platform/graphics/gpu/AcceleratedImageBufferSurface.cpp
@@ -30,7 +30,6 @@
 
 #include "platform/graphics/gpu/AcceleratedImageBufferSurface.h"
 
-#include "platform/RuntimeEnabledFeatures.h"
 #include "platform/graphics/AcceleratedStaticBitmapImage.h"
 #include "platform/graphics/gpu/SharedGpuContext.h"
 #include "platform/graphics/skia/SkiaUtils.h"
@@ -57,8 +56,16 @@
   SkAlphaType alpha_type =
       (kOpaque == opacity_mode) ? kOpaque_SkAlphaType : kPremul_SkAlphaType;
   SkImageInfo info = SkImageInfo::Make(
-      size.Width(), size.Height(), color_params.GetSkColorType(), alpha_type,
-      color_params.GetSkColorSpaceForSkSurfaces());
+      size.Width(), size.Height(), color_params.GetSkColorType(), alpha_type);
+  // In legacy mode the backing SkSurface should not have any color space.
+  // If color correct rendering is enabled only for SRGB, still the backing
+  // surface should not have any color space and the treatment of legacy data
+  // as SRGB will be managed by wrapping the internal SkCanvas inside a
+  // SkColorSpaceXformCanvas. If color correct rendering is enbaled for other
+  // color spaces, we set the color space properly.
+  if (CanvasColorParams::ColorCorrectRenderingInAnyColorSpace())
+    info = info.makeColorSpace(color_params.GetSkColorSpaceForSkSurfaces());
+
   SkSurfaceProps disable_lcd_props(0, kUnknown_SkPixelGeometry);
   surface_ = SkSurface::MakeRenderTarget(
       gr_context, SkBudgeted::kYes, info, 0 /* sampleCount */,
@@ -66,12 +73,11 @@
   if (!surface_)
     return;
 
-  canvas_ = WTF::WrapUnique(new SkiaPaintCanvas(
-      surface_->getCanvas(),
-      RuntimeEnabledFeatures::ColorCorrectRenderingEnabled() &&
-              color_params.UsesOutputSpaceBlending()
-          ? color_params.GetSkColorSpace()
-          : nullptr));
+  sk_sp<SkColorSpace> xform_canvas_color_space = nullptr;
+  if (color_params.ColorCorrectNoColorSpaceToSRGB())
+    xform_canvas_color_space = color_params.GetSkColorSpace();
+  canvas_ = WTF::WrapUnique(
+      new SkiaPaintCanvas(surface_->getCanvas(), xform_canvas_color_space));
   Clear();
 
   // Always save an initial frame, to support resetting the top level matrix
diff --git a/third_party/WebKit/Source/platform/heap/HeapAllocator.h b/third_party/WebKit/Source/platform/heap/HeapAllocator.h
index 42dd648..117d9ba1 100644
--- a/third_party/WebKit/Source/platform/heap/HeapAllocator.h
+++ b/third_party/WebKit/Source/platform/heap/HeapAllocator.h
@@ -329,23 +329,22 @@
   // Use the payload size as recorded by the heap to determine how many
   // elements to finalize.
   size_t length = header->PayloadSize() / sizeof(T);
-  T* buffer = reinterpret_cast<T*>(pointer);
+  char* payload = static_cast<char*>(pointer);
 #ifdef ANNOTATE_CONTIGUOUS_CONTAINER
+  ANNOTATE_CHANGE_SIZE(payload, length * sizeof(T), 0, length * sizeof(T));
+#endif
   // As commented above, HeapVectorBacking calls finalizers for unused slots
   // (which are already zeroed out).
-  ANNOTATE_CHANGE_SIZE(buffer, length, 0, length);
-#endif
   if (std::is_polymorphic<T>::value) {
-    char* pointer = reinterpret_cast<char*>(buffer);
     for (unsigned i = 0; i < length; ++i) {
-      char* element = pointer + i * sizeof(T);
+      char* element = payload + i * sizeof(T);
       if (blink::VTableInitialized(element))
         reinterpret_cast<T*>(element)->~T();
     }
   } else {
-    for (unsigned i = 0; i < length; ++i) {
+    T* buffer = reinterpret_cast<T*>(payload);
+    for (unsigned i = 0; i < length; ++i)
       buffer[i].~T();
-    }
   }
 }
 
diff --git a/third_party/WebKit/Source/platform/network/HTTPParsers.cpp b/third_party/WebKit/Source/platform/network/HTTPParsers.cpp
index 39c96cd..3d0015b 100644
--- a/third_party/WebKit/Source/platform/network/HTTPParsers.cpp
+++ b/third_party/WebKit/Source/platform/network/HTTPParsers.cpp
@@ -835,8 +835,8 @@
 
     HeaderFieldTokenizer tokenizer(headerValue);
     while (!tokenizer.IsConsumed()) {
-      StringView metric;
-      if (!tokenizer.ConsumeToken(Mode::kNormal, metric)) {
+      StringView name;
+      if (!tokenizer.ConsumeToken(Mode::kNormal, name)) {
         break;
       }
 
@@ -853,7 +853,7 @@
       }
 
       headers->push_back(WTF::MakeUnique<ServerTimingHeader>(
-          metric.ToString(), value, description));
+          name.ToString(), value, description));
 
       if (!tokenizer.Consume(',')) {
         break;
diff --git a/third_party/WebKit/Source/platform/network/HTTPParsers.h b/third_party/WebKit/Source/platform/network/HTTPParsers.h
index b52261c..cd6fff7b 100644
--- a/third_party/WebKit/Source/platform/network/HTTPParsers.h
+++ b/third_party/WebKit/Source/platform/network/HTTPParsers.h
@@ -84,12 +84,12 @@
 };
 
 struct ServerTimingHeader {
-  String metric;
-  double value;
+  String name;
+  double duration;
   String description;
 
-  ServerTimingHeader(String metric, double value, String description)
-      : metric(metric), value(value), description(description) {}
+  ServerTimingHeader(String name, double duration, String description)
+      : name(name), duration(duration), description(description) {}
 };
 
 using ServerTimingHeaderVector = Vector<std::unique_ptr<ServerTimingHeader>>;
@@ -158,11 +158,11 @@
                                                    ResourceResponse*,
                                                    size_t* end);
 
-// Parses a header value containing JSON data, according to
+// Parses a header duration containing JSON data, according to
 // https://tools.ietf.org/html/draft-ietf-httpbis-jfv-01
 // Returns an empty unique_ptr if the header cannot be parsed as JSON. JSON
 // strings which represent object nested deeper than |maxParseDepth| will also
-// cause an empty return value.
+// cause an empty return duration.
 PLATFORM_EXPORT std::unique_ptr<JSONArray> ParseJSONHeader(const String& header,
                                                            int max_parse_depth);
 
diff --git a/third_party/WebKit/Source/platform/network/HTTPParsersTest.cpp b/third_party/WebKit/Source/platform/network/HTTPParsersTest.cpp
index 436ffa4..ffd03ea 100644
--- a/third_party/WebKit/Source/platform/network/HTTPParsersTest.cpp
+++ b/third_party/WebKit/Source/platform/network/HTTPParsersTest.cpp
@@ -501,8 +501,8 @@
   unsigned i = 0;
   for (const auto& header : *results) {
     Vector<String> expectedResult = expectedResults[i++];
-    EXPECT_EQ(header->metric, expectedResult[0]);
-    EXPECT_EQ(header->value, expectedResult[1].ToDouble());
+    EXPECT_EQ(header->name, expectedResult[0]);
+    EXPECT_EQ(header->duration, expectedResult[1].ToDouble());
     EXPECT_EQ(header->description, expectedResult[2]);
   }
 }
diff --git a/third_party/WebKit/Source/platform/scheduler/BUILD.gn b/third_party/WebKit/Source/platform/scheduler/BUILD.gn
index 7a26319..2ac5798 100644
--- a/third_party/WebKit/Source/platform/scheduler/BUILD.gn
+++ b/third_party/WebKit/Source/platform/scheduler/BUILD.gn
@@ -88,6 +88,8 @@
     "renderer/render_widget_scheduling_state.cc",
     "renderer/render_widget_signals.cc",
     "renderer/render_widget_signals.h",
+    "renderer/renderer_metrics_helper.cc",
+    "renderer/renderer_metrics_helper.h",
     "renderer/renderer_scheduler.cc",
     "renderer/renderer_scheduler_impl.cc",
     "renderer/renderer_scheduler_impl.h",
@@ -187,6 +189,7 @@
     "renderer/deadline_task_runner_unittest.cc",
     "renderer/idle_time_estimator_unittest.cc",
     "renderer/render_widget_signals_unittest.cc",
+    "renderer/renderer_metrics_helper_unittest.cc",
     "renderer/renderer_scheduler_impl_unittest.cc",
     "renderer/task_cost_estimator_unittest.cc",
     "renderer/task_duration_metric_reporter_unittest.cc",
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper.cc
new file mode 100644
index 0000000..0680913
--- /dev/null
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper.cc
@@ -0,0 +1,359 @@
+// 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 "platform/scheduler/renderer/renderer_metrics_helper.h"
+
+#include "base/bind.h"
+#include "base/metrics/histogram_macros.h"
+#include "platform/scheduler/renderer/renderer_scheduler_impl.h"
+#include "public/platform/scheduler/renderer_process_type.h"
+
+namespace blink {
+namespace scheduler {
+
+#define TASK_DURATION_METRIC_NAME "RendererScheduler.TaskDurationPerQueueType2"
+#define TASK_COUNT_METRIC_NAME "RendererScheduler.TaskCountPerQueueType"
+#define MAIN_THREAD_LOAD_METRIC_NAME "RendererScheduler.RendererMainThreadLoad5"
+#define EXTENSIONS_MAIN_THREAD_LOAD_METRIC_NAME \
+  MAIN_THREAD_LOAD_METRIC_NAME ".Extension"
+
+namespace {
+
+constexpr base::TimeDelta kThreadLoadTrackerReportingInterval =
+    base::TimeDelta::FromSeconds(1);
+// Threshold for discarding ultra-long tasks. Is it assumed that ultra-long
+// tasks are reporting glitches (e.g. system falling asleep in the middle
+// of the task).
+constexpr base::TimeDelta kLongTaskDiscardingThreshold =
+    base::TimeDelta::FromSeconds(30);
+constexpr base::TimeDelta kLongIdlePeriodDiscardingThreshold =
+    base::TimeDelta::FromMinutes(3);
+
+}  // namespace
+
+RendererMetricsHelper::RendererMetricsHelper(
+    RendererSchedulerImpl* renderer_scheduler,
+    base::TimeTicks now,
+    bool renderer_backgrounded)
+    : renderer_scheduler_(renderer_scheduler),
+      main_thread_load_tracker(
+          now,
+          base::Bind(&RendererMetricsHelper::RecordMainThreadTaskLoad,
+                     base::Unretained(this)),
+          kThreadLoadTrackerReportingInterval),
+      background_main_thread_load_tracker(
+          now,
+          base::Bind(&RendererMetricsHelper::RecordBackgroundMainThreadTaskLoad,
+                     base::Unretained(this)),
+          kThreadLoadTrackerReportingInterval),
+      foreground_main_thread_load_tracker(
+          now,
+          base::Bind(&RendererMetricsHelper::RecordForegroundMainThreadTaskLoad,
+                     base::Unretained(this)),
+          kThreadLoadTrackerReportingInterval),
+      task_duration_reporter(TASK_DURATION_METRIC_NAME),
+      foreground_task_duration_reporter(TASK_DURATION_METRIC_NAME
+                                        ".Foreground"),
+      foreground_first_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME
+                                                     ".Foreground.FirstMinute"),
+      foreground_second_minute_task_duration_reporter(
+          TASK_DURATION_METRIC_NAME ".Foreground.SecondMinute"),
+      foreground_third_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME
+                                                     ".Foreground.ThirdMinute"),
+      foreground_after_third_minute_task_duration_reporter(
+          TASK_DURATION_METRIC_NAME ".Foreground.AfterThirdMinute"),
+      background_task_duration_reporter(TASK_DURATION_METRIC_NAME
+                                        ".Background"),
+      background_first_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME
+                                                     ".Background.FirstMinute"),
+      background_second_minute_task_duration_reporter(
+          TASK_DURATION_METRIC_NAME ".Background.SecondMinute"),
+      background_third_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME
+                                                     ".Background.ThirdMinute"),
+      background_fourth_minute_task_duration_reporter(
+          TASK_DURATION_METRIC_NAME ".Background.FourthMinute"),
+      background_fifth_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME
+                                                     ".Background.FifthMinute"),
+      background_after_fifth_minute_task_duration_reporter(
+          TASK_DURATION_METRIC_NAME ".Background.AfterFifthMinute"),
+      hidden_task_duration_reporter(TASK_DURATION_METRIC_NAME ".Hidden"),
+      visible_task_duration_reporter(TASK_DURATION_METRIC_NAME ".Visible"),
+      hidden_music_task_duration_reporter(TASK_DURATION_METRIC_NAME
+                                          ".HiddenMusic") {
+  main_thread_load_tracker.Resume(now);
+  if (renderer_backgrounded) {
+    background_main_thread_load_tracker.Resume(now);
+  } else {
+    foreground_main_thread_load_tracker.Resume(now);
+  }
+}
+
+RendererMetricsHelper::~RendererMetricsHelper() {}
+
+void RendererMetricsHelper::OnRendererForegrounded(base::TimeTicks now) {
+  foreground_main_thread_load_tracker.Resume(now);
+  background_main_thread_load_tracker.Pause(now);
+}
+
+void RendererMetricsHelper::OnRendererBackgrounded(base::TimeTicks now) {
+  foreground_main_thread_load_tracker.Pause(now);
+  background_main_thread_load_tracker.Resume(now);
+}
+
+void RendererMetricsHelper::OnRendererShutdown(base::TimeTicks now) {
+  foreground_main_thread_load_tracker.RecordIdle(now);
+  background_main_thread_load_tracker.RecordIdle(now);
+  main_thread_load_tracker.RecordIdle(now);
+}
+
+namespace {
+
+// Calculates the length of the intersection of two given time intervals.
+base::TimeDelta DurationOfIntervalOverlap(base::TimeTicks start1,
+                                          base::TimeTicks end1,
+                                          base::TimeTicks start2,
+                                          base::TimeTicks end2) {
+  DCHECK_LE(start1, end1);
+  DCHECK_LE(start2, end2);
+  return std::max(std::min(end1, end2) - std::max(start1, start2),
+                  base::TimeDelta());
+}
+
+}  // namespace
+
+void RendererMetricsHelper::RecordTaskMetrics(
+    MainThreadTaskQueue::QueueType queue_type,
+    base::TimeTicks start_time,
+    base::TimeTicks end_time) {
+  base::TimeDelta duration = end_time - start_time;
+  if (duration > kLongTaskDiscardingThreshold)
+    return;
+
+  // Discard anomalously long idle periods.
+  if (last_reported_task_ && start_time - last_reported_task_.value() >
+                                 kLongIdlePeriodDiscardingThreshold) {
+    main_thread_load_tracker.Reset(end_time);
+    foreground_main_thread_load_tracker.Reset(end_time);
+    background_main_thread_load_tracker.Reset(end_time);
+    return;
+  }
+
+  last_reported_task_ = end_time;
+
+  UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime2",
+                              duration.InMicroseconds(), 1, 1000 * 1000, 50);
+
+  // We want to measure thread time here, but for efficiency reasons
+  // we stick with wall time.
+  main_thread_load_tracker.RecordTaskTime(start_time, end_time);
+  foreground_main_thread_load_tracker.RecordTaskTime(start_time, end_time);
+  background_main_thread_load_tracker.RecordTaskTime(start_time, end_time);
+
+  UMA_HISTOGRAM_ENUMERATION(
+      TASK_COUNT_METRIC_NAME, static_cast<int>(queue_type),
+      static_cast<int>(MainThreadTaskQueue::QueueType::COUNT));
+
+  if (duration >= base::TimeDelta::FromMilliseconds(16)) {
+    UMA_HISTOGRAM_ENUMERATION(
+        TASK_COUNT_METRIC_NAME ".LongerThan16ms", static_cast<int>(queue_type),
+        static_cast<int>(MainThreadTaskQueue::QueueType::COUNT));
+  }
+
+  if (duration >= base::TimeDelta::FromMilliseconds(50)) {
+    UMA_HISTOGRAM_ENUMERATION(
+        TASK_COUNT_METRIC_NAME ".LongerThan50ms", static_cast<int>(queue_type),
+        static_cast<int>(MainThreadTaskQueue::QueueType::COUNT));
+  }
+
+  if (duration >= base::TimeDelta::FromMilliseconds(100)) {
+    UMA_HISTOGRAM_ENUMERATION(
+        TASK_COUNT_METRIC_NAME ".LongerThan100ms", static_cast<int>(queue_type),
+        static_cast<int>(MainThreadTaskQueue::QueueType::COUNT));
+  }
+
+  if (duration >= base::TimeDelta::FromMilliseconds(150)) {
+    UMA_HISTOGRAM_ENUMERATION(
+        TASK_COUNT_METRIC_NAME ".LongerThan150ms", static_cast<int>(queue_type),
+        static_cast<int>(MainThreadTaskQueue::QueueType::COUNT));
+  }
+
+  if (duration >= base::TimeDelta::FromSeconds(1)) {
+    UMA_HISTOGRAM_ENUMERATION(
+        TASK_COUNT_METRIC_NAME ".LongerThan1s", static_cast<int>(queue_type),
+        static_cast<int>(MainThreadTaskQueue::QueueType::COUNT));
+  }
+
+  task_duration_reporter.RecordTask(queue_type, duration);
+
+  if (renderer_scheduler_->main_thread_only().renderer_backgrounded) {
+    background_task_duration_reporter.RecordTask(queue_type, duration);
+
+    // Collect detailed breakdown for first five minutes given that we stop
+    // timers on mobile after five minutes.
+    base::TimeTicks backgrounded_at =
+        renderer_scheduler_->main_thread_only().background_status_changed_at;
+
+    background_first_minute_task_duration_reporter.RecordTask(
+        queue_type, DurationOfIntervalOverlap(
+                        start_time, end_time, backgrounded_at,
+                        backgrounded_at + base::TimeDelta::FromMinutes(1)));
+
+    background_second_minute_task_duration_reporter.RecordTask(
+        queue_type, DurationOfIntervalOverlap(
+                        start_time, end_time,
+                        backgrounded_at + base::TimeDelta::FromMinutes(1),
+                        backgrounded_at + base::TimeDelta::FromMinutes(2)));
+
+    background_third_minute_task_duration_reporter.RecordTask(
+        queue_type, DurationOfIntervalOverlap(
+                        start_time, end_time,
+                        backgrounded_at + base::TimeDelta::FromMinutes(2),
+                        backgrounded_at + base::TimeDelta::FromMinutes(3)));
+
+    background_fourth_minute_task_duration_reporter.RecordTask(
+        queue_type, DurationOfIntervalOverlap(
+                        start_time, end_time,
+                        backgrounded_at + base::TimeDelta::FromMinutes(3),
+                        backgrounded_at + base::TimeDelta::FromMinutes(4)));
+
+    background_fifth_minute_task_duration_reporter.RecordTask(
+        queue_type, DurationOfIntervalOverlap(
+                        start_time, end_time,
+                        backgrounded_at + base::TimeDelta::FromMinutes(4),
+                        backgrounded_at + base::TimeDelta::FromMinutes(5)));
+
+    background_after_fifth_minute_task_duration_reporter.RecordTask(
+        queue_type,
+        DurationOfIntervalOverlap(
+            start_time, end_time,
+            backgrounded_at + base::TimeDelta::FromMinutes(5),
+            std::max(backgrounded_at + base::TimeDelta::FromMinutes(5),
+                     end_time)));
+  } else {
+    foreground_task_duration_reporter.RecordTask(queue_type, duration);
+
+    // For foreground tabs we do not expect such a notable difference as it is
+    // the case with background tabs, so we limit breakdown to three minutes.
+    base::TimeTicks foregrounded_at =
+        renderer_scheduler_->main_thread_only().background_status_changed_at;
+
+    foreground_first_minute_task_duration_reporter.RecordTask(
+        queue_type, DurationOfIntervalOverlap(
+                        start_time, end_time, foregrounded_at,
+                        foregrounded_at + base::TimeDelta::FromMinutes(1)));
+
+    foreground_second_minute_task_duration_reporter.RecordTask(
+        queue_type, DurationOfIntervalOverlap(
+                        start_time, end_time,
+                        foregrounded_at + base::TimeDelta::FromMinutes(1),
+                        foregrounded_at + base::TimeDelta::FromMinutes(2)));
+
+    foreground_third_minute_task_duration_reporter.RecordTask(
+        queue_type, DurationOfIntervalOverlap(
+                        start_time, end_time,
+                        foregrounded_at + base::TimeDelta::FromMinutes(2),
+                        foregrounded_at + base::TimeDelta::FromMinutes(3)));
+
+    foreground_after_third_minute_task_duration_reporter.RecordTask(
+        queue_type,
+        DurationOfIntervalOverlap(
+            start_time, end_time,
+            foregrounded_at + base::TimeDelta::FromMinutes(3),
+            std::max(foregrounded_at + base::TimeDelta::FromMinutes(3),
+                     end_time)));
+  }
+
+  if (renderer_scheduler_->main_thread_only().renderer_hidden) {
+    hidden_task_duration_reporter.RecordTask(queue_type, duration);
+
+    if (renderer_scheduler_->ShouldDisableThrottlingBecauseOfAudio(
+            start_time)) {
+      hidden_music_task_duration_reporter.RecordTask(queue_type, duration);
+    }
+  } else {
+    visible_task_duration_reporter.RecordTask(queue_type, duration);
+  }
+}
+
+void RendererMetricsHelper::RecordMainThreadTaskLoad(base::TimeTicks time,
+                                                     double load) {
+  int load_percentage = static_cast<int>(load * 100);
+  DCHECK_LE(load_percentage, 100);
+
+  UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME, load_percentage);
+
+  if (renderer_scheduler_->main_thread_only().process_type ==
+      RendererProcessType::kExtensionRenderer) {
+    UMA_HISTOGRAM_PERCENTAGE(EXTENSIONS_MAIN_THREAD_LOAD_METRIC_NAME,
+                             load_percentage);
+  }
+
+  TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
+                 "RendererScheduler.RendererMainThreadLoad", load_percentage);
+}
+
+void RendererMetricsHelper::RecordForegroundMainThreadTaskLoad(
+    base::TimeTicks time,
+    double load) {
+  int load_percentage = static_cast<int>(load * 100);
+  DCHECK_LE(load_percentage, 100);
+
+  switch (renderer_scheduler_->main_thread_only().process_type) {
+    case RendererProcessType::kExtensionRenderer:
+      UMA_HISTOGRAM_PERCENTAGE(EXTENSIONS_MAIN_THREAD_LOAD_METRIC_NAME
+                               ".Foreground",
+                               load_percentage);
+      break;
+    case RendererProcessType::kRenderer:
+      UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME ".Foreground",
+                               load_percentage);
+
+      if (time - renderer_scheduler_->main_thread_only()
+                     .background_status_changed_at >
+          base::TimeDelta::FromMinutes(1)) {
+        UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME
+                                 ".Foreground.AfterFirstMinute",
+                                 load_percentage);
+      }
+      break;
+  }
+
+  TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
+                 "RendererScheduler.RendererMainThreadLoad.Foreground",
+                 load_percentage);
+}
+
+void RendererMetricsHelper::RecordBackgroundMainThreadTaskLoad(
+    base::TimeTicks time,
+    double load) {
+  int load_percentage = static_cast<int>(load * 100);
+  DCHECK_LE(load_percentage, 100);
+
+  switch (renderer_scheduler_->main_thread_only().process_type) {
+    case RendererProcessType::kExtensionRenderer:
+      UMA_HISTOGRAM_PERCENTAGE(EXTENSIONS_MAIN_THREAD_LOAD_METRIC_NAME
+                               ".Background",
+                               load_percentage);
+      break;
+    case RendererProcessType::kRenderer:
+      UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME ".Background",
+                               load_percentage);
+
+      if (time - renderer_scheduler_->main_thread_only()
+                     .background_status_changed_at >
+          base::TimeDelta::FromMinutes(1)) {
+        UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME
+                                 ".Background.AfterFirstMinute",
+                                 load_percentage);
+      }
+      break;
+  }
+
+  TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
+                 "RendererScheduler.RendererMainThreadLoad.Background",
+                 load_percentage);
+}
+
+}  // namespace scheduler
+}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper.h b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper.h
new file mode 100644
index 0000000..6ad79c03
--- /dev/null
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper.h
@@ -0,0 +1,75 @@
+// 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 THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_RENDERER_METRICS_HELPER_H_
+#define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_RENDERER_METRICS_HELPER_H_
+
+#include "base/macros.h"
+#include "base/time/time.h"
+#include "platform/PlatformExport.h"
+#include "platform/scheduler/base/thread_load_tracker.h"
+#include "platform/scheduler/renderer/main_thread_task_queue.h"
+#include "platform/scheduler/renderer/task_duration_metric_reporter.h"
+
+namespace blink {
+namespace scheduler {
+
+class RendererSchedulerImpl;
+
+// Helper class to take care of metrics on behalf of RendererScheduler.
+// This class should be used only on the main thread.
+class PLATFORM_EXPORT RendererMetricsHelper {
+ public:
+  RendererMetricsHelper(RendererSchedulerImpl* renderer_scheduler,
+                        base::TimeTicks now,
+                        bool renderer_backgrounded);
+  ~RendererMetricsHelper();
+
+  void RecordTaskMetrics(MainThreadTaskQueue::QueueType queue_type,
+                         base::TimeTicks start_time,
+                         base::TimeTicks end_time);
+
+  void OnRendererForegrounded(base::TimeTicks now);
+  void OnRendererBackgrounded(base::TimeTicks now);
+  void OnRendererShutdown(base::TimeTicks now);
+
+  void RecordMainThreadTaskLoad(base::TimeTicks time, double load);
+  void RecordForegroundMainThreadTaskLoad(base::TimeTicks time, double load);
+  void RecordBackgroundMainThreadTaskLoad(base::TimeTicks time, double load);
+
+ private:
+  RendererSchedulerImpl* renderer_scheduler_;  // NOT OWNED
+
+  base::Optional<base::TimeTicks> last_reported_task_;
+
+  ThreadLoadTracker main_thread_load_tracker;
+  ThreadLoadTracker background_main_thread_load_tracker;
+  ThreadLoadTracker foreground_main_thread_load_tracker;
+
+  TaskDurationMetricReporter task_duration_reporter;
+  TaskDurationMetricReporter foreground_task_duration_reporter;
+  TaskDurationMetricReporter foreground_first_minute_task_duration_reporter;
+  TaskDurationMetricReporter foreground_second_minute_task_duration_reporter;
+  TaskDurationMetricReporter foreground_third_minute_task_duration_reporter;
+  TaskDurationMetricReporter
+      foreground_after_third_minute_task_duration_reporter;
+  TaskDurationMetricReporter background_task_duration_reporter;
+  TaskDurationMetricReporter background_first_minute_task_duration_reporter;
+  TaskDurationMetricReporter background_second_minute_task_duration_reporter;
+  TaskDurationMetricReporter background_third_minute_task_duration_reporter;
+  TaskDurationMetricReporter background_fourth_minute_task_duration_reporter;
+  TaskDurationMetricReporter background_fifth_minute_task_duration_reporter;
+  TaskDurationMetricReporter
+      background_after_fifth_minute_task_duration_reporter;
+  TaskDurationMetricReporter hidden_task_duration_reporter;
+  TaskDurationMetricReporter visible_task_duration_reporter;
+  TaskDurationMetricReporter hidden_music_task_duration_reporter;
+
+  DISALLOW_COPY_AND_ASSIGN(RendererMetricsHelper);
+};
+
+}  // namespace scheduler
+}  // namespace blink
+
+#endif  // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_RENDERER_METRICS_HELPER_H_
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper_unittest.cc
new file mode 100644
index 0000000..18e7557
--- /dev/null
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_metrics_helper_unittest.cc
@@ -0,0 +1,176 @@
+// 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 "platform/scheduler/renderer/renderer_metrics_helper.h"
+
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "base/test/histogram_tester.h"
+#include "base/test/simple_test_tick_clock.h"
+#include "components/viz/test/ordered_simple_task_runner.h"
+#include "platform/scheduler/base/test_time_source.h"
+#include "platform/scheduler/child/scheduler_tqm_delegate_for_test.h"
+#include "platform/scheduler/renderer/renderer_scheduler_impl.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace blink {
+namespace scheduler {
+
+using QueueType = MainThreadTaskQueue::QueueType;
+using testing::ElementsAre;
+using base::Bucket;
+
+class RendererMetricsHelperTest : public ::testing::Test {
+ public:
+  RendererMetricsHelperTest() {}
+  ~RendererMetricsHelperTest() {}
+
+  void SetUp() {
+    histogram_tester_.reset(new base::HistogramTester());
+    clock_ = base::MakeUnique<base::SimpleTestTickClock>();
+    mock_task_runner_ =
+        make_scoped_refptr(new cc::OrderedSimpleTaskRunner(clock_.get(), true));
+    delegate_ = SchedulerTqmDelegateForTest::Create(
+        mock_task_runner_, base::MakeUnique<TestTimeSource>(clock_.get()));
+    scheduler_ = base::MakeUnique<RendererSchedulerImpl>(delegate_);
+    metrics_helper_ = &scheduler_->main_thread_only().metrics_helper;
+  }
+
+  void TearDown() {
+    scheduler_->Shutdown();
+    scheduler_.reset();
+  }
+
+  void RunTask(MainThreadTaskQueue::QueueType queue_type,
+               base::TimeTicks start,
+               base::TimeDelta duration) {
+    DCHECK_LE(clock_->NowTicks(), start);
+    clock_->SetNowTicks(start + duration);
+    metrics_helper_->RecordTaskMetrics(queue_type, start, start + duration);
+  }
+
+  base::TimeTicks Microseconds(int microseconds) {
+    return base::TimeTicks() + base::TimeDelta::FromMicroseconds(microseconds);
+  }
+
+  base::TimeTicks Milliseconds(int milliseconds) {
+    return base::TimeTicks() + base::TimeDelta::FromMilliseconds(milliseconds);
+  }
+
+  std::unique_ptr<base::SimpleTestTickClock> clock_;
+  scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_;
+  scoped_refptr<SchedulerTqmDelegate> delegate_;
+  std::unique_ptr<RendererSchedulerImpl> scheduler_;
+  RendererMetricsHelper* metrics_helper_;  // NOT OWNED
+  std::unique_ptr<base::HistogramTester> histogram_tester_;
+
+  DISALLOW_COPY_AND_ASSIGN(RendererMetricsHelperTest);
+};
+
+TEST_F(RendererMetricsHelperTest, Metrics) {
+  // QueueType::DEFAULT is checking sub-millisecond task aggregation,
+  // FRAME_* tasks are checking normal task aggregation and other
+  // queue types have a single task.
+  RunTask(QueueType::DEFAULT, Milliseconds(1),
+          base::TimeDelta::FromMicroseconds(700));
+  RunTask(QueueType::DEFAULT, Milliseconds(2),
+          base::TimeDelta::FromMicroseconds(700));
+  RunTask(QueueType::DEFAULT, Milliseconds(3),
+          base::TimeDelta::FromMicroseconds(700));
+
+  RunTask(QueueType::DEFAULT_LOADING, Milliseconds(200),
+          base::TimeDelta::FromMilliseconds(20));
+  RunTask(QueueType::CONTROL, Milliseconds(400),
+          base::TimeDelta::FromMilliseconds(30));
+  RunTask(QueueType::DEFAULT_TIMER, Milliseconds(600),
+          base::TimeDelta::FromMilliseconds(5));
+  RunTask(QueueType::FRAME_LOADING, Milliseconds(800),
+          base::TimeDelta::FromMilliseconds(70));
+  RunTask(QueueType::FRAME_UNTHROTTLED, Milliseconds(1000),
+          base::TimeDelta::FromMilliseconds(20));
+  RunTask(QueueType::COMPOSITOR, Milliseconds(1200),
+          base::TimeDelta::FromMilliseconds(25));
+  RunTask(QueueType::TEST, Milliseconds(1600),
+          base::TimeDelta::FromMilliseconds(85));
+
+  scheduler_->SetRendererBackgrounded(true);
+
+  RunTask(QueueType::CONTROL, Milliseconds(2000),
+          base::TimeDelta::FromMilliseconds(25));
+  RunTask(QueueType::FRAME_TIMER, Milliseconds(2600),
+          base::TimeDelta::FromMilliseconds(175));
+  RunTask(QueueType::UNTHROTTLED, Milliseconds(2800),
+          base::TimeDelta::FromMilliseconds(25));
+  RunTask(QueueType::FRAME_LOADING, Milliseconds(3000),
+          base::TimeDelta::FromMilliseconds(35));
+  RunTask(QueueType::FRAME_TIMER, Milliseconds(3200),
+          base::TimeDelta::FromMilliseconds(5));
+  RunTask(QueueType::COMPOSITOR, Milliseconds(3400),
+          base::TimeDelta::FromMilliseconds(20));
+  RunTask(QueueType::IDLE, Milliseconds(3600),
+          base::TimeDelta::FromMilliseconds(50));
+  RunTask(QueueType::FRAME_LOADING_CONTROL, Milliseconds(4000),
+          base::TimeDelta::FromMilliseconds(5));
+  RunTask(QueueType::CONTROL, Milliseconds(4200),
+          base::TimeDelta::FromMilliseconds(20));
+  RunTask(QueueType::FRAME_TIMER, Milliseconds(4400),
+          base::TimeDelta::FromMilliseconds(115));
+  RunTask(QueueType::FRAME_UNTHROTTLED, Milliseconds(4600),
+          base::TimeDelta::FromMilliseconds(175));
+  RunTask(QueueType::IDLE, Milliseconds(5000),
+          base::TimeDelta::FromMilliseconds(1600));
+
+  std::vector<base::Bucket> expected_samples = {
+      {static_cast<int>(QueueType::CONTROL), 75},
+      {static_cast<int>(QueueType::DEFAULT), 2},
+      {static_cast<int>(QueueType::DEFAULT_LOADING), 20},
+      {static_cast<int>(QueueType::DEFAULT_TIMER), 5},
+      {static_cast<int>(QueueType::UNTHROTTLED), 25},
+      {static_cast<int>(QueueType::FRAME_LOADING), 105},
+      {static_cast<int>(QueueType::FRAME_TIMER), 295},
+      {static_cast<int>(QueueType::FRAME_UNTHROTTLED), 195},
+      {static_cast<int>(QueueType::COMPOSITOR), 45},
+      {static_cast<int>(QueueType::IDLE), 1650},
+      {static_cast<int>(QueueType::TEST), 85},
+      {static_cast<int>(QueueType::FRAME_LOADING_CONTROL), 5}};
+  EXPECT_THAT(histogram_tester_->GetAllSamples(
+                  "RendererScheduler.TaskDurationPerQueueType2"),
+              testing::ContainerEq(expected_samples));
+
+  EXPECT_THAT(
+      histogram_tester_->GetAllSamples(
+          "RendererScheduler.TaskDurationPerQueueType2.Foreground"),
+      ElementsAre(Bucket(static_cast<int>(QueueType::CONTROL), 30),
+                  Bucket(static_cast<int>(QueueType::DEFAULT), 2),
+                  Bucket(static_cast<int>(QueueType::DEFAULT_LOADING), 20),
+                  Bucket(static_cast<int>(QueueType::DEFAULT_TIMER), 5),
+                  Bucket(static_cast<int>(QueueType::FRAME_LOADING), 70),
+                  Bucket(static_cast<int>(QueueType::FRAME_UNTHROTTLED), 20),
+                  Bucket(static_cast<int>(QueueType::COMPOSITOR), 25),
+                  Bucket(static_cast<int>(QueueType::TEST), 85)));
+
+  EXPECT_THAT(
+      histogram_tester_->GetAllSamples(
+          "RendererScheduler.TaskDurationPerQueueType2.Background"),
+      ElementsAre(
+          Bucket(static_cast<int>(QueueType::CONTROL), 45),
+          Bucket(static_cast<int>(QueueType::UNTHROTTLED), 25),
+          Bucket(static_cast<int>(QueueType::FRAME_LOADING), 35),
+          Bucket(static_cast<int>(QueueType::FRAME_TIMER), 295),
+          Bucket(static_cast<int>(QueueType::FRAME_UNTHROTTLED), 175),
+          Bucket(static_cast<int>(QueueType::COMPOSITOR), 20),
+          Bucket(static_cast<int>(QueueType::IDLE), 1650),
+          Bucket(static_cast<int>(QueueType::FRAME_LOADING_CONTROL), 5)));
+}
+
+// TODO(crbug.com/754656): Add tests for NthMinute and AfterNthMinute
+// histograms.
+
+// TODO(crbug.com/754656): Add tests for TaskDuration.Hidden/Visible histograms.
+
+// TODO(crbug.com/754656): Add tests for non-TaskDuration histograms.
+
+}  // namespace scheduler
+}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
index a5ddef26..9769f9f 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
@@ -45,20 +45,11 @@
 // Amount of idle time left in a frame (as a ratio of the vsync interval) above
 // which main thread compositing can be considered fast.
 const double kFastCompositingIdleTimeThreshold = .2;
-constexpr base::TimeDelta kThreadLoadTrackerReportingInterval =
-    base::TimeDelta::FromSeconds(1);
 // We do not throttle anything while audio is played and shortly after that.
 constexpr base::TimeDelta kThrottlingDelayAfterAudioIsPlayed =
     base::TimeDelta::FromSeconds(5);
 constexpr base::TimeDelta kQueueingTimeWindowDuration =
     base::TimeDelta::FromSeconds(1);
-// Threshold for discarding ultra-long tasks. It is assumed that ultra-long
-// tasks are reporting glitches (e.g. system falling asleep in the middle
-// of the task).
-constexpr base::TimeDelta kLongTaskDiscardingThreshold =
-    base::TimeDelta::FromSeconds(30);
-constexpr base::TimeDelta kLongIdlePeriodDiscardingThreshold =
-    base::TimeDelta::FromMinutes(3);
 
 }  // namespace
 
@@ -164,12 +155,6 @@
   DCHECK(main_thread_only().was_shutdown);
 }
 
-#define TASK_DURATION_METRIC_NAME "RendererScheduler.TaskDurationPerQueueType2"
-#define TASK_COUNT_METRIC_NAME "RendererScheduler.TaskCountPerQueueType"
-#define MAIN_THREAD_LOAD_METRIC_NAME "RendererScheduler.RendererMainThreadLoad5"
-#define EXTENSIONS_MAIN_THREAD_LOAD_METRIC_NAME \
-  MAIN_THREAD_LOAD_METRIC_NAME ".Extension"
-
 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly(
     RendererSchedulerImpl* renderer_scheduler_impl,
     const scoped_refptr<MainThreadTaskQueue>& compositor_task_runner,
@@ -185,21 +170,6 @@
                           time_source,
                           kShortIdlePeriodDurationSampleCount,
                           kShortIdlePeriodDurationPercentile),
-      main_thread_load_tracker(
-          now,
-          base::Bind(&RendererSchedulerImpl::RecordMainThreadTaskLoad,
-                     base::Unretained(renderer_scheduler_impl)),
-          kThreadLoadTrackerReportingInterval),
-      background_main_thread_load_tracker(
-          now,
-          base::Bind(&RendererSchedulerImpl::RecordBackgroundMainThreadTaskLoad,
-                     base::Unretained(renderer_scheduler_impl)),
-          kThreadLoadTrackerReportingInterval),
-      foreground_main_thread_load_tracker(
-          now,
-          base::Bind(&RendererSchedulerImpl::RecordForegroundMainThreadTaskLoad,
-                     base::Unretained(renderer_scheduler_impl)),
-          kThreadLoadTrackerReportingInterval),
       current_use_case(UseCase::NONE),
       timer_queue_pause_count(0),
       navigation_task_expected_count(0),
@@ -227,39 +197,8 @@
       background_status_changed_at(now),
       rail_mode_observer(nullptr),
       wake_up_budget_pool(nullptr),
-      task_duration_reporter(TASK_DURATION_METRIC_NAME),
-      foreground_task_duration_reporter(TASK_DURATION_METRIC_NAME
-                                        ".Foreground"),
-      foreground_first_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME
-                                                     ".Foreground.FirstMinute"),
-      foreground_second_minute_task_duration_reporter(
-          TASK_DURATION_METRIC_NAME ".Foreground.SecondMinute"),
-      foreground_third_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME
-                                                     ".Foreground.ThirdMinute"),
-      foreground_after_third_minute_task_duration_reporter(
-          TASK_DURATION_METRIC_NAME ".Foreground.AfterThirdMinute"),
-      background_task_duration_reporter(TASK_DURATION_METRIC_NAME
-                                        ".Background"),
-      background_first_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME
-                                                     ".Background.FirstMinute"),
-      background_second_minute_task_duration_reporter(
-          TASK_DURATION_METRIC_NAME ".Background.SecondMinute"),
-      background_third_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME
-                                                     ".Background.ThirdMinute"),
-      background_fourth_minute_task_duration_reporter(
-          TASK_DURATION_METRIC_NAME ".Background.FourthMinute"),
-      background_fifth_minute_task_duration_reporter(TASK_DURATION_METRIC_NAME
-                                                     ".Background.FifthMinute"),
-      background_after_fifth_minute_task_duration_reporter(
-          TASK_DURATION_METRIC_NAME ".Background.AfterFifthMinute"),
-      hidden_task_duration_reporter(TASK_DURATION_METRIC_NAME ".Hidden"),
-      visible_task_duration_reporter(TASK_DURATION_METRIC_NAME ".Visible"),
-      hidden_music_task_duration_reporter(TASK_DURATION_METRIC_NAME
-                                          ".HiddenMusic"),
-      process_type(RendererProcessType::kRenderer) {
-  main_thread_load_tracker.Resume(now);
-  foreground_main_thread_load_tracker.Resume(now);
-}
+      metrics_helper(renderer_scheduler_impl, now, renderer_backgrounded),
+      process_type(RendererProcessType::kRenderer) {}
 
 RendererSchedulerImpl::MainThreadOnly::~MainThreadOnly() {}
 
@@ -283,8 +222,7 @@
 
 void RendererSchedulerImpl::Shutdown() {
   base::TimeTicks now = tick_clock()->NowTicks();
-  main_thread_only().background_main_thread_load_tracker.RecordIdle(now);
-  main_thread_only().foreground_main_thread_load_tracker.RecordIdle(now);
+  main_thread_only().metrics_helper.OnRendererShutdown(now);
 
   task_queue_throttler_.reset();
   helper_.Shutdown();
@@ -612,11 +550,9 @@
 
   base::TimeTicks now = tick_clock()->NowTicks();
   if (backgrounded) {
-    main_thread_only().foreground_main_thread_load_tracker.Pause(now);
-    main_thread_only().background_main_thread_load_tracker.Resume(now);
+    main_thread_only().metrics_helper.OnRendererBackgrounded(now);
   } else {
-    main_thread_only().foreground_main_thread_load_tracker.Resume(now);
-    main_thread_only().background_main_thread_load_tracker.Pause(now);
+    main_thread_only().metrics_helper.OnRendererForegrounded(now);
   }
 }
 
@@ -1969,271 +1905,8 @@
   task_queue_throttler()->OnTaskRunTimeReported(queue, start, end);
 
   // TODO(altimin): Per-page metrics should also be considered.
-  RecordTaskMetrics(queue->queue_type(), start, end);
-}
-
-namespace {
-
-// Calculates the length of the intersection of two given time intervals.
-base::TimeDelta DurationOfIntervalOverlap(base::TimeTicks start1,
-                                          base::TimeTicks end1,
-                                          base::TimeTicks start2,
-                                          base::TimeTicks end2) {
-  DCHECK_LE(start1, end1);
-  DCHECK_LE(start2, end2);
-  return std::max(std::min(end1, end2) - std::max(start1, start2),
-                  base::TimeDelta());
-}
-
-}  // namespace
-
-void RendererSchedulerImpl::RecordTaskMetrics(
-    MainThreadTaskQueue::QueueType queue_type,
-    base::TimeTicks start_time,
-    base::TimeTicks end_time) {
-  base::TimeDelta duration = end_time - start_time;
-  if (duration > kLongTaskDiscardingThreshold)
-    return;
-
-  // Discard anomalously long idle periods.
-  if (main_thread_only().last_reported_task &&
-      start_time - main_thread_only().last_reported_task.value() >
-          kLongIdlePeriodDiscardingThreshold) {
-    main_thread_only().main_thread_load_tracker.Reset(end_time);
-    main_thread_only().foreground_main_thread_load_tracker.Reset(end_time);
-    main_thread_only().background_main_thread_load_tracker.Reset(end_time);
-    return;
-  }
-
-  main_thread_only().last_reported_task = end_time;
-
-  UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime2",
-                              duration.InMicroseconds(), 1, 1000 * 1000, 50);
-
-  // We want to measure thread time here, but for efficiency reasons
-  // we stick with wall time.
-  main_thread_only().main_thread_load_tracker.RecordTaskTime(start_time,
-                                                             end_time);
-  main_thread_only().foreground_main_thread_load_tracker.RecordTaskTime(
-      start_time, end_time);
-  main_thread_only().background_main_thread_load_tracker.RecordTaskTime(
-      start_time, end_time);
-
-  UMA_HISTOGRAM_ENUMERATION(
-      TASK_COUNT_METRIC_NAME, static_cast<int>(queue_type),
-      static_cast<int>(MainThreadTaskQueue::QueueType::COUNT));
-
-  if (duration >= base::TimeDelta::FromMilliseconds(16)) {
-    UMA_HISTOGRAM_ENUMERATION(
-        TASK_COUNT_METRIC_NAME ".LongerThan16ms", static_cast<int>(queue_type),
-        static_cast<int>(MainThreadTaskQueue::QueueType::COUNT));
-  }
-
-  if (duration >= base::TimeDelta::FromMilliseconds(50)) {
-    UMA_HISTOGRAM_ENUMERATION(
-        TASK_COUNT_METRIC_NAME ".LongerThan50ms", static_cast<int>(queue_type),
-        static_cast<int>(MainThreadTaskQueue::QueueType::COUNT));
-  }
-
-  if (duration >= base::TimeDelta::FromMilliseconds(100)) {
-    UMA_HISTOGRAM_ENUMERATION(
-        TASK_COUNT_METRIC_NAME ".LongerThan100ms", static_cast<int>(queue_type),
-        static_cast<int>(MainThreadTaskQueue::QueueType::COUNT));
-  }
-
-  if (duration >= base::TimeDelta::FromMilliseconds(150)) {
-    UMA_HISTOGRAM_ENUMERATION(
-        TASK_COUNT_METRIC_NAME ".LongerThan150ms", static_cast<int>(queue_type),
-        static_cast<int>(MainThreadTaskQueue::QueueType::COUNT));
-  }
-
-  if (duration >= base::TimeDelta::FromSeconds(1)) {
-    UMA_HISTOGRAM_ENUMERATION(
-        TASK_COUNT_METRIC_NAME ".LongerThan1s", static_cast<int>(queue_type),
-        static_cast<int>(MainThreadTaskQueue::QueueType::COUNT));
-  }
-
-  main_thread_only().task_duration_reporter.RecordTask(queue_type, duration);
-
-  if (main_thread_only().renderer_backgrounded) {
-    main_thread_only().background_task_duration_reporter.RecordTask(queue_type,
-                                                                    duration);
-
-    // Collect detailed breakdown for first five minutes given that we stop
-    // timers on mobile after five minutes.
-    base::TimeTicks backgrounded_at =
-        main_thread_only().background_status_changed_at;
-
-    main_thread_only()
-        .background_first_minute_task_duration_reporter.RecordTask(
-            queue_type, DurationOfIntervalOverlap(
-                            start_time, end_time, backgrounded_at,
-                            backgrounded_at + base::TimeDelta::FromMinutes(1)));
-
-    main_thread_only()
-        .background_second_minute_task_duration_reporter.RecordTask(
-            queue_type, DurationOfIntervalOverlap(
-                            start_time, end_time,
-                            backgrounded_at + base::TimeDelta::FromMinutes(1),
-                            backgrounded_at + base::TimeDelta::FromMinutes(2)));
-
-    main_thread_only()
-        .background_third_minute_task_duration_reporter.RecordTask(
-            queue_type, DurationOfIntervalOverlap(
-                            start_time, end_time,
-                            backgrounded_at + base::TimeDelta::FromMinutes(2),
-                            backgrounded_at + base::TimeDelta::FromMinutes(3)));
-
-    main_thread_only()
-        .background_fourth_minute_task_duration_reporter.RecordTask(
-            queue_type, DurationOfIntervalOverlap(
-                            start_time, end_time,
-                            backgrounded_at + base::TimeDelta::FromMinutes(3),
-                            backgrounded_at + base::TimeDelta::FromMinutes(4)));
-
-    main_thread_only()
-        .background_fifth_minute_task_duration_reporter.RecordTask(
-            queue_type, DurationOfIntervalOverlap(
-                            start_time, end_time,
-                            backgrounded_at + base::TimeDelta::FromMinutes(4),
-                            backgrounded_at + base::TimeDelta::FromMinutes(5)));
-
-    main_thread_only()
-        .background_after_fifth_minute_task_duration_reporter.RecordTask(
-            queue_type,
-            DurationOfIntervalOverlap(
-                start_time, end_time,
-                backgrounded_at + base::TimeDelta::FromMinutes(5),
-                std::max(backgrounded_at + base::TimeDelta::FromMinutes(5),
-                         end_time)));
-  } else {
-    main_thread_only().foreground_task_duration_reporter.RecordTask(queue_type,
-                                                                    duration);
-
-    // For foreground tabs we do not expect such a notable difference as it is
-    // the case with background tabs, so we limit breakdown to three minutes.
-    base::TimeTicks foregrounded_at =
-        main_thread_only().background_status_changed_at;
-
-    main_thread_only()
-        .foreground_first_minute_task_duration_reporter.RecordTask(
-            queue_type, DurationOfIntervalOverlap(
-                            start_time, end_time, foregrounded_at,
-                            foregrounded_at + base::TimeDelta::FromMinutes(1)));
-
-    main_thread_only()
-        .foreground_second_minute_task_duration_reporter.RecordTask(
-            queue_type, DurationOfIntervalOverlap(
-                            start_time, end_time,
-                            foregrounded_at + base::TimeDelta::FromMinutes(1),
-                            foregrounded_at + base::TimeDelta::FromMinutes(2)));
-
-    main_thread_only()
-        .foreground_third_minute_task_duration_reporter.RecordTask(
-            queue_type, DurationOfIntervalOverlap(
-                            start_time, end_time,
-                            foregrounded_at + base::TimeDelta::FromMinutes(2),
-                            foregrounded_at + base::TimeDelta::FromMinutes(3)));
-
-    main_thread_only()
-        .foreground_after_third_minute_task_duration_reporter.RecordTask(
-            queue_type,
-            DurationOfIntervalOverlap(
-                start_time, end_time,
-                foregrounded_at + base::TimeDelta::FromMinutes(3),
-                std::max(foregrounded_at + base::TimeDelta::FromMinutes(3),
-                         end_time)));
-  }
-
-  if (main_thread_only().renderer_hidden) {
-    main_thread_only().hidden_task_duration_reporter.RecordTask(queue_type,
-                                                                duration);
-
-    if (ShouldDisableThrottlingBecauseOfAudio(start_time)) {
-      main_thread_only().hidden_music_task_duration_reporter.RecordTask(
-          queue_type, duration);
-    }
-  } else {
-    main_thread_only().visible_task_duration_reporter.RecordTask(queue_type,
-                                                                 duration);
-  }
-}
-
-void RendererSchedulerImpl::RecordMainThreadTaskLoad(base::TimeTicks time,
-                                                     double load) {
-  int load_percentage = static_cast<int>(load * 100);
-  DCHECK_LE(load_percentage, 100);
-
-  UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME, load_percentage);
-
-  if (main_thread_only().process_type ==
-      RendererProcessType::kExtensionRenderer) {
-    UMA_HISTOGRAM_PERCENTAGE(EXTENSIONS_MAIN_THREAD_LOAD_METRIC_NAME,
-                             load_percentage);
-  }
-
-  TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
-                 "RendererScheduler.RendererMainThreadLoad", load_percentage);
-}
-
-void RendererSchedulerImpl::RecordForegroundMainThreadTaskLoad(
-    base::TimeTicks time,
-    double load) {
-  int load_percentage = static_cast<int>(load * 100);
-  DCHECK_LE(load_percentage, 100);
-
-  switch (main_thread_only().process_type) {
-    case RendererProcessType::kExtensionRenderer:
-      UMA_HISTOGRAM_PERCENTAGE(EXTENSIONS_MAIN_THREAD_LOAD_METRIC_NAME
-                               ".Foreground",
-                               load_percentage);
-      break;
-    case RendererProcessType::kRenderer:
-      UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME ".Foreground",
-                               load_percentage);
-
-      if (time - main_thread_only().background_status_changed_at >
-          base::TimeDelta::FromMinutes(1)) {
-        UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME
-                                 ".Foreground.AfterFirstMinute",
-                                 load_percentage);
-      }
-      break;
-  }
-
-  TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
-                 "RendererScheduler.RendererMainThreadLoad.Foreground",
-                 load_percentage);
-}
-
-void RendererSchedulerImpl::RecordBackgroundMainThreadTaskLoad(
-    base::TimeTicks time,
-    double load) {
-  int load_percentage = static_cast<int>(load * 100);
-  DCHECK_LE(load_percentage, 100);
-
-  switch (main_thread_only().process_type) {
-    case RendererProcessType::kExtensionRenderer:
-      UMA_HISTOGRAM_PERCENTAGE(EXTENSIONS_MAIN_THREAD_LOAD_METRIC_NAME
-                               ".Background",
-                               load_percentage);
-      break;
-    case RendererProcessType::kRenderer:
-      UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME ".Background",
-                               load_percentage);
-
-      if (time - main_thread_only().background_status_changed_at >
-          base::TimeDelta::FromMinutes(1)) {
-        UMA_HISTOGRAM_PERCENTAGE(MAIN_THREAD_LOAD_METRIC_NAME
-                                 ".Background.AfterFirstMinute",
-                                 load_percentage);
-      }
-      break;
-  }
-
-  TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
-                 "RendererScheduler.RendererMainThreadLoad.Background",
-                 load_percentage);
+  main_thread_only().metrics_helper.RecordTaskMetrics(queue->queue_type(),
+                                                      start, end);
 }
 
 void RendererSchedulerImpl::OnBeginNestedRunLoop() {
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h
index d314ef9..eb11315 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h
@@ -14,10 +14,10 @@
 #include "base/synchronization/lock.h"
 #include "base/trace_event/trace_log.h"
 #include "device/base/synchronization/shared_memory_seqlock_buffer.h"
+#include "platform/PlatformExport.h"
 #include "platform/scheduler/base/pollable_thread_safe_flag.h"
 #include "platform/scheduler/base/queueing_time_estimator.h"
 #include "platform/scheduler/base/task_time_observer.h"
-#include "platform/scheduler/base/thread_load_tracker.h"
 #include "platform/scheduler/child/idle_canceled_delayed_task_sweeper.h"
 #include "platform/scheduler/child/idle_helper.h"
 #include "platform/scheduler/renderer/deadline_task_runner.h"
@@ -25,8 +25,8 @@
 #include "platform/scheduler/renderer/main_thread_scheduler_helper.h"
 #include "platform/scheduler/renderer/main_thread_task_queue.h"
 #include "platform/scheduler/renderer/render_widget_signals.h"
+#include "platform/scheduler/renderer/renderer_metrics_helper.h"
 #include "platform/scheduler/renderer/task_cost_estimator.h"
-#include "platform/scheduler/renderer/task_duration_metric_reporter.h"
 #include "platform/scheduler/renderer/user_model.h"
 #include "platform/scheduler/renderer/web_view_scheduler_impl.h"
 #include "public/platform/scheduler/renderer/renderer_scheduler.h"
@@ -253,9 +253,12 @@
   scoped_refptr<base::SingleThreadTaskRunner> TimerTaskRunner() override;
 
  private:
-  friend class RendererSchedulerImplTest;
-  friend class RendererSchedulerImplForTest;
   friend class RenderWidgetSchedulingState;
+  friend class RendererMetricsHelper;
+
+  friend class RendererMetricsHelperTest;
+  friend class RendererSchedulerImplForTest;
+  friend class RendererSchedulerImplTest;
   FRIEND_TEST_ALL_PREFIXES(RendererSchedulerImplTest, Tracing);
 
   enum class ExpensiveTaskPolicy { RUN, BLOCK, THROTTLE };
@@ -505,14 +508,6 @@
 
   void AddQueueToWakeUpBudgetPool(MainThreadTaskQueue* queue);
 
-  void RecordTaskMetrics(MainThreadTaskQueue::QueueType queue_type,
-                         base::TimeTicks start_time,
-                         base::TimeTicks end_time);
-
-  void RecordMainThreadTaskLoad(base::TimeTicks time, double load);
-  void RecordForegroundMainThreadTaskLoad(base::TimeTicks time, double load);
-  void RecordBackgroundMainThreadTaskLoad(base::TimeTicks time, double load);
-
   MainThreadSchedulerHelper helper_;
   IdleHelper idle_helper_;
   IdleCanceledDelayedTaskSweeper idle_canceled_delayed_task_sweeper_;
@@ -560,9 +555,6 @@
     TaskCostEstimator loading_task_cost_estimator;
     TaskCostEstimator timer_task_cost_estimator;
     IdleTimeEstimator idle_time_estimator;
-    ThreadLoadTracker main_thread_load_tracker;
-    ThreadLoadTracker background_main_thread_load_tracker;
-    ThreadLoadTracker foreground_main_thread_load_tracker;
     UseCase current_use_case;
     Policy current_policy;
     base::TimeTicks current_policy_expiration_time;
@@ -601,25 +593,7 @@
     std::set<WebViewSchedulerImpl*> web_view_schedulers;  // Not owned.
     RAILModeObserver* rail_mode_observer;                 // Not owned.
     WakeUpBudgetPool* wake_up_budget_pool;                // Not owned.
-    base::Optional<base::TimeTicks> last_reported_task;
-    TaskDurationMetricReporter task_duration_reporter;
-    TaskDurationMetricReporter foreground_task_duration_reporter;
-    TaskDurationMetricReporter foreground_first_minute_task_duration_reporter;
-    TaskDurationMetricReporter foreground_second_minute_task_duration_reporter;
-    TaskDurationMetricReporter foreground_third_minute_task_duration_reporter;
-    TaskDurationMetricReporter
-        foreground_after_third_minute_task_duration_reporter;
-    TaskDurationMetricReporter background_task_duration_reporter;
-    TaskDurationMetricReporter background_first_minute_task_duration_reporter;
-    TaskDurationMetricReporter background_second_minute_task_duration_reporter;
-    TaskDurationMetricReporter background_third_minute_task_duration_reporter;
-    TaskDurationMetricReporter background_fourth_minute_task_duration_reporter;
-    TaskDurationMetricReporter background_fifth_minute_task_duration_reporter;
-    TaskDurationMetricReporter
-        background_after_fifth_minute_task_duration_reporter;
-    TaskDurationMetricReporter hidden_task_duration_reporter;
-    TaskDurationMetricReporter visible_task_duration_reporter;
-    TaskDurationMetricReporter hidden_music_task_duration_reporter;
+    RendererMetricsHelper metrics_helper;
     RendererProcessType process_type;
   };
 
diff --git a/third_party/WebKit/public/BUILD.gn b/third_party/WebKit/public/BUILD.gn
index 7799699..d675526 100644
--- a/third_party/WebKit/public/BUILD.gn
+++ b/third_party/WebKit/public/BUILD.gn
@@ -82,6 +82,12 @@
     ]
   }
 
+  java_cpp_enum("blink_cursor_type_java_enums_srcjar") {
+    sources = [
+      "./platform/WebCursorInfo.h",
+    ]
+  }
+
   android_library("blink_headers_java") {
     deps = [
       "//third_party/android_tools:android_support_annotations_java",
@@ -474,7 +480,6 @@
     "web/WebColorChooser.h",
     "web/WebColorChooserClient.h",
     "web/WebColorSuggestion.h",
-    "web/WebCompositionUnderline.h",
     "web/WebConsoleMessage.h",
     "web/WebContextFeatures.h",
     "web/WebContextMenuData.h",
@@ -528,6 +533,7 @@
     "web/WebIconURL.h",
     "web/WebImageCache.h",
     "web/WebImageDecoder.h",
+    "web/WebImeTextSpan.h",
     "web/WebInputElement.h",
     "web/WebInputMethodController.h",
     "web/WebKit.h",
diff --git a/third_party/WebKit/public/platform/WebCursorInfo.h b/third_party/WebKit/public/platform/WebCursorInfo.h
index 68eb2ed..d00e276 100644
--- a/third_party/WebKit/public/platform/WebCursorInfo.h
+++ b/third_party/WebKit/public/platform/WebCursorInfo.h
@@ -44,6 +44,9 @@
 class Cursor;
 
 struct WebCursorInfo {
+  // A Java counterpart will be generated for this enum.
+  // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.blink_public.web
+  // GENERATED_JAVA_CLASS_NAME_OVERRIDE: WebCursorInfoType
   enum Type {
     kTypePointer,
     kTypeCross,
diff --git a/third_party/WebKit/public/web/WebFrameOwnerProperties.h b/third_party/WebKit/public/web/WebFrameOwnerProperties.h
index 64e9916..d1d0470f 100644
--- a/third_party/WebKit/public/web/WebFrameOwnerProperties.h
+++ b/third_party/WebKit/public/web/WebFrameOwnerProperties.h
@@ -27,8 +27,6 @@
   WebString required_csp;
 
  public:
-  WebVector<WebFeaturePolicyFeature> allowed_features;
-
   WebFrameOwnerProperties()
       : scrolling_mode(ScrollingMode::kAuto),
         margin_width(-1),
@@ -38,16 +36,14 @@
         is_display_none(false) {}
 
 #if INSIDE_BLINK
-  WebFrameOwnerProperties(
-      const WebString& name,
-      ScrollbarMode scrolling_mode,
-      int margin_width,
-      int margin_height,
-      bool allow_fullscreen,
-      bool allow_payment_request,
-      bool is_display_none,
-      const WebString& required_csp,
-      const WebVector<WebFeaturePolicyFeature>& allowed_features)
+  WebFrameOwnerProperties(const WebString& name,
+                          ScrollbarMode scrolling_mode,
+                          int margin_width,
+                          int margin_height,
+                          bool allow_fullscreen,
+                          bool allow_payment_request,
+                          bool is_display_none,
+                          const WebString& required_csp)
       : name(name),
         scrolling_mode(static_cast<ScrollingMode>(scrolling_mode)),
         margin_width(margin_width),
@@ -55,8 +51,7 @@
         allow_fullscreen(allow_fullscreen),
         allow_payment_request(allow_payment_request),
         is_display_none(is_display_none),
-        required_csp(required_csp),
-        allowed_features(allowed_features) {}
+        required_csp(required_csp) {}
 #endif
 };
 
diff --git a/third_party/WebKit/public/web/WebCompositionUnderline.h b/third_party/WebKit/public/web/WebImeTextSpan.h
similarity index 80%
rename from third_party/WebKit/public/web/WebCompositionUnderline.h
rename to third_party/WebKit/public/web/WebImeTextSpan.h
index 0b7f83e..53b1314 100644
--- a/third_party/WebKit/public/web/WebCompositionUnderline.h
+++ b/third_party/WebKit/public/web/WebImeTextSpan.h
@@ -28,41 +28,37 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef WebCompositionUnderline_h
-#define WebCompositionUnderline_h
+#ifndef WebImeTextSpan_h
+#define WebImeTextSpan_h
 
 #include "public/platform/WebColor.h"
 
 namespace blink {
 
-// Class WebCompositionUnderline is intended to be used with WebWidget's
+// Class WebImeTextSpan is intended to be used with WebWidget's
 // setComposition() method.
-struct WebCompositionUnderline {
-  WebCompositionUnderline()
+struct WebImeTextSpan {
+  WebImeTextSpan()
       : start_offset(0),
         end_offset(0),
         color(0),
         thick(false),
         background_color(0) {}
 
-  WebCompositionUnderline(unsigned s,
-                          unsigned e,
-                          WebColor c,
-                          bool t,
-                          WebColor bc)
+  WebImeTextSpan(unsigned s, unsigned e, WebColor c, bool t, WebColor bc)
       : start_offset(s),
         end_offset(e),
         color(c),
         thick(t),
         background_color(bc) {}
 
-  bool operator<(const WebCompositionUnderline& other) const {
+  bool operator<(const WebImeTextSpan& other) const {
     return start_offset != other.start_offset
                ? start_offset < other.start_offset
                : end_offset < other.end_offset;
   }
 
-  // Need to update IPC_STRUCT_TRAITS_BEGIN(blink::WebCompositionUnderline)
+  // Need to update IPC_STRUCT_TRAITS_BEGIN(blink::WebImeTextSpan)
   // if members change.
   unsigned start_offset;
   unsigned end_offset;
diff --git a/third_party/WebKit/public/web/WebInputMethodController.h b/third_party/WebKit/public/web/WebInputMethodController.h
index d95ee7e..161d47f 100644
--- a/third_party/WebKit/public/web/WebInputMethodController.h
+++ b/third_party/WebKit/public/web/WebInputMethodController.h
@@ -5,9 +5,9 @@
 #ifndef WebInputMethodController_h
 #define WebInputMethodController_h
 
-#include "public/platform/WebTextInputInfo.h"
-#include "WebCompositionUnderline.h"
+#include "WebImeTextSpan.h"
 #include "WebWidget.h"
+#include "public/platform/WebTextInputInfo.h"
 
 namespace blink {
 
@@ -31,19 +31,18 @@
   // text will be canceled. |replacementRange| (when not null) is the range in
   // current text which should be replaced by |text|. Returns true if the
   // composition text was set successfully.
-  virtual bool SetComposition(
-      const WebString& text,
-      const WebVector<WebCompositionUnderline>& underlines,
-      const WebRange& replacement_range,
-      int selection_start,
-      int selection_end) = 0;
+  virtual bool SetComposition(const WebString& text,
+                              const WebVector<WebImeTextSpan>& ime_text_spans,
+                              const WebRange& replacement_range,
+                              int selection_start,
+                              int selection_end) = 0;
 
   // Called to inform the controller to delete the ongoing composition if any,
   // insert |text|, and move the caret according to |relativeCaretPosition|.
   // |replacementRange| (when not null) is the range in current text which
   // should be replaced by |text|.
   virtual bool CommitText(const WebString& text,
-                          const WebVector<WebCompositionUnderline>& underlines,
+                          const WebVector<WebImeTextSpan>& ime_text_spans,
                           const WebRange& replacement_range,
                           int relative_caret_position) = 0;
 
diff --git a/third_party/WebKit/public/web/WebLocalFrame.h b/third_party/WebKit/public/web/WebLocalFrame.h
index b9ef892..d14a18de 100644
--- a/third_party/WebKit/public/web/WebLocalFrame.h
+++ b/third_party/WebKit/public/web/WebLocalFrame.h
@@ -8,10 +8,10 @@
 #include <memory>
 #include <set>
 
-#include "WebCompositionUnderline.h"
 #include "WebFrame.h"
 #include "WebFrameLoadType.h"
 #include "WebHistoryItem.h"
+#include "WebImeTextSpan.h"
 #include "public/platform/WebCachePolicy.h"
 #include "public/platform/WebFocusType.h"
 #include "public/platform/WebSize.h"
@@ -503,7 +503,7 @@
   virtual bool SetCompositionFromExistingText(
       int composition_start,
       int composition_end,
-      const WebVector<WebCompositionUnderline>& underlines) = 0;
+      const WebVector<WebImeTextSpan>& ime_text_spans) = 0;
   virtual void ExtendSelectionAndDelete(int before, int after) = 0;
 
   virtual void SetCaretVisible(bool) = 0;
diff --git a/third_party/WebKit/public/web/WebPlugin.h b/third_party/WebKit/public/web/WebPlugin.h
index ff9fe31..1db7778 100644
--- a/third_party/WebKit/public/web/WebPlugin.h
+++ b/third_party/WebKit/public/web/WebPlugin.h
@@ -47,7 +47,7 @@
 class WebDragData;
 class WebPluginContainer;
 class WebURLResponse;
-struct WebCompositionUnderline;
+struct WebImeTextSpan;
 struct WebCursorInfo;
 struct WebPrintParams;
 struct WebPrintPresetOptions;
@@ -170,12 +170,11 @@
   // Sets composition text from input method, and returns true if the
   // composition is set successfully. If |replacementRange| is not null, the
   // text inside |replacementRange| will be replaced by |text|
-  virtual bool SetComposition(
-      const WebString& text,
-      const WebVector<WebCompositionUnderline>& underlines,
-      const WebRange& replacement_range,
-      int selection_start,
-      int selection_end) {
+  virtual bool SetComposition(const WebString& text,
+                              const WebVector<WebImeTextSpan>& ime_text_spans,
+                              const WebRange& replacement_range,
+                              int selection_start,
+                              int selection_end) {
     return false;
   }
 
@@ -183,7 +182,7 @@
   // moves the caret according to relativeCaretPosition. If |replacementRange|
   // is not null, the text inside |replacementRange| will be replaced by |text|.
   virtual bool CommitText(const WebString& text,
-                          const WebVector<WebCompositionUnderline>& underlines,
+                          const WebVector<WebImeTextSpan>& ime_text_spans,
                           const WebRange& replacement_range,
                           int relative_caret_position) {
     return false;
diff --git a/third_party/WebKit/public/web/WebWidget.h b/third_party/WebKit/public/web/WebWidget.h
index 2a34655..bf139ef3 100644
--- a/third_party/WebKit/public/web/WebWidget.h
+++ b/third_party/WebKit/public/web/WebWidget.h
@@ -41,7 +41,7 @@
 #include "public/platform/WebRect.h"
 #include "public/platform/WebSize.h"
 #include "public/platform/WebTextInputInfo.h"
-#include "public/web/WebCompositionUnderline.h"
+#include "public/web/WebImeTextSpan.h"
 #include "public/web/WebRange.h"
 #include "public/web/WebTextDirection.h"
 
diff --git a/third_party/bazel/desugar/BUILD.gn b/third_party/bazel/desugar/BUILD.gn
new file mode 100644
index 0000000..bff746ab
--- /dev/null
+++ b/third_party/bazel/desugar/BUILD.gn
@@ -0,0 +1,11 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/rules.gni")
+
+# Provides runtime support for desugar transformations.
+java_prebuilt("desugar_runtime_java") {
+  supports_android = true
+  jar_path = "Desugar-runtime.jar"
+}
diff --git a/third_party/bazel/desugar/Desugar-runtime.jar b/third_party/bazel/desugar/Desugar-runtime.jar
new file mode 100644
index 0000000..b04c6b83
--- /dev/null
+++ b/third_party/bazel/desugar/Desugar-runtime.jar
Binary files differ
diff --git a/third_party/bazel/desugar/README.chromium b/third_party/bazel/desugar/README.chromium
index 82432884..368566f 100644
--- a/third_party/bazel/desugar/README.chromium
+++ b/third_party/bazel/desugar/README.chromium
@@ -14,8 +14,10 @@
 such as lambda experssions for Chrome on Android.
 
 Local Modifications:
-Desugar.jar is the "Desugar_deploy.jar" target defined in
-[bazel]src/tools/android/java/com/google/devtools/build/android/desugar/BUILD
+* Desugar.jar is the "Desugar_deploy.jar" target defined in
+  [bazel]src/tools/android/java/com/google/devtools/build/android/desugar/BUILD
+* Desugar-runtime.jar is derived from Desugar.jar (refer to update
+  instructions).
 
 Update instructions (requires @google.com account for uploading):
 - Check out Bazel from https://github.com/bazelbuild/bazel
@@ -30,4 +32,7 @@
 $ download_from_google_storage --config
 - Upload new jar to gcloud. In third_party/bazel/desugar, run
 $ upload_to_google_storage.py -b chromium-android-tools/bazel/desugar Desugar.jar
-
+- Update Desugar-runtime.jar:
+$ unzip Desugar.jar "com/google/devtools/build/android/desugar/runtime*"
+$ zip -rD0 Desugar-runtime.jar com
+$ rm -r com
diff --git a/third_party/gvr-android-sdk/BUILD.gn b/third_party/gvr-android-sdk/BUILD.gn
index 223ba74b..5fac13b4 100644
--- a/third_party/gvr-android-sdk/BUILD.gn
+++ b/third_party/gvr-android-sdk/BUILD.gn
@@ -7,12 +7,14 @@
 android_aar_prebuilt("controller_test_api_java") {
   aar_path = "test-libraries/controller_test_api.aar"
   proguard_configs = [ "test-libraries/proguard.txt" ]
+
+  # Jar includes conflicting copies of Desugar-runtime.jar classes.
+  jar_excluded_patterns = [ "*ThrowableExtension*.class" ]
 }
 
 android_aar_prebuilt("gvr_common_java") {
   aar_path = "common_library.aar"
   proguard_configs = [ "proguard-gvr-chromium.txt" ]
-  ignore_manifest = true  # Ignored because manifest merging is not supported (http://crbug.com/643967)
   ignore_native_libraries = true
 
   # Ignore unused auto generated classes. Proguard will not strip them automatically because they
diff --git a/third_party/gvr-android-sdk/test-apks/daydream_home/apk_version_history.txt b/third_party/gvr-android-sdk/test-apks/daydream_home/apk_version_history.txt
index 9200f48..f70d4aa 100644
--- a/third_party/gvr-android-sdk/test-apks/daydream_home/apk_version_history.txt
+++ b/third_party/gvr-android-sdk/test-apks/daydream_home/apk_version_history.txt
@@ -7,3 +7,4 @@
 v1.5 a02e2f95aa6f741f2be0ae03a4829e21fd749cf3
 v1.6 43b876df3398687dfa1ae059ef2f64009c76254e
 v1.7 d5c72438acffe723e7717c45deedd8431bc613e7
+v1.8 cbc81aa4db5986f25d2c967f9b1e247cf07cd75e
diff --git a/third_party/gvr-android-sdk/test-apks/daydream_home/daydream_home_current.apk.sha1 b/third_party/gvr-android-sdk/test-apks/daydream_home/daydream_home_current.apk.sha1
index 31836cd7..11fa641 100644
--- a/third_party/gvr-android-sdk/test-apks/daydream_home/daydream_home_current.apk.sha1
+++ b/third_party/gvr-android-sdk/test-apks/daydream_home/daydream_home_current.apk.sha1
@@ -1 +1 @@
-d5c72438acffe723e7717c45deedd8431bc613e7
\ No newline at end of file
+cbc81aa4db5986f25d2c967f9b1e247cf07cd75e
\ No newline at end of file
diff --git a/third_party/gvr-android-sdk/test-apks/vr_services/apk_version_history.txt b/third_party/gvr-android-sdk/test-apks/vr_services/apk_version_history.txt
index 4831ae6..2b7c0f5c 100644
--- a/third_party/gvr-android-sdk/test-apks/vr_services/apk_version_history.txt
+++ b/third_party/gvr-android-sdk/test-apks/vr_services/apk_version_history.txt
@@ -10,3 +10,4 @@
 v1.5 5d6d55728c7c728cef5416f37b0b71615719474e
 v1.6 abcdae2281956a76aa3b98d2e8f05a1975170dd0
 v1.7 fcfa178173a2c0cab9c7d51829c2ee76ab66e1d9
+v1.8 f8f45ebf1963c5f9862218baca120ea974b87a08
diff --git a/third_party/gvr-android-sdk/test-apks/vr_services/vr_services_current.apk.sha1 b/third_party/gvr-android-sdk/test-apks/vr_services/vr_services_current.apk.sha1
index fb68207..c4102cfa 100644
--- a/third_party/gvr-android-sdk/test-apks/vr_services/vr_services_current.apk.sha1
+++ b/third_party/gvr-android-sdk/test-apks/vr_services/vr_services_current.apk.sha1
@@ -1 +1 @@
-fcfa178173a2c0cab9c7d51829c2ee76ab66e1d9
\ No newline at end of file
+f8f45ebf1963c5f9862218baca120ea974b87a08
\ No newline at end of file
diff --git a/third_party/libxml/README.chromium b/third_party/libxml/README.chromium
index 2622116c..db88d143 100644
--- a/third_party/libxml/README.chromium
+++ b/third_party/libxml/README.chromium
@@ -1,6 +1,6 @@
 Name: libxml
 URL: http://xmlsoft.org
-Version: 3939178e4cb797417ff033b1e04ab4b038e224d9
+Version: 27f310d453b7e2e71847e5910a0961753aacdbd1
 License: MIT
 License File: src/Copyright
 Security Critical: yes
diff --git a/third_party/libxml/src/ChangeLog b/third_party/libxml/src/ChangeLog
index ef6cb8e..896fbbb 100644
--- a/third_party/libxml/src/ChangeLog
+++ b/third_party/libxml/src/ChangeLog
@@ -1929,7 +1929,7 @@
 
 	* tree.c: Fixed xmlGetNodePath() to generate the node test "*"
 	  for elements in the default namespace, rather than generating
-	  an unprefixed named node test and loosing the namespace
+	  an unprefixed named node test and losing the namespace
 	  information.
 
 Fri Jun  9 21:45:02 CEST 2006 Kasimier Buchcik <libxml2-cvs@cazic.net>
@@ -2305,7 +2305,7 @@
 	* tree.c: Simplified usage of the internal xmlNsMap. Added a
 	  "strict" lookup for namespaces based on a prefix. Fixed a
 	  namespace processing issue in the clone-node function, which
-	  occured if a @ctxt argument was given.
+	  occurred if a @ctxt argument was given.
 	  
 Fri Mar  3 17:44:10 CET 2006 Rob Richards <rrichards@ctindustries.net>
 
@@ -3951,7 +3951,7 @@
 	* README: updated 
 	* debugXML.c: fix a bug raised by bill on IRC
 	* relaxng.c: fix a leak in weird circumstances
-	* runsuite.c Makefile.am: standalone test tool agaisnt
+	* runsuite.c Makefile.am: standalone test tool against
 	  the regression suites, work in progress
 
 Tue Jun 28 08:30:26 CEST 2005 Daniel Veillard <daniel@veillard.com>
@@ -4356,7 +4356,7 @@
 	* xmlschemas.c: Added substitution group constraints; changed
 	  the build of the pre-computed substitution groups. Channeled
 	  errors during xsi assembling of schemas to the validation
-	  context. Fixed a big memory leak, which occured when using
+	  context. Fixed a big memory leak, which occurred when using
 	  IDCs: the precomputed value of attributes was not freed if
 	  the attribute did not resolve to an IDC field (discovered
 	  with the help of Randy J. Ray's schema, posted to the
@@ -4551,7 +4551,7 @@
 
 Mon Mar 21 21:09:07 CET 2005 Kasimier Buchcik <libxml2-cvs@cazic.net>
 
-	* xmlschemas.c: Fixed a segfault, which occured during bubbling
+	* xmlschemas.c: Fixed a segfault, which occurred during bubbling
 	  of IDC nodes (bug #170779 and #170778, reported by GUY Fabrice):
 	  a variable was missed to be reset in a loop. Deactivated bubbling,
 	  if not referenced by a keyref.
@@ -11220,7 +11220,7 @@
 	* test/xsdtest/xsdtest.xml uri.c: after and exchange with James
 	  Clark it appeared I had bug in URI parsing code ...
 	* relaxng.c include/libxml/relaxng.h: completely revamped error
-	  reporting to not loose message from optional parts.
+	  reporting to not lose message from optional parts.
 	* xmllint.c: added timing for RNG validation steps
 	* result/relaxng/*: updated the result, all error messages changed
 
@@ -13182,7 +13182,7 @@
 	  xmlNewCharEncodingHandler as requested in #89415
 	* python/generator.py python/setup.py.in: applied cleanup
 	  patches from Marc-Andre Lemburg
-	* tree.c: fixing bug #89332 on a specific case of loosing 
+	* tree.c: fixing bug #89332 on a specific case of losing 
 	  the XML-1.0 namespace on xml:xxx attributes
 
 Wed Jul 31 23:27:42 2002  Aleksey Sanin  <aleksey@aleksey.com>
@@ -15356,7 +15356,7 @@
 
 Sat Oct  6 15:07:14 CEST 2001 Daniel Veillard <daniel@veillard.com>
 
-	* xpath.c: fixing #61673 part I, do not loose doc information
+	* xpath.c: fixing #61673 part I, do not lose doc information
 	  when copying result value trees.
 
 Sat Oct  6 11:58:58 CEST 2001 Daniel Veillard <daniel@veillard.com>
@@ -15970,7 +15970,7 @@
 Mon Jul  9 22:06:53 CEST 2001 Daniel Veillard <Daniel.Veillard@imag.fr>
 
 	* valid.c: fixed "Internal: MIXED struct bad" when #CDATA elements
-	  validation occured on content with element child
+	  validation occurred on content with element child
 
 Mon Jul  9 17:59:08 CEST 2001 Daniel Veillard <Daniel.Veillard@imag.fr>
 
diff --git a/third_party/libxml/src/HTMLparser.c b/third_party/libxml/src/HTMLparser.c
index 22ec576..e4f816e 100644
--- a/third_party/libxml/src/HTMLparser.c
+++ b/third_party/libxml/src/HTMLparser.c
@@ -6278,7 +6278,8 @@
  */
 
 htmlDocPtr
-htmlSAXParseDoc(xmlChar *cur, const char *encoding, htmlSAXHandlerPtr sax, void *userData) {
+htmlSAXParseDoc(const xmlChar *cur, const char *encoding,
+                htmlSAXHandlerPtr sax, void *userData) {
     htmlDocPtr ret;
     htmlParserCtxtPtr ctxt;
 
@@ -6317,7 +6318,7 @@
  */
 
 htmlDocPtr
-htmlParseDoc(xmlChar *cur, const char *encoding) {
+htmlParseDoc(const xmlChar *cur, const char *encoding) {
     return(htmlSAXParseDoc(cur, encoding, NULL, NULL));
 }
 
diff --git a/third_party/libxml/src/Makefile.am b/third_party/libxml/src/Makefile.am
index 51b253e..efc92121 100644
--- a/third_party/libxml/src/Makefile.am
+++ b/third_party/libxml/src/Makefile.am
@@ -10,10 +10,10 @@
 
 AM_CFLAGS = $(THREAD_CFLAGS) $(Z_CFLAGS) $(LZMA_CFLAGS)
 
-noinst_PROGRAMS=testSchemas testRelax testSAX testHTML testXPath testURI \
-                testThreads testC14N testAutomata testRegexp \
-                testReader testapi testModule runtest runsuite testchar \
-		testdict runxmlconf testrecurse testlimits
+check_PROGRAMS=testSchemas testRelax testSAX testHTML testXPath testURI \
+               testThreads testC14N testAutomata testRegexp \
+               testReader testapi testModule runtest runsuite testchar \
+	       testdict runxmlconf testrecurse testlimits
 
 bin_PROGRAMS = xmllint xmlcatalog
 
@@ -202,7 +202,8 @@
 #testOOM_DEPENDENCIES = $(DEPS)
 #testOOM_LDADD= $(LDADDS)
 
-runtests:
+runtests: runtest$(EXEEXT) testrecurse$(EXEEXT) testapi$(EXEEXT) \
+          testchar$(EXEEXT) testdict$(EXEEXT) runxmlconf$(EXEEXT)
 	[ -d test   ] || $(LN_S) $(srcdir)/test   .
 	[ -d result ] || $(LN_S) $(srcdir)/result .
 	$(CHECKER) ./runtest$(EXEEXT) && \
@@ -843,6 +844,21 @@
 	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
+	@echo "## SAX2 callbacks regression tests with entity substitution"
+	-@(for i in $(srcdir)/test/* ; do \
+	  name=`basename $$i`; \
+	  if [ ! -d $$i ] ; then \
+	  if [ ! -f $(srcdir)/result/noent/$$name.sax2 ] ; then \
+	      echo New test file $$name ; \
+	      $(CHECKER) $(top_builddir)/testSAX --sax2 --noent $$i > $(srcdir)/result/noent/$$name.sax2 2> /dev/null ; \
+	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
+	  else \
+	      log=`$(CHECKER) $(top_builddir)/testSAX --sax2 --noent $$i > result.$$name 2> /dev/null ; \
+	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
+	      diff $(srcdir)/result/noent/$$name.sax2 result.$$name` ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
+	      rm result.$$name ; \
+	  fi ; fi ; done)
 
 Validtests : xmllint$(EXEEXT)
 	@(echo > .memdump)
diff --git a/third_party/libxml/src/Makefile.in b/third_party/libxml/src/Makefile.in
index b9e3056..d47a2cc2 100644
--- a/third_party/libxml/src/Makefile.in
+++ b/third_party/libxml/src/Makefile.in
@@ -91,7 +91,7 @@
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-noinst_PROGRAMS = testSchemas$(EXEEXT) testRelax$(EXEEXT) \
+check_PROGRAMS = testSchemas$(EXEEXT) testRelax$(EXEEXT) \
 	testSAX$(EXEEXT) testHTML$(EXEEXT) testXPath$(EXEEXT) \
 	testURI$(EXEEXT) testThreads$(EXEEXT) testC14N$(EXEEXT) \
 	testAutomata$(EXEEXT) testRegexp$(EXEEXT) testReader$(EXEEXT) \
@@ -189,7 +189,7 @@
 testdso_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
 	$(testdso_la_LDFLAGS) $(LDFLAGS) -o $@
-PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
+PROGRAMS = $(bin_PROGRAMS)
 am_runsuite_OBJECTS = runsuite.$(OBJEXT)
 runsuite_OBJECTS = $(am_runsuite_OBJECTS)
 am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) $(top_builddir)/libxml2.la \
@@ -1020,8 +1020,8 @@
 	echo " rm -f" $$list; \
 	rm -f $$list
 
-clean-noinstPROGRAMS:
-	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
 	echo " rm -f" $$list; \
 	rm -f $$list || exit $$?; \
 	test -n "$(EXEEXT)" || exit 0; \
@@ -1728,6 +1728,7 @@
 	       $(distcleancheck_listfiles) ; \
 	       exit 1; } >&2
 check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
 check: $(BUILT_SOURCES)
 	$(MAKE) $(AM_MAKEFLAGS) check-recursive
 all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(MANS) $(DATA) \
@@ -1775,8 +1776,8 @@
 	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
 clean: clean-recursive
 
-clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
-	clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \
+clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
+	clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \
 	mostlyclean-am
 
 distclean: distclean-recursive
@@ -1855,14 +1856,14 @@
 
 uninstall-man: uninstall-man1 uninstall-man3
 
-.MAKE: $(am__recursive_targets) all check install install-am \
+.MAKE: $(am__recursive_targets) all check check-am install install-am \
 	install-strip
 
 .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
 	am--refresh check check-am clean clean-binPROGRAMS \
-	clean-cscope clean-generic clean-libLTLIBRARIES clean-libtool \
-	clean-noinstLTLIBRARIES clean-noinstPROGRAMS cscope \
-	cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
+	clean-checkPROGRAMS clean-cscope clean-generic \
+	clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \
+	cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
 	dist-gzip dist-hook dist-lzip dist-shar dist-tarZ dist-xz \
 	dist-zip distcheck distclean distclean-compile \
 	distclean-generic distclean-hdr distclean-libtool \
@@ -1904,7 +1905,8 @@
 #testOOM_DEPENDENCIES = $(DEPS)
 #testOOM_LDADD= $(LDADDS)
 
-runtests:
+runtests: runtest$(EXEEXT) testrecurse$(EXEEXT) testapi$(EXEEXT) \
+          testchar$(EXEEXT) testdict$(EXEEXT) runxmlconf$(EXEEXT)
 	[ -d test   ] || $(LN_S) $(srcdir)/test   .
 	[ -d result ] || $(LN_S) $(srcdir)/result .
 	$(CHECKER) ./runtest$(EXEEXT) && \
@@ -2545,6 +2547,21 @@
 	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
+	@echo "## SAX2 callbacks regression tests with entity substitution"
+	-@(for i in $(srcdir)/test/* ; do \
+	  name=`basename $$i`; \
+	  if [ ! -d $$i ] ; then \
+	  if [ ! -f $(srcdir)/result/noent/$$name.sax2 ] ; then \
+	      echo New test file $$name ; \
+	      $(CHECKER) $(top_builddir)/testSAX --sax2 --noent $$i > $(srcdir)/result/noent/$$name.sax2 2> /dev/null ; \
+	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
+	  else \
+	      log=`$(CHECKER) $(top_builddir)/testSAX --sax2 --noent $$i > result.$$name 2> /dev/null ; \
+	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
+	      diff $(srcdir)/result/noent/$$name.sax2 result.$$name` ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
+	      rm result.$$name ; \
+	  fi ; fi ; done)
 
 Validtests : xmllint$(EXEEXT)
 	@(echo > .memdump)
diff --git a/third_party/libxml/src/SAX2.c b/third_party/libxml/src/SAX2.c
index 0f0ad2a..af2dd14 100644
--- a/third_party/libxml/src/SAX2.c
+++ b/third_party/libxml/src/SAX2.c
@@ -2311,7 +2311,7 @@
 	} else {
             /*
              * any out of memory error would already have been raised
-             * but we can't be garanteed it's the actual error due to the
+             * but we can't be guaranteed it's the actual error due to the
              * API, best is to skip in this case
              */
 	    continue;
diff --git a/third_party/libxml/src/buf.c b/third_party/libxml/src/buf.c
index 3b7601855..21cb9d8 100644
--- a/third_party/libxml/src/buf.c
+++ b/third_party/libxml/src/buf.c
@@ -49,7 +49,7 @@
     size_t use;		        /* The buffer size used */
     size_t size;		/* The buffer size */
     xmlBufferPtr buffer;        /* wrapper for an old buffer */
-    int error;                  /* an error code if a failure occured */
+    int error;                  /* an error code if a failure occurred */
 };
 
 #ifdef WITH_BUFFER_COMPAT
@@ -701,7 +701,7 @@
  * used in the buffer. It does not account for the terminating zero
  * usually needed
  *
- * Returns the amount or 0 if none or an error occured
+ * Returns the amount or 0 if none or an error occurred
  */
 
 size_t
diff --git a/third_party/libxml/src/dict.c b/third_party/libxml/src/dict.c
index c0585fe..7b005eb 100644
--- a/third_party/libxml/src/dict.c
+++ b/third_party/libxml/src/dict.c
@@ -533,7 +533,7 @@
  *
  * Create a new dictionary
  *
- * Returns the newly created dictionary, or NULL if an error occured.
+ * Returns the newly created dictionary, or NULL if an error occurred.
  */
 xmlDictPtr
 xmlDictCreate(void) {
@@ -580,7 +580,7 @@
  * new dictionary, then in @sub, and if not found are created in the
  * new dictionary.
  *
- * Returns the newly created dictionary, or NULL if an error occured.
+ * Returns the newly created dictionary, or NULL if an error occurred.
  */
 xmlDictPtr
 xmlDictCreateSub(xmlDictPtr sub) {
@@ -699,7 +699,7 @@
 	    } else {
 	        /*
 		 * we don't have much ways to alert from herei
-		 * result is loosing an entry and unicity garantee
+		 * result is losing an entry and unicity guarantee
 		 */
 	        ret = -1;
 	    }
diff --git a/third_party/libxml/src/encoding.c b/third_party/libxml/src/encoding.c
index e49c7f898..cd019c5 100644
--- a/third_party/libxml/src/encoding.c
+++ b/third_party/libxml/src/encoding.c
@@ -354,8 +354,14 @@
 {
     int len;
 
-    if ((out == NULL) || (inb == NULL) || (outlen == NULL) || (inlenb == NULL))
+    if ((out == NULL) || (outlen == NULL) || (inlenb == NULL))
 	return(-1);
+    if (inb == NULL) {
+        /* inb == NULL means output is initialized. */
+        *outlen = 0;
+        *inlenb = 0;
+        return(0);
+    }
     if (*outlen > *inlenb) {
 	len = *inlenb;
     } else {
@@ -1904,6 +1910,61 @@
  *									*
  ************************************************************************/
 
+static int
+xmlEncInputChunk(xmlCharEncodingHandler *handler, unsigned char *out,
+                 int *outlen, const unsigned char *in, int *inlen) {
+    int ret;
+
+    if (handler->input != NULL) {
+        ret = handler->input(out, outlen, in, inlen);
+    }
+#ifdef LIBXML_ICONV_ENABLED
+    else if (handler->iconv_in != NULL) {
+        ret = xmlIconvWrapper(handler->iconv_in, out, outlen, in, inlen);
+    }
+#endif /* LIBXML_ICONV_ENABLED */
+#ifdef LIBXML_ICU_ENABLED
+    else if (handler->uconv_in != NULL) {
+        ret = xmlUconvWrapper(handler->uconv_in, 1, out, outlen, in, inlen);
+    }
+#endif /* LIBXML_ICU_ENABLED */
+    else {
+        *outlen = 0;
+        *inlen = 0;
+        ret = -2;
+    }
+
+    return(ret);
+}
+
+/* Returns -4 if no output function was found. */
+static int
+xmlEncOutputChunk(xmlCharEncodingHandler *handler, unsigned char *out,
+                  int *outlen, const unsigned char *in, int *inlen) {
+    int ret;
+
+    if (handler->output != NULL) {
+        ret = handler->output(out, outlen, in, inlen);
+    }
+#ifdef LIBXML_ICONV_ENABLED
+    else if (handler->iconv_out != NULL) {
+        ret = xmlIconvWrapper(handler->iconv_out, out, outlen, in, inlen);
+    }
+#endif /* LIBXML_ICONV_ENABLED */
+#ifdef LIBXML_ICU_ENABLED
+    else if (handler->uconv_out != NULL) {
+        ret = xmlUconvWrapper(handler->uconv_out, 0, out, outlen, in, inlen);
+    }
+#endif /* LIBXML_ICU_ENABLED */
+    else {
+        *outlen = 0;
+        *inlen = 0;
+        ret = -4;
+    }
+
+    return(ret);
+}
+
 /**
  * xmlCharEncFirstLineInt:
  * @handler:	char enconding transformation data structure
@@ -1922,7 +1983,7 @@
 int
 xmlCharEncFirstLineInt(xmlCharEncodingHandler *handler, xmlBufferPtr out,
                        xmlBufferPtr in, int len) {
-    int ret = -2;
+    int ret;
     int written;
     int toconv;
 
@@ -1953,33 +2014,13 @@
 	written = out->size - out->use - 1;
     }
 
-    if (handler->input != NULL) {
-	ret = handler->input(&out->content[out->use], &written,
-	                     in->content, &toconv);
-	xmlBufferShrink(in, toconv);
-	out->use += written;
-	out->content[out->use] = 0;
-    }
-#ifdef LIBXML_ICONV_ENABLED
-    else if (handler->iconv_in != NULL) {
-	ret = xmlIconvWrapper(handler->iconv_in, &out->content[out->use],
-	                      &written, in->content, &toconv);
-	xmlBufferShrink(in, toconv);
-	out->use += written;
-	out->content[out->use] = 0;
-	if (ret == -1) ret = -3;
-    }
-#endif /* LIBXML_ICONV_ENABLED */
-#ifdef LIBXML_ICU_ENABLED
-    else if (handler->uconv_in != NULL) {
-	ret = xmlUconvWrapper(handler->uconv_in, 1, &out->content[out->use],
-	                      &written, in->content, &toconv);
-	xmlBufferShrink(in, toconv);
-	out->use += written;
-	out->content[out->use] = 0;
-	if (ret == -1) ret = -3;
-    }
-#endif /* LIBXML_ICU_ENABLED */
+    ret = xmlEncInputChunk(handler, &out->content[out->use], &written,
+                           in->content, &toconv);
+    xmlBufferShrink(in, toconv);
+    out->use += written;
+    out->content[out->use] = 0;
+    if (ret == -1) ret = -3;
+
 #ifdef DEBUG_ENCODING
     switch (ret) {
         case 0:
@@ -2049,7 +2090,7 @@
 int
 xmlCharEncFirstLineInput(xmlParserInputBufferPtr input, int len)
 {
-    int ret = -2;
+    int ret;
     size_t written;
     size_t toconv;
     int c_in;
@@ -2091,32 +2132,13 @@
 
     c_in = toconv;
     c_out = written;
-    if (input->encoder->input != NULL) {
-        ret = input->encoder->input(xmlBufEnd(out), &c_out,
-                                    xmlBufContent(in), &c_in);
-        xmlBufShrink(in, c_in);
-        xmlBufAddLen(out, c_out);
-    }
-#ifdef LIBXML_ICONV_ENABLED
-    else if (input->encoder->iconv_in != NULL) {
-        ret = xmlIconvWrapper(input->encoder->iconv_in, xmlBufEnd(out),
-                              &c_out, xmlBufContent(in), &c_in);
-        xmlBufShrink(in, c_in);
-        xmlBufAddLen(out, c_out);
-        if (ret == -1)
-            ret = -3;
-    }
-#endif /* LIBXML_ICONV_ENABLED */
-#ifdef LIBXML_ICU_ENABLED
-    else if (input->encoder->uconv_in != NULL) {
-        ret = xmlUconvWrapper(input->encoder->uconv_in, 1, xmlBufEnd(out),
-                              &c_out, xmlBufContent(in), &c_in);
-        xmlBufShrink(in, c_in);
-        xmlBufAddLen(out, c_out);
-        if (ret == -1)
-            ret = -3;
-    }
-#endif /* LIBXML_ICU_ENABLED */
+    ret = xmlEncInputChunk(input->encoder, xmlBufEnd(out), &c_out,
+                           xmlBufContent(in), &c_in);
+    xmlBufShrink(in, c_in);
+    xmlBufAddLen(out, c_out);
+    if (ret == -1)
+        ret = -3;
+
     switch (ret) {
         case 0:
 #ifdef DEBUG_ENCODING
@@ -2175,7 +2197,7 @@
 int
 xmlCharEncInput(xmlParserInputBufferPtr input, int flush)
 {
-    int ret = -2;
+    int ret;
     size_t written;
     size_t toconv;
     int c_in;
@@ -2208,32 +2230,13 @@
 
     c_in = toconv;
     c_out = written;
-    if (input->encoder->input != NULL) {
-        ret = input->encoder->input(xmlBufEnd(out), &c_out,
-                                    xmlBufContent(in), &c_in);
-        xmlBufShrink(in, c_in);
-        xmlBufAddLen(out, c_out);
-    }
-#ifdef LIBXML_ICONV_ENABLED
-    else if (input->encoder->iconv_in != NULL) {
-        ret = xmlIconvWrapper(input->encoder->iconv_in, xmlBufEnd(out),
-                              &c_out, xmlBufContent(in), &c_in);
-        xmlBufShrink(in, c_in);
-        xmlBufAddLen(out, c_out);
-        if (ret == -1)
-            ret = -3;
-    }
-#endif /* LIBXML_ICONV_ENABLED */
-#ifdef LIBXML_ICU_ENABLED
-    else if (input->encoder->uconv_in != NULL) {
-        ret = xmlUconvWrapper(input->encoder->uconv_in, 1, xmlBufEnd(out),
-                              &c_out, xmlBufContent(in), &c_in);
-        xmlBufShrink(in, c_in);
-        xmlBufAddLen(out, c_out);
-        if (ret == -1)
-            ret = -3;
-    }
-#endif /* LIBXML_ICU_ENABLED */
+    ret = xmlEncInputChunk(input->encoder, xmlBufEnd(out), &c_out,
+                           xmlBufContent(in), &c_in);
+    xmlBufShrink(in, c_in);
+    xmlBufAddLen(out, c_out);
+    if (ret == -1)
+        ret = -3;
+
     switch (ret) {
         case 0:
 #ifdef DEBUG_ENCODING
@@ -2294,7 +2297,7 @@
 xmlCharEncInFunc(xmlCharEncodingHandler * handler, xmlBufferPtr out,
                  xmlBufferPtr in)
 {
-    int ret = -2;
+    int ret;
     int written;
     int toconv;
 
@@ -2313,35 +2316,14 @@
         xmlBufferGrow(out, out->size + toconv * 2);
         written = out->size - out->use - 1;
     }
-    if (handler->input != NULL) {
-        ret = handler->input(&out->content[out->use], &written,
-                             in->content, &toconv);
-        xmlBufferShrink(in, toconv);
-        out->use += written;
-        out->content[out->use] = 0;
-    }
-#ifdef LIBXML_ICONV_ENABLED
-    else if (handler->iconv_in != NULL) {
-        ret = xmlIconvWrapper(handler->iconv_in, &out->content[out->use],
-                              &written, in->content, &toconv);
-        xmlBufferShrink(in, toconv);
-        out->use += written;
-        out->content[out->use] = 0;
-        if (ret == -1)
-            ret = -3;
-    }
-#endif /* LIBXML_ICONV_ENABLED */
-#ifdef LIBXML_ICU_ENABLED
-    else if (handler->uconv_in != NULL) {
-        ret = xmlUconvWrapper(handler->uconv_in, 1, &out->content[out->use],
-                              &written, in->content, &toconv);
-        xmlBufferShrink(in, toconv);
-        out->use += written;
-        out->content[out->use] = 0;
-        if (ret == -1)
-            ret = -3;
-    }
-#endif /* LIBXML_ICU_ENABLED */
+    ret = xmlEncInputChunk(handler, &out->content[out->use], &written,
+                           in->content, &toconv);
+    xmlBufferShrink(in, toconv);
+    out->use += written;
+    out->content[out->use] = 0;
+    if (ret == -1)
+        ret = -3;
+
     switch (ret) {
         case 0:
 #ifdef DEBUG_ENCODING
@@ -2405,7 +2387,7 @@
 int
 xmlCharEncOutput(xmlOutputBufferPtr output, int init)
 {
-    int ret = -2;
+    int ret;
     size_t written;
     size_t writtentot = 0;
     size_t toconv;
@@ -2413,7 +2395,6 @@
     int c_out;
     xmlBufPtr in;
     xmlBufPtr out;
-    int charref_len = 0;
 
     if ((output == NULL) || (output->encoder == NULL) ||
         (output->buffer == NULL) || (output->conv == NULL))
@@ -2433,26 +2414,10 @@
     if (init) {
         c_in = 0;
         c_out = written;
-        if (output->encoder->output != NULL) {
-            ret = output->encoder->output(xmlBufEnd(out), &c_out,
-                                          NULL, &c_in);
-            if (ret > 0) /* Gennady: check return value */
-                xmlBufAddLen(out, c_out);
-        }
-#ifdef LIBXML_ICONV_ENABLED
-        else if (output->encoder->iconv_out != NULL) {
-            ret = xmlIconvWrapper(output->encoder->iconv_out, xmlBufEnd(out),
-                                  &c_out, NULL, &c_in);
-            xmlBufAddLen(out, c_out);
-        }
-#endif /* LIBXML_ICONV_ENABLED */
-#ifdef LIBXML_ICU_ENABLED
-        else if (output->encoder->uconv_out != NULL) {
-            ret = xmlUconvWrapper(output->encoder->uconv_out, 0, xmlBufEnd(out),
-                                  &c_out, NULL, &c_in);
-            xmlBufAddLen(out, c_out);
-        }
-#endif /* LIBXML_ICU_ENABLED */
+        /* TODO: Check return value. */
+        xmlEncOutputChunk(output->encoder, xmlBufEnd(out), &c_out,
+                          NULL, &c_in);
+        xmlBufAddLen(out, c_out);
 #ifdef DEBUG_ENCODING
 	xmlGenericError(xmlGenericErrorContext,
 		"initialized encoder\n");
@@ -2477,57 +2442,17 @@
 
     c_in = toconv;
     c_out = written;
-    if (output->encoder->output != NULL) {
-        ret = output->encoder->output(xmlBufEnd(out), &c_out,
-                                      xmlBufContent(in), &c_in);
+    ret = xmlEncOutputChunk(output->encoder, xmlBufEnd(out), &c_out,
+                            xmlBufContent(in), &c_in);
+    xmlBufShrink(in, c_in);
+    xmlBufAddLen(out, c_out);
+    writtentot += c_out;
+    if (ret == -1) {
         if (c_out > 0) {
-            xmlBufShrink(in, c_in);
-            xmlBufAddLen(out, c_out);
-            writtentot += c_out;
+            /* Can be a limitation of iconv or uconv */
+            goto retry;
         }
-    }
-#ifdef LIBXML_ICONV_ENABLED
-    else if (output->encoder->iconv_out != NULL) {
-        ret = xmlIconvWrapper(output->encoder->iconv_out, xmlBufEnd(out),
-                              &c_out, xmlBufContent(in), &c_in);
-        xmlBufShrink(in, c_in);
-        xmlBufAddLen(out, c_out);
-        writtentot += c_out;
-        if (ret == -1) {
-            if (c_out > 0) {
-                /*
-                 * Can be a limitation of iconv
-                 */
-                charref_len = 0;
-                goto retry;
-            }
-            ret = -3;
-        }
-    }
-#endif /* LIBXML_ICONV_ENABLED */
-#ifdef LIBXML_ICU_ENABLED
-    else if (output->encoder->uconv_out != NULL) {
-        ret = xmlUconvWrapper(output->encoder->uconv_out, 0, xmlBufEnd(out),
-                              &c_out, xmlBufContent(in), &c_in);
-        xmlBufShrink(in, c_in);
-        xmlBufAddLen(out, c_out);
-        writtentot += c_out;
-        if (ret == -1) {
-            if (c_out > 0) {
-                /*
-                 * Can be a limitation of uconv
-                 */
-                charref_len = 0;
-                goto retry;
-            }
-            ret = -3;
-        }
-    }
-#endif /* LIBXML_ICU_ENABLED */
-    else {
-        xmlEncodingErr(XML_I18N_NO_OUTPUT,
-                       "xmlCharEncOutFunc: no output function !\n", NULL);
-        return(-1);
+        ret = -3;
     }
 
     if (ret >= 0) output += ret;
@@ -2555,47 +2480,44 @@
 	            c_in, c_out, (int) xmlBufUse(in));
 #endif
 	    break;
+        case -4:
+            xmlEncodingErr(XML_I18N_NO_OUTPUT,
+                           "xmlCharEncOutFunc: no output function !\n", NULL);
+            ret = -1;
+            break;
         case -2: {
+	    xmlChar charref[20];
 	    int len = (int) xmlBufUse(in);
             xmlChar *content = xmlBufContent(in);
-	    int cur;
+	    int cur, charrefLen;
 
 	    cur = xmlGetUTF8Char(content, &len);
-	    if ((charref_len != 0) && (c_out < charref_len)) {
-		/*
-		 * We attempted to insert a character reference and failed.
-		 * Undo what was written and skip the remaining charref.
-		 */
-                xmlBufErase(out, c_out);
-		writtentot -= c_out;
-		xmlBufShrink(in, charref_len - c_out);
-		charref_len = 0;
-
-		ret = -1;
+	    if (cur <= 0)
                 break;
-	    } else if (cur > 0) {
-		xmlChar charref[20];
 
 #ifdef DEBUG_ENCODING
-		xmlGenericError(xmlGenericErrorContext,
-			"handling output conversion error\n");
-		xmlGenericError(xmlGenericErrorContext,
-			"Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n",
-			content[0], content[1],
-			content[2], content[3]);
+            xmlGenericError(xmlGenericErrorContext,
+                    "handling output conversion error\n");
+            xmlGenericError(xmlGenericErrorContext,
+                    "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n",
+                    content[0], content[1],
+                    content[2], content[3]);
 #endif
-		/*
-		 * Removes the UTF8 sequence, and replace it by a charref
-		 * and continue the transcoding phase, hoping the error
-		 * did not mangle the encoder state.
-		 */
-		charref_len = snprintf((char *) &charref[0], sizeof(charref),
-				 "&#%d;", cur);
-		xmlBufShrink(in, len);
-		xmlBufAddHead(in, charref, -1);
+            /*
+             * Removes the UTF8 sequence, and replace it by a charref
+             * and continue the transcoding phase, hoping the error
+             * did not mangle the encoder state.
+             */
+            charrefLen = snprintf((char *) &charref[0], sizeof(charref),
+                             "&#%d;", cur);
+            xmlBufShrink(in, len);
+            xmlBufGrow(out, charrefLen * 4);
+            c_out = xmlBufAvail(out) - 1;
+            c_in = charrefLen;
+            ret = xmlEncOutputChunk(output->encoder, xmlBufEnd(out), &c_out,
+                                    charref, &c_in);
 
-		goto retry;
-	    } else {
+	    if ((ret < 0) || (c_in != charrefLen)) {
 		char buf[50];
 
 		snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X",
@@ -2607,8 +2529,12 @@
 			       buf);
 		if (xmlBufGetAllocationScheme(in) != XML_BUFFER_ALLOC_IMMUTABLE)
 		    content[0] = ' ';
+                break;
 	    }
-	    break;
+
+            xmlBufAddLen(out, c_out);
+            writtentot += c_out;
+            goto retry;
 	}
     }
     return(ret);
@@ -2636,12 +2562,11 @@
 int
 xmlCharEncOutFunc(xmlCharEncodingHandler *handler, xmlBufferPtr out,
                   xmlBufferPtr in) {
-    int ret = -2;
+    int ret;
     int written;
     int writtentot = 0;
     int toconv;
     int output = 0;
-    int charref_len = 0;
 
     if (handler == NULL) return(-1);
     if (out == NULL) return(-1);
@@ -2658,31 +2583,11 @@
      */
     if (in == NULL) {
         toconv = 0;
-	if (handler->output != NULL) {
-	    ret = handler->output(&out->content[out->use], &written,
-				  NULL, &toconv);
-	    if (ret >= 0) { /* Gennady: check return value */
-		out->use += written;
-		out->content[out->use] = 0;
-	    }
-	}
-#ifdef LIBXML_ICONV_ENABLED
-	else if (handler->iconv_out != NULL) {
-	    ret = xmlIconvWrapper(handler->iconv_out, &out->content[out->use],
-				  &written, NULL, &toconv);
-	    out->use += written;
-	    out->content[out->use] = 0;
-	}
-#endif /* LIBXML_ICONV_ENABLED */
-#ifdef LIBXML_ICU_ENABLED
-	else if (handler->uconv_out != NULL) {
-	    ret = xmlUconvWrapper(handler->uconv_out, 0,
-                              &out->content[out->use],
-				              &written, NULL, &toconv);
-	    out->use += written;
-	    out->content[out->use] = 0;
-	}
-#endif /* LIBXML_ICU_ENABLED */
+        /* TODO: Check return value. */
+        xmlEncOutputChunk(handler, &out->content[out->use], &written,
+                          NULL, &toconv);
+        out->use += written;
+        out->content[out->use] = 0;
 #ifdef DEBUG_ENCODING
 	xmlGenericError(xmlGenericErrorContext,
 		"initialized encoder\n");
@@ -2700,61 +2605,18 @@
         xmlBufferGrow(out, toconv * 4);
 	written = out->size - out->use - 1;
     }
-    if (handler->output != NULL) {
-	ret = handler->output(&out->content[out->use], &written,
-	                      in->content, &toconv);
-	if (written > 0) {
-	    xmlBufferShrink(in, toconv);
-	    out->use += written;
-	    writtentot += written;
-	}
-	out->content[out->use] = 0;
-    }
-#ifdef LIBXML_ICONV_ENABLED
-    else if (handler->iconv_out != NULL) {
-	ret = xmlIconvWrapper(handler->iconv_out, &out->content[out->use],
-	                      &written, in->content, &toconv);
-	xmlBufferShrink(in, toconv);
-	out->use += written;
-	writtentot += written;
-	out->content[out->use] = 0;
-	if (ret == -1) {
-	    if (written > 0) {
-		/*
-		 * Can be a limitation of iconv
-		 */
-                charref_len = 0;
-		goto retry;
-	    }
-	    ret = -3;
-	}
-    }
-#endif /* LIBXML_ICONV_ENABLED */
-#ifdef LIBXML_ICU_ENABLED
-    else if (handler->uconv_out != NULL) {
-	ret = xmlUconvWrapper(handler->uconv_out, 0,
-                              &out->content[out->use],
-	                      &written, in->content, &toconv);
-	xmlBufferShrink(in, toconv);
-	out->use += written;
-	writtentot += written;
-	out->content[out->use] = 0;
-	if (ret == -1) {
-	    if (written > 0) {
-		/*
-		 * Can be a limitation of iconv
-		 */
-                charref_len = 0;
-		goto retry;
-	    }
-	    ret = -3;
-	}
-    }
-#endif /* LIBXML_ICU_ENABLED */
-    else {
-	xmlEncodingErr(XML_I18N_NO_OUTPUT,
-		       "xmlCharEncOutFunc: no output function !\n", NULL);
-	return(-1);
+    ret = xmlEncOutputChunk(handler, &out->content[out->use], &written,
+                            in->content, &toconv);
+    xmlBufferShrink(in, toconv);
+    out->use += written;
+    writtentot += written;
+    out->content[out->use] = 0;
+    if (ret == -1) {
+        if (written > 0) {
+            /* Can be a limitation of iconv or uconv */
+            goto retry;
+        }
+        ret = -3;
     }
 
     if (ret >= 0) output += ret;
@@ -2782,47 +2644,44 @@
 	            toconv, written, in->use);
 #endif
 	    break;
+        case -4:
+	    xmlEncodingErr(XML_I18N_NO_OUTPUT,
+		           "xmlCharEncOutFunc: no output function !\n", NULL);
+	    ret = -1;
+            break;
         case -2: {
+	    xmlChar charref[20];
 	    int len = in->use;
 	    const xmlChar *utf = (const xmlChar *) in->content;
-	    int cur;
+	    int cur, charrefLen;
 
 	    cur = xmlGetUTF8Char(utf, &len);
-	    if ((charref_len != 0) && (written < charref_len)) {
-		/*
-		 * We attempted to insert a character reference and failed.
-		 * Undo what was written and skip the remaining charref.
-		 */
-		out->use -= written;
-		writtentot -= written;
-		xmlBufferShrink(in, charref_len - written);
-		charref_len = 0;
-
-		ret = -1;
+	    if (cur <= 0)
                 break;
-	    } else if (cur > 0) {
-		xmlChar charref[20];
 
 #ifdef DEBUG_ENCODING
-		xmlGenericError(xmlGenericErrorContext,
-			"handling output conversion error\n");
-		xmlGenericError(xmlGenericErrorContext,
-			"Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n",
-			in->content[0], in->content[1],
-			in->content[2], in->content[3]);
+            xmlGenericError(xmlGenericErrorContext,
+                    "handling output conversion error\n");
+            xmlGenericError(xmlGenericErrorContext,
+                    "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n",
+                    in->content[0], in->content[1],
+                    in->content[2], in->content[3]);
 #endif
-		/*
-		 * Removes the UTF8 sequence, and replace it by a charref
-		 * and continue the transcoding phase, hoping the error
-		 * did not mangle the encoder state.
-		 */
-		charref_len = snprintf((char *) &charref[0], sizeof(charref),
-				 "&#%d;", cur);
-		xmlBufferShrink(in, len);
-		xmlBufferAddHead(in, charref, -1);
+            /*
+             * Removes the UTF8 sequence, and replace it by a charref
+             * and continue the transcoding phase, hoping the error
+             * did not mangle the encoder state.
+             */
+            charrefLen = snprintf((char *) &charref[0], sizeof(charref),
+                             "&#%d;", cur);
+            xmlBufferShrink(in, len);
+            xmlBufferGrow(out, charrefLen * 4);
+	    written = out->size - out->use - 1;
+            toconv = charrefLen;
+            ret = xmlEncOutputChunk(handler, &out->content[out->use], &written,
+                                    charref, &toconv);
 
-		goto retry;
-	    } else {
+	    if ((ret < 0) || (toconv != charrefLen)) {
 		char buf[50];
 
 		snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X",
@@ -2834,8 +2693,13 @@
 			       buf);
 		if (in->alloc != XML_BUFFER_ALLOC_IMMUTABLE)
 		    in->content[0] = ' ';
+	        break;
 	    }
-	    break;
+
+            out->use += written;
+            writtentot += written;
+            out->content[out->use] = 0;
+            goto retry;
 	}
     }
     return(ret);
@@ -2954,54 +2818,20 @@
 
 	    int ret;
 
-	    if (handler->output != NULL) {
-	        do {
-		    toconv = in->end - cur;
-		    written = 32000;
-		    ret = handler->output(&convbuf[0], &written,
-				      cur, &toconv);
-		    if (ret == -1) return(-1);
-		    unused += written;
-		    cur += toconv;
-		} while (ret == -2);
-#ifdef LIBXML_ICONV_ENABLED
-	    } else if (handler->iconv_out != NULL) {
-	        do {
-		    toconv = in->end - cur;
-		    written = 32000;
-		    ret = xmlIconvWrapper(handler->iconv_out, &convbuf[0],
-	                      &written, cur, &toconv);
-		    if (ret < 0) {
-		        if (written > 0)
-			    ret = -2;
-			else
-			    return(-1);
-		    }
-		    unused += written;
-		    cur += toconv;
-		} while (ret == -2);
-#endif
-#ifdef LIBXML_ICU_ENABLED
-	    } else if (handler->uconv_out != NULL) {
-	        do {
-		    toconv = in->end - cur;
-		    written = 32000;
-		    ret = xmlUconvWrapper(handler->uconv_out, 0, &convbuf[0],
-	                      &written, cur, &toconv);
-		    if (ret < 0) {
-		        if (written > 0)
-			    ret = -2;
-			else
-			    return(-1);
-		    }
-		    unused += written;
-		    cur += toconv;
-		} while (ret == -2);
-#endif
-            } else {
-	        /* could not find a converter */
-	        return(-1);
-	    }
+            do {
+                toconv = in->end - cur;
+                written = 32000;
+                ret = xmlEncOutputChunk(handler, &convbuf[0], &written,
+                                        cur, &toconv);
+                if (ret < 0) {
+                    if (written > 0)
+                        ret = -2;
+                    else
+                        return(-1);
+                }
+                unused += written;
+                cur += toconv;
+            } while (ret == -2);
 	}
 	if (in->buf->rawconsumed < unused)
 	    return(-1);
diff --git a/third_party/libxml/src/error.c b/third_party/libxml/src/error.c
index 9606f13..50e9e6f8 100644
--- a/third_party/libxml/src/error.c
+++ b/third_party/libxml/src/error.c
@@ -853,7 +853,7 @@
  * Get the last global error registered. This is per thread if compiled
  * with thread support.
  *
- * Returns NULL if no error occured or a pointer to the error
+ * Returns NULL if no error occurred or a pointer to the error
  */
 xmlErrorPtr
 xmlGetLastError(void)
@@ -910,7 +910,7 @@
  *
  * Get the last parsing error registered.
  *
- * Returns NULL if no error occured or a pointer to the error
+ * Returns NULL if no error occurred or a pointer to the error
  */
 xmlErrorPtr
 xmlCtxtGetLastError(void *ctx)
diff --git a/third_party/libxml/src/hash.c b/third_party/libxml/src/hash.c
index f9a20172..5dcaeb40 100644
--- a/third_party/libxml/src/hash.c
+++ b/third_party/libxml/src/hash.c
@@ -168,7 +168,7 @@
  *
  * Create a new xmlHashTablePtr.
  *
- * Returns the newly created object, or NULL if an error occured.
+ * Returns the newly created object, or NULL if an error occurred.
  */
 xmlHashTablePtr
 xmlHashCreate(int size) {
@@ -202,7 +202,7 @@
  *
  * Create a new xmlHashTablePtr which will use @dict as the internal dictionary
  *
- * Returns the newly created object, or NULL if an error occured.
+ * Returns the newly created object, or NULL if an error occurred.
  */
 xmlHashTablePtr
 xmlHashCreateDict(int size, xmlDictPtr dict) {
diff --git a/third_party/libxml/src/include/libxml/HTMLparser.h b/third_party/libxml/src/include/libxml/HTMLparser.h
index 551186cb..1d4fec2 100644
--- a/third_party/libxml/src/include/libxml/HTMLparser.h
+++ b/third_party/libxml/src/include/libxml/HTMLparser.h
@@ -115,12 +115,12 @@
 XMLPUBFUN int XMLCALL
 			htmlParseDocument(htmlParserCtxtPtr ctxt);
 XMLPUBFUN htmlDocPtr XMLCALL
-			htmlSAXParseDoc	(xmlChar *cur,
+			htmlSAXParseDoc	(const xmlChar *cur,
 					 const char *encoding,
 					 htmlSAXHandlerPtr sax,
 					 void *userData);
 XMLPUBFUN htmlDocPtr XMLCALL
-			htmlParseDoc	(xmlChar *cur,
+			htmlParseDoc	(const xmlChar *cur,
 					 const char *encoding);
 XMLPUBFUN htmlDocPtr XMLCALL
 			htmlSAXParseFile(const char *filename,
diff --git a/third_party/libxml/src/include/libxml/schemasInternals.h b/third_party/libxml/src/include/libxml/schemasInternals.h
index c7cf552..6fb71139 100644
--- a/third_party/libxml/src/include/libxml/schemasInternals.h
+++ b/third_party/libxml/src/include/libxml/schemasInternals.h
@@ -3,7 +3,7 @@
  * Description: internal interfaces for the XML Schemas handling
  *              and schema validity checking
  *		The Schemas development is a Work In Progress.
- *              Some of those interfaces are not garanteed to be API or ABI stable !
+ *              Some of those interfaces are not guaranteed to be API or ABI stable !
  *
  * Copy: See Copyright for the status of this software.
  *
diff --git a/third_party/libxml/src/include/libxml/xmlreader.h b/third_party/libxml/src/include/libxml/xmlreader.h
index 2c99e3a7..e8a8bcc9 100644
--- a/third_party/libxml/src/include/libxml/xmlreader.h
+++ b/third_party/libxml/src/include/libxml/xmlreader.h
@@ -393,7 +393,7 @@
  * @arg: the user argument
  * @msg: the message
  * @severity: the severity of the error
- * @locator: a locator indicating where the error occured
+ * @locator: a locator indicating where the error occurred
  *
  * Signature of an error callback from a reader parser
  */
diff --git a/third_party/libxml/src/libxml.m4 b/third_party/libxml/src/libxml.m4
index 68cd824..2d7a6f5 100644
--- a/third_party/libxml/src/libxml.m4
+++ b/third_party/libxml/src/libxml.m4
@@ -170,7 +170,7 @@
           echo "*** If you have an old version installed, it is best to remove it, although"
           echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ],
         [ echo "*** The test program failed to compile or link. See the file config.log for the"
-          echo "*** exact error that occured. This usually means LIBXML was incorrectly installed"
+          echo "*** exact error that occurred. This usually means LIBXML was incorrectly installed"
           echo "*** or that you have moved LIBXML since it was installed. In the latter case, you"
           echo "*** may want to edit the xml2-config script: $XML2_CONFIG" ])
           CPPFLAGS="$ac_save_CPPFLAGS"
diff --git a/third_party/libxml/src/libxml2.spec b/third_party/libxml/src/libxml2.spec
index 404a758..52151de 100644
--- a/third_party/libxml/src/libxml2.spec
+++ b/third_party/libxml/src/libxml2.spec
@@ -194,6 +194,6 @@
 %endif # with_python3
 
 %changelog
-* Wed Jun 14 2017 Daniel Veillard <veillard@redhat.com>
+* Thu Aug 10 2017 Daniel Veillard <veillard@redhat.com>
 - upstream release 2.9.4 see http://xmlsoft.org/news.html
 
diff --git a/third_party/libxml/src/list.c b/third_party/libxml/src/list.c
index d33d928..caa833313 100644
--- a/third_party/libxml/src/list.c
+++ b/third_party/libxml/src/list.c
@@ -347,7 +347,7 @@
  *
  * Remove the first instance associated to data in the list
  *
- * Returns 1 if a deallocation occured, or 0 if not found
+ * Returns 1 if a deallocation occurred, or 0 if not found
  */
 int
 xmlListRemoveFirst(xmlListPtr l, void *data)
@@ -372,7 +372,7 @@
  *
  * Remove the last instance associated to data in the list
  *
- * Returns 1 if a deallocation occured, or 0 if not found
+ * Returns 1 if a deallocation occurred, or 0 if not found
  */
 int
 xmlListRemoveLast(xmlListPtr l, void *data)
diff --git a/third_party/libxml/src/nanohttp.c b/third_party/libxml/src/nanohttp.c
index 373425de..b911f9c4 100644
--- a/third_party/libxml/src/nanohttp.c
+++ b/third_party/libxml/src/nanohttp.c
@@ -1534,7 +1534,8 @@
 	xmlGenericError(xmlGenericErrorContext,
 		"\nRedirect to: %s\n", ctxt->location);
 #endif
-	while ( xmlNanoHTTPRecv(ctxt) > 0 ) ;
+	while ( xmlNanoHTTPRecv(ctxt) > 0 )
+            ;
         if (nbRedirects < XML_NANO_HTTP_MAX_REDIR) {
 	    nbRedirects++;
 	    if (redirURL != NULL)
diff --git a/third_party/libxml/src/parser.c b/third_party/libxml/src/parser.c
index ac50643..1299cb3 100644
--- a/third_party/libxml/src/parser.c
+++ b/third_party/libxml/src/parser.c
@@ -2049,10 +2049,8 @@
 
 #define SKIP(val) do {							\
     ctxt->nbChars += (val),ctxt->input->cur += (val),ctxt->input->col+=(val);			\
-    if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt);	\
-    if ((*ctxt->input->cur == 0) &&					\
-        (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0))		\
-	    xmlPopInput(ctxt);						\
+    if (*ctxt->input->cur == 0)						\
+        xmlParserInputGrow(ctxt->input, INPUT_CHUNK);			\
   } while (0)
 
 #define SKIPL(val) do {							\
@@ -2064,10 +2062,8 @@
 	ctxt->nbChars++;						\
 	ctxt->input->cur++;						\
     }									\
-    if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt);	\
-    if ((*ctxt->input->cur == 0) &&					\
-        (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0))		\
-	    xmlPopInput(ctxt);						\
+    if (*ctxt->input->cur == 0)						\
+        xmlParserInputGrow(ctxt->input, INPUT_CHUNK);			\
   } while (0)
 
 #define SHRINK if ((ctxt->progressive == 0) &&				\
@@ -2077,10 +2073,9 @@
 
 static void xmlSHRINK (xmlParserCtxtPtr ctxt) {
     xmlParserInputShrink(ctxt->input);
-    if ((*ctxt->input->cur == 0) &&
-        (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0))
-	    xmlPopInput(ctxt);
-  }
+    if (*ctxt->input->cur == 0)
+        xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
+}
 
 #define GROW if ((ctxt->progressive == 0) &&				\
 		 (ctxt->input->end - ctxt->input->cur < INPUT_CHUNK))	\
@@ -2105,9 +2100,8 @@
         xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "cur index out of bound");
 	return;
     }
-    if ((ctxt->input->cur != NULL) && (*ctxt->input->cur == 0) &&
-        (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0))
-	    xmlPopInput(ctxt);
+    if ((ctxt->input->cur != NULL) && (*ctxt->input->cur == 0))
+        xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
 }
 
 #define SKIP_BLANKS xmlSkipBlankChars(ctxt)
@@ -2176,26 +2170,35 @@
 	}
 	ctxt->input->cur = cur;
     } else {
-	int cur;
-	do {
-	    cur = CUR;
-	    while ((IS_BLANK_CH(cur) && /* CHECKED tstblanks.xml */
-	           (ctxt->instate != XML_PARSER_EOF))) {
+        int expandPE = ((ctxt->external != 0) || (ctxt->inputNr != 1));
+
+	while (1) {
+            if (IS_BLANK_CH(CUR)) { /* CHECKED tstblanks.xml */
 		NEXT;
-		cur = CUR;
-		res++;
-	    }
-	    while ((cur == 0) && (ctxt->inputNr > 1) &&
-		   (ctxt->instate != XML_PARSER_COMMENT)) {
-		xmlPopInput(ctxt);
-		cur = CUR;
-	    }
-	    /*
-	     * Need to handle support of entities branching here
-	     */
-	    if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt);
-	} while ((IS_BLANK(cur)) && /* CHECKED tstblanks.xml */
-	         (ctxt->instate != XML_PARSER_EOF));
+	    } else if (CUR == '%') {
+                /*
+                 * Need to handle support of entities branching here
+                 */
+	        if ((expandPE == 0) || (IS_BLANK_CH(NXT(1))) || (NXT(1) == 0))
+                    break;
+	        xmlParsePEReference(ctxt);
+            } else if (CUR == 0) {
+                if (ctxt->inputNr <= 1)
+                    break;
+                xmlPopInput(ctxt);
+            } else {
+                break;
+            }
+
+            /*
+             * Also increase the counter when entering or exiting a PERef.
+             * The spec says: "When a parameter-entity reference is recognized
+             * in the DTD and included, its replacement text MUST be enlarged
+             * by the attachment of one leading and one following space (#x20)
+             * character."
+             */
+	    res++;
+        }
     }
     return(res);
 }
@@ -2221,10 +2224,13 @@
     if (xmlParserDebugEntities)
 	xmlGenericError(xmlGenericErrorContext,
 		"Popping input %d\n", ctxt->inputNr);
+    if ((ctxt->inputNr > 1) && (ctxt->inSubset == 0) &&
+        (ctxt->instate != XML_PARSER_EOF))
+        xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR,
+                    "Unfinished entity outside the DTD");
     xmlFreeInputStream(inputPop(ctxt));
-    if ((*ctxt->input->cur == 0) &&
-        (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0))
-	    return(xmlPopInput(ctxt));
+    if (*ctxt->input->cur == 0)
+        xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
     return(CUR);
 }
 
@@ -2250,6 +2256,13 @@
 	xmlGenericError(xmlGenericErrorContext,
 		"Pushing input %d : %.30s\n", ctxt->inputNr+1, input->cur);
     }
+    if (((ctxt->inputNr > 40) && ((ctxt->options & XML_PARSE_HUGE) == 0)) ||
+        (ctxt->inputNr > 1024)) {
+        xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL);
+        while (ctxt->inputNr > 1)
+            xmlFreeInputStream(inputPop(ctxt));
+	return(-1);
+    }
     ret = inputPush(ctxt, input);
     if (ctxt->instate == XML_PARSER_EOF)
         return(-1);
@@ -2455,57 +2468,6 @@
 }
 
 /**
- * xmlNewBlanksWrapperInputStream:
- * @ctxt:  an XML parser context
- * @entity:  an Entity pointer
- *
- * Create a new input stream for wrapping
- * blanks around a PEReference
- *
- * Returns the new input stream or NULL
- */
-
-static void deallocblankswrapper (xmlChar *str) {xmlFree(str);}
-
-static xmlParserInputPtr
-xmlNewBlanksWrapperInputStream(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) {
-    xmlParserInputPtr input;
-    xmlChar *buffer;
-    size_t length;
-    if (entity == NULL) {
-	xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR,
-	            "xmlNewBlanksWrapperInputStream entity\n");
-	return(NULL);
-    }
-    if (xmlParserDebugEntities)
-	xmlGenericError(xmlGenericErrorContext,
-		"new blanks wrapper for entity: %s\n", entity->name);
-    input = xmlNewInputStream(ctxt);
-    if (input == NULL) {
-	return(NULL);
-    }
-    length = xmlStrlen(entity->name) + 5;
-    buffer = xmlMallocAtomic(length);
-    if (buffer == NULL) {
-	xmlErrMemory(ctxt, NULL);
-        xmlFree(input);
-	return(NULL);
-    }
-    buffer [0] = ' ';
-    buffer [1] = '%';
-    buffer [length-3] = ';';
-    buffer [length-2] = ' ';
-    buffer [length-1] = 0;
-    memcpy(buffer + 2, entity->name, length - 5);
-    input->free = deallocblankswrapper;
-    input->base = buffer;
-    input->cur = buffer;
-    input->length = length;
-    input->end = &buffer[length];
-    return(input);
-}
-
-/**
  * xmlParserHandlePEReference:
  * @ctxt:  the parser context
  *
@@ -2539,11 +2501,6 @@
  */
 void
 xmlParserHandlePEReference(xmlParserCtxtPtr ctxt) {
-    const xmlChar *name;
-    xmlEntityPtr entity = NULL;
-    xmlParserInputPtr input;
-
-    if (RAW != '%') return;
     switch(ctxt->instate) {
 	case XML_PARSER_CDATA_SECTION:
 	    return;
@@ -2598,128 +2555,7 @@
             return;
     }
 
-    NEXT;
-    name = xmlParseName(ctxt);
-    if (xmlParserDebugEntities)
-	xmlGenericError(xmlGenericErrorContext,
-		"PEReference: %s\n", name);
-    if (name == NULL) {
-	xmlFatalErr(ctxt, XML_ERR_PEREF_NO_NAME, NULL);
-    } else {
-	if (RAW == ';') {
-	    NEXT;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->getParameterEntity != NULL))
-		entity = ctxt->sax->getParameterEntity(ctxt->userData, name);
-	    if (ctxt->instate == XML_PARSER_EOF)
-	        return;
-	    if (entity == NULL) {
-
-		/*
-		 * [ WFC: Entity Declared ]
-		 * In a document without any DTD, a document with only an
-		 * internal DTD subset which contains no parameter entity
-		 * references, or a document with "standalone='yes'", ...
-		 * ... The declaration of a parameter entity must precede
-		 * any reference to it...
-		 */
-		if ((ctxt->standalone == 1) ||
-		    ((ctxt->hasExternalSubset == 0) &&
-		     (ctxt->hasPErefs == 0))) {
-		    xmlFatalErrMsgStr(ctxt, XML_ERR_UNDECLARED_ENTITY,
-			 "PEReference: %%%s; not found\n", name);
-	        } else {
-		    /*
-		     * [ VC: Entity Declared ]
-		     * In a document with an external subset or external
-		     * parameter entities with "standalone='no'", ...
-		     * ... The declaration of a parameter entity must precede
-		     * any reference to it...
-		     */
-		    if ((ctxt->validate) && (ctxt->vctxt.error != NULL)) {
-		        xmlValidityError(ctxt, XML_WAR_UNDECLARED_ENTITY,
-			                 "PEReference: %%%s; not found\n",
-				         name, NULL);
-		    } else
-		        xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY,
-			              "PEReference: %%%s; not found\n",
-				      name, NULL);
-		    ctxt->valid = 0;
-		}
-		xmlParserEntityCheck(ctxt, 0, NULL, 0);
-	    } else if (ctxt->input->free != deallocblankswrapper) {
-		    input = xmlNewBlanksWrapperInputStream(ctxt, entity);
-		    if (xmlPushInput(ctxt, input) < 0)
-		        return;
-	    } else {
-	        if ((entity->etype == XML_INTERNAL_PARAMETER_ENTITY) ||
-		    (entity->etype == XML_EXTERNAL_PARAMETER_ENTITY)) {
-		    xmlChar start[4];
-		    xmlCharEncoding enc;
-
-		    /*
-		     * Note: external parameter entities will not be loaded, it
-		     * is not required for a non-validating parser, unless the
-		     * option of validating, or substituting entities were
-		     * given. Doing so is far more secure as the parser will
-		     * only process data coming from the document entity by
-		     * default.
-		     */
-                    if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) &&
-		        ((ctxt->options & XML_PARSE_NOENT) == 0) &&
-			((ctxt->options & XML_PARSE_DTDVALID) == 0) &&
-			((ctxt->options & XML_PARSE_DTDLOAD) == 0) &&
-			((ctxt->options & XML_PARSE_DTDATTR) == 0) &&
-			(ctxt->replaceEntities == 0) &&
-			(ctxt->validate == 0))
-			return;
-
-		    /*
-		     * handle the extra spaces added before and after
-		     * c.f. http://www.w3.org/TR/REC-xml#as-PE
-		     * this is done independently.
-		     */
-		    input = xmlNewEntityInputStream(ctxt, entity);
-		    if (xmlPushInput(ctxt, input) < 0)
-		        return;
-
-		    /*
-		     * Get the 4 first bytes and decode the charset
-		     * if enc != XML_CHAR_ENCODING_NONE
-		     * plug some encoding conversion routines.
-		     * Note that, since we may have some non-UTF8
-		     * encoding (like UTF16, bug 135229), the 'length'
-		     * is not known, but we can calculate based upon
-		     * the amount of data in the buffer.
-		     */
-		    GROW
-                    if (ctxt->instate == XML_PARSER_EOF)
-                        return;
-		    if ((ctxt->input->end - ctxt->input->cur)>=4) {
-			start[0] = RAW;
-			start[1] = NXT(1);
-			start[2] = NXT(2);
-			start[3] = NXT(3);
-			enc = xmlDetectCharEncoding(start, 4);
-			if (enc != XML_CHAR_ENCODING_NONE) {
-			    xmlSwitchEncoding(ctxt, enc);
-			}
-		    }
-
-		    if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) &&
-			(CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l' )) &&
-			(IS_BLANK_CH(NXT(5)))) {
-			xmlParseTextDecl(ctxt);
-		    }
-		} else {
-		    xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_IS_PARAMETER,
-			     "PEReference: %s is not a parameter entity\n",
-				      name);
-		}
-	    }
-	} else {
-	    xmlFatalErr(ctxt, XML_ERR_PEREF_SEMICOL_MISSING, NULL);
-	}
-    }
+    xmlParsePEReference(ctxt);
 }
 
 /*
@@ -3937,11 +3773,6 @@
 	}
 	COPY_BUF(l,buf,len,c);
 	NEXTL(l);
-	/*
-	 * Pop-up of finished entities.
-	 */
-	while ((RAW == 0) && (ctxt->inputNr > 1)) /* non input consuming */
-	    xmlPopInput(ctxt);
 
 	GROW;
 	c = CUR_CHAR(l);
@@ -4603,7 +4434,7 @@
 	    if (*in == ']') {
 		if ((in[1] == ']') && (in[2] == '>')) {
 		    xmlFatalErr(ctxt, XML_ERR_MISPLACED_CDATA_END, NULL);
-		    ctxt->input->cur = in;
+		    ctxt->input->cur = in + 1;
 		    return;
 		}
 		in++;
@@ -4756,7 +4587,7 @@
 	    }
 	}
     }
-    if ((cur != 0) && (!IS_CHAR(cur))) {
+    if ((ctxt->input->cur < ctxt->input->end) && (!IS_CHAR(cur))) {
 	/* Generate the error and skip the offending character */
         xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR,
                           "PCDATA invalid Char value %d\n",
@@ -4796,22 +4627,20 @@
     *publicID = NULL;
     if (CMP6(CUR_PTR, 'S', 'Y', 'S', 'T', 'E', 'M')) {
         SKIP(6);
-	if (!IS_BLANK_CH(CUR)) {
+	if (SKIP_BLANKS == 0) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 	                   "Space required after 'SYSTEM'\n");
 	}
-        SKIP_BLANKS;
 	URI = xmlParseSystemLiteral(ctxt);
 	if (URI == NULL) {
 	    xmlFatalErr(ctxt, XML_ERR_URI_REQUIRED, NULL);
         }
     } else if (CMP6(CUR_PTR, 'P', 'U', 'B', 'L', 'I', 'C')) {
         SKIP(6);
-	if (!IS_BLANK_CH(CUR)) {
+	if (SKIP_BLANKS == 0) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 		    "Space required after 'PUBLIC'\n");
 	}
-        SKIP_BLANKS;
 	*publicID = xmlParsePubidLiteral(ctxt);
 	if (*publicID == NULL) {
 	    xmlFatalErr(ctxt, XML_ERR_PUBID_REQUIRED, NULL);
@@ -4820,26 +4649,20 @@
 	    /*
 	     * We don't handle [83] so "S SystemLiteral" is required.
 	     */
-	    if (!IS_BLANK_CH(CUR)) {
+	    if (SKIP_BLANKS == 0) {
 		xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 			"Space required after the Public Identifier\n");
 	    }
 	} else {
 	    /*
 	     * We handle [83] so we return immediately, if
-	     * "S SystemLiteral" is not detected. From a purely parsing
-	     * point of view that's a nice mess.
+	     * "S SystemLiteral" is not detected. We skip blanks if no
+             * system literal was found, but this is harmless since we must
+             * be at the end of a NotationDecl.
 	     */
-	    const xmlChar *ptr;
-	    GROW;
-
-	    ptr = CUR_PTR;
-	    if (!IS_BLANK_CH(*ptr)) return(NULL);
-
-	    while (IS_BLANK_CH(*ptr)) ptr++; /* TODO: dangerous, fix ! */
-	    if ((*ptr != '\'') && (*ptr != '"')) return(NULL);
+	    if (SKIP_BLANKS == 0) return(NULL);
+	    if ((CUR != '\'') && (CUR != '"')) return(NULL);
 	}
-        SKIP_BLANKS;
 	URI = xmlParseSystemLiteral(ctxt);
 	if (URI == NULL) {
 	    xmlFatalErr(ctxt, XML_ERR_URI_REQUIRED, NULL);
@@ -4969,7 +4792,8 @@
     } else {
 	if (inputid != ctxt->input->id) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
-		"Comment doesn't start and stop in the same entity\n");
+		           "Comment doesn't start and stop in the same"
+                           " entity\n");
 	}
         NEXT;
 	if ((ctxt->sax != NULL) && (ctxt->sax->comment != NULL) &&
@@ -5117,7 +4941,8 @@
 	        if (in[2] == '>') {
 		    if (ctxt->input->id != inputid) {
 			xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
-			"comment doesn't start and stop in the same entity\n");
+			               "comment doesn't start and stop in the"
+                                       " same entity\n");
 		    }
 		    SKIP(3);
 		    if ((ctxt->sax != NULL) && (ctxt->sax->comment != NULL) &&
@@ -5285,7 +5110,7 @@
     int count = 0;
 
     if ((RAW == '<') && (NXT(1) == '?')) {
-	xmlParserInputPtr input = ctxt->input;
+	int inputid = ctxt->input->id;
 	state = ctxt->instate;
         ctxt->instate = XML_PARSER_PI;
 	/*
@@ -5301,9 +5126,10 @@
         target = xmlParsePITarget(ctxt);
 	if (target != NULL) {
 	    if ((RAW == '?') && (NXT(1) == '>')) {
-		if (input != ctxt->input) {
+		if (inputid != ctxt->input->id) {
 		    xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
-	    "PI declaration doesn't start and stop in the same entity\n");
+	                           "PI declaration doesn't start and stop in"
+                                   " the same entity\n");
 		}
 		SKIP(2);
 
@@ -5324,12 +5150,10 @@
 		ctxt->instate = state;
 		return;
 	    }
-	    cur = CUR;
-	    if (!IS_BLANK(cur)) {
+	    if (SKIP_BLANKS == 0) {
 		xmlFatalErrMsgStr(ctxt, XML_ERR_SPACE_REQUIRED,
 			  "ParsePI: PI %s space expected\n", target);
 	    }
-            SKIP_BLANKS;
 	    cur = CUR_CHAR(l);
 	    while (IS_CHAR(cur) && /* checked */
 		   ((cur != '?') || (NXT(1) != '>'))) {
@@ -5385,9 +5209,10 @@
 		xmlFatalErrMsgStr(ctxt, XML_ERR_PI_NOT_FINISHED,
 		      "ParsePI: PI %s never end ...\n", target);
 	    } else {
-		if (input != ctxt->input) {
-		    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
-	    "PI declaration doesn't start and stop in the same entity\n");
+		if (inputid != ctxt->input->id) {
+		    xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
+	                           "PI declaration doesn't start and stop in"
+                                   " the same entity\n");
 		}
 		SKIP(2);
 
@@ -5443,32 +5268,30 @@
     xmlChar *Systemid;
 
     if (CMP10(CUR_PTR, '<', '!', 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N')) {
-	xmlParserInputPtr input = ctxt->input;
+	int inputid = ctxt->input->id;
 	SHRINK;
 	SKIP(10);
-	if (!IS_BLANK_CH(CUR)) {
+	if (SKIP_BLANKS == 0) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 			   "Space required after '<!NOTATION'\n");
 	    return;
 	}
-	SKIP_BLANKS;
 
         name = xmlParseName(ctxt);
 	if (name == NULL) {
 	    xmlFatalErr(ctxt, XML_ERR_NOTATION_NOT_STARTED, NULL);
 	    return;
 	}
-	if (!IS_BLANK_CH(CUR)) {
-	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
-		     "Space required after the NOTATION name'\n");
-	    return;
-	}
 	if (xmlStrchr(name, ':') != NULL) {
 	    xmlNsErr(ctxt, XML_NS_ERR_COLON,
 		     "colons are forbidden from notation names '%s'\n",
 		     name, NULL, NULL);
 	}
-	SKIP_BLANKS;
+	if (SKIP_BLANKS == 0) {
+	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+		     "Space required after the NOTATION name'\n");
+	    return;
+	}
 
 	/*
 	 * Parse the IDs.
@@ -5477,9 +5300,10 @@
 	SKIP_BLANKS;
 
 	if (RAW == '>') {
-	    if (input != ctxt->input) {
-		xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
-	"Notation declaration doesn't start and stop in the same entity\n");
+	    if (inputid != ctxt->input->id) {
+		xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
+	                       "Notation declaration doesn't start and stop"
+                               " in the same entity\n");
 	    }
 	    NEXT;
 	    if ((ctxt->sax != NULL) && (!ctxt->disableSAX) &&
@@ -5523,23 +5347,20 @@
     const xmlChar *ndata = NULL;
     int isParameter = 0;
     xmlChar *orig = NULL;
-    int skipped;
 
     /* GROW; done in the caller */
     if (CMP8(CUR_PTR, '<', '!', 'E', 'N', 'T', 'I', 'T', 'Y')) {
-	xmlParserInputPtr input = ctxt->input;
+	int inputid = ctxt->input->id;
 	SHRINK;
 	SKIP(8);
-	skipped = SKIP_BLANKS;
-	if (skipped == 0) {
+	if (SKIP_BLANKS == 0) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 			   "Space required after '<!ENTITY'\n");
 	}
 
 	if (RAW == '%') {
 	    NEXT;
-	    skipped = SKIP_BLANKS;
-	    if (skipped == 0) {
+	    if (SKIP_BLANKS == 0) {
 		xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 			       "Space required after '%%'\n");
 	    }
@@ -5557,8 +5378,7 @@
 		     "colons are forbidden from entities names '%s'\n",
 		     name, NULL, NULL);
 	}
-        skipped = SKIP_BLANKS;
-	if (skipped == 0) {
+	if (SKIP_BLANKS == 0) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 			   "Space required after the entity name\n");
 	}
@@ -5669,18 +5489,16 @@
 			xmlFreeURI(uri);
 		    }
 		}
-		if ((RAW != '>') && (!IS_BLANK_CH(CUR))) {
+		if ((RAW != '>') && (SKIP_BLANKS == 0)) {
 		    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 				   "Space required before 'NDATA'\n");
 		}
-		SKIP_BLANKS;
 		if (CMP5(CUR_PTR, 'N', 'D', 'A', 'T', 'A')) {
 		    SKIP(5);
-		    if (!IS_BLANK_CH(CUR)) {
+		    if (SKIP_BLANKS == 0) {
 			xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 				       "Space required after 'NDATA'\n");
 		    }
-		    SKIP_BLANKS;
 		    ndata = xmlParseName(ctxt);
 		    if ((ctxt->sax != NULL) && (!ctxt->disableSAX) &&
 		        (ctxt->sax->unparsedEntityDecl != NULL))
@@ -5726,9 +5544,10 @@
 	            "xmlParseEntityDecl: entity %s not terminated\n", name);
 	    xmlHaltParser(ctxt);
 	} else {
-	    if (input != ctxt->input) {
+	    if (inputid != ctxt->input->id) {
 		xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
-	"Entity declaration doesn't start and stop in the same entity\n");
+	                       "Entity declaration doesn't start and stop in"
+                               " the same entity\n");
 	    }
 	    NEXT;
 	}
@@ -5811,11 +5630,10 @@
     if (CMP6(CUR_PTR, '#', 'F', 'I', 'X', 'E', 'D')) {
 	SKIP(6);
 	val = XML_ATTRIBUTE_FIXED;
-	if (!IS_BLANK_CH(CUR)) {
+	if (SKIP_BLANKS == 0) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 			   "Space required after '#FIXED'\n");
 	}
-	SKIP_BLANKS;
     }
     ret = xmlParseAttValue(ctxt);
     ctxt->instate = XML_PARSER_DTD;
@@ -5987,12 +5805,11 @@
 xmlParseEnumeratedType(xmlParserCtxtPtr ctxt, xmlEnumerationPtr *tree) {
     if (CMP8(CUR_PTR, 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N')) {
 	SKIP(8);
-	if (!IS_BLANK_CH(CUR)) {
+	if (SKIP_BLANKS == 0) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 			   "Space required after 'NOTATION'\n");
 	    return(0);
 	}
-        SKIP_BLANKS;
 	*tree = xmlParseNotationType(ctxt);
 	if (*tree == NULL) return(0);
 	return(XML_ATTRIBUTE_NOTATION);
@@ -6096,14 +5913,13 @@
     xmlEnumerationPtr tree;
 
     if (CMP9(CUR_PTR, '<', '!', 'A', 'T', 'T', 'L', 'I', 'S', 'T')) {
-	xmlParserInputPtr input = ctxt->input;
+	int inputid = ctxt->input->id;
 
 	SKIP(9);
-	if (!IS_BLANK_CH(CUR)) {
+	if (SKIP_BLANKS == 0) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 		                 "Space required after '<!ATTLIST'\n");
 	}
-        SKIP_BLANKS;
         elemName = xmlParseName(ctxt);
 	if (elemName == NULL) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
@@ -6126,12 +5942,11 @@
 		break;
 	    }
 	    GROW;
-	    if (!IS_BLANK_CH(CUR)) {
+	    if (SKIP_BLANKS == 0) {
 		xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 		        "Space required after the attribute name\n");
 		break;
 	    }
-	    SKIP_BLANKS;
 
 	    type = xmlParseAttributeType(ctxt, &tree);
 	    if (type <= 0) {
@@ -6139,14 +5954,13 @@
 	    }
 
 	    GROW;
-	    if (!IS_BLANK_CH(CUR)) {
+	    if (SKIP_BLANKS == 0) {
 		xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 			       "Space required after the attribute type\n");
 	        if (tree != NULL)
 		    xmlFreeEnumeration(tree);
 		break;
 	    }
-	    SKIP_BLANKS;
 
 	    def = xmlParseDefaultDecl(ctxt, &defaultValue);
 	    if (def <= 0) {
@@ -6161,7 +5975,7 @@
 
 	    GROW;
             if (RAW != '>') {
-		if (!IS_BLANK_CH(CUR)) {
+		if (SKIP_BLANKS == 0) {
 		    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 			"Space required after the attribute default value\n");
 		    if (defaultValue != NULL)
@@ -6170,7 +5984,6 @@
 			xmlFreeEnumeration(tree);
 		    break;
 		}
-		SKIP_BLANKS;
 	    }
 	    if ((ctxt->sax != NULL) && (!ctxt->disableSAX) &&
 		(ctxt->sax->attributeDecl != NULL))
@@ -6192,10 +6005,10 @@
 	    GROW;
 	}
 	if (RAW == '>') {
-	    if (input != ctxt->input) {
-		xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY,
-    "Attribute list declaration doesn't start and stop in the same entity\n",
-                                 NULL, NULL);
+	    if (inputid != ctxt->input->id) {
+		xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
+                               "Attribute list declaration doesn't start and"
+                               " stop in the same entity\n");
 	    }
 	    NEXT;
 	}
@@ -6232,10 +6045,10 @@
 	SKIP_BLANKS;
 	SHRINK;
 	if (RAW == ')') {
-	    if ((ctxt->validate) && (ctxt->input->id != inputchk)) {
-		xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY,
-"Element content declaration doesn't start and stop in the same entity\n",
-                                 NULL, NULL);
+	    if (ctxt->input->id != inputchk) {
+		xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
+                               "Element content declaration doesn't start and"
+                               " stop in the same entity\n");
 	    }
 	    NEXT;
 	    ret = xmlNewDocElementContent(ctxt->myDoc, NULL, XML_ELEMENT_CONTENT_PCDATA);
@@ -6291,10 +6104,10 @@
             }
             if (ret != NULL)
                 ret->ocur = XML_ELEMENT_CONTENT_MULT;
-	    if ((ctxt->validate) && (ctxt->input->id != inputchk)) {
-		xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY,
-"Element content declaration doesn't start and stop in the same entity\n",
-				 NULL, NULL);
+	    if (ctxt->input->id != inputchk) {
+		xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
+                               "Element content declaration doesn't start and"
+                               " stop in the same entity\n");
 	    }
 	    SKIP(2);
 	} else {
@@ -6534,10 +6347,10 @@
 	if (last != NULL)
 	    last->parent = cur;
     }
-    if ((ctxt->validate) && (ctxt->input->id != inputchk)) {
-	xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY,
-"Element content declaration doesn't start and stop in the same entity\n",
-			 NULL, NULL);
+    if (ctxt->input->id != inputchk) {
+	xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
+                       "Element content declaration doesn't start and stop in"
+                       " the same entity\n");
     }
     NEXT;
     if (RAW == '?') {
@@ -6710,28 +6523,24 @@
 
     /* GROW; done in the caller */
     if (CMP9(CUR_PTR, '<', '!', 'E', 'L', 'E', 'M', 'E', 'N', 'T')) {
-	xmlParserInputPtr input = ctxt->input;
+	int inputid = ctxt->input->id;
 
 	SKIP(9);
-	if (!IS_BLANK_CH(CUR)) {
+	if (SKIP_BLANKS == 0) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 		           "Space required after 'ELEMENT'\n");
 	    return(-1);
 	}
-        SKIP_BLANKS;
         name = xmlParseName(ctxt);
 	if (name == NULL) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
 			   "xmlParseElementDecl: no name for Element\n");
 	    return(-1);
 	}
-	while ((RAW == 0) && (ctxt->inputNr > 1))
-	    xmlPopInput(ctxt);
-	if (!IS_BLANK_CH(CUR)) {
+	if (SKIP_BLANKS == 0) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 			   "Space required after the element name\n");
 	}
-        SKIP_BLANKS;
 	if (CMP5(CUR_PTR, 'E', 'M', 'P', 'T', 'Y')) {
 	    SKIP(5);
 	    /*
@@ -6763,12 +6572,6 @@
 	}
 
 	SKIP_BLANKS;
-	/*
-	 * Pop-up of finished entities.
-	 */
-	while ((RAW == 0) && (ctxt->inputNr > 1))
-	    xmlPopInput(ctxt);
-	SKIP_BLANKS;
 
 	if (RAW != '>') {
 	    xmlFatalErr(ctxt, XML_ERR_GT_REQUIRED, NULL);
@@ -6776,9 +6579,10 @@
 		xmlFreeDocElementContent(ctxt->myDoc, content);
 	    }
 	} else {
-	    if (input != ctxt->input) {
+	    if (inputid != ctxt->input->id) {
 		xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
-    "Element declaration doesn't start and stop in the same entity\n");
+                               "Element declaration doesn't start and stop in"
+                               " the same entity\n");
 	    }
 
 	    NEXT;
@@ -6831,9 +6635,9 @@
 	    return;
 	} else {
 	    if (ctxt->input->id != id) {
-		xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY,
-	    "All markup of the conditional section is not in the same entity\n",
-				     NULL, NULL);
+		xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
+	                       "All markup of the conditional section is not"
+                               " in the same entity\n");
 	    }
 	    NEXT;
 	}
@@ -6846,6 +6650,8 @@
 		    "Entering INCLUDE Conditional Section\n");
 	}
 
+        SKIP_BLANKS;
+        GROW;
 	while (((RAW != 0) && ((RAW != ']') || (NXT(1) != ']') ||
 	        (NXT(2) != '>'))) && (ctxt->instate != XML_PARSER_EOF)) {
 	    const xmlChar *check = CUR_PTR;
@@ -6853,18 +6659,11 @@
 
 	    if ((RAW == '<') && (NXT(1) == '!') && (NXT(2) == '[')) {
 		xmlParseConditionalSections(ctxt);
-	    } else if (IS_BLANK_CH(CUR)) {
-		NEXT;
-	    } else if (RAW == '%') {
-		xmlParsePEReference(ctxt);
 	    } else
 		xmlParseMarkupDecl(ctxt);
 
-	    /*
-	     * Pop-up of finished entities.
-	     */
-	    while ((RAW == 0) && (ctxt->inputNr > 1))
-		xmlPopInput(ctxt);
+            SKIP_BLANKS;
+            GROW;
 
 	    if ((CUR_PTR == check) && (cons == ctxt->input->consumed)) {
 		xmlFatalErr(ctxt, XML_ERR_EXT_SUBSET_NOT_FINISHED, NULL);
@@ -6894,9 +6693,9 @@
 	    return;
 	} else {
 	    if (ctxt->input->id != id) {
-		xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY,
-	    "All markup of the conditional section is not in the same entity\n",
-				     NULL, NULL);
+		xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
+	                       "All markup of the conditional section is not"
+                               " in the same entity\n");
 	    }
 	    NEXT;
 	}
@@ -6958,9 +6757,9 @@
 	xmlFatalErr(ctxt, XML_ERR_CONDSEC_NOT_FINISHED, NULL);
     } else {
 	if (ctxt->input->id != id) {
-	    xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY,
-	"All markup of the conditional section is not in the same entity\n",
-				 NULL, NULL);
+	    xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
+	                   "All markup of the conditional section is not in"
+                           " the same entity\n");
 	}
 	if ((ctxt-> instate != XML_PARSER_EOF) &&
 	    ((ctxt->input->cur + 3) <= ctxt->input->end))
@@ -7028,13 +6827,6 @@
         return;
 
     /*
-     * This is only for internal subset. On external entities,
-     * the replacement is done before parsing stage
-     */
-    if ((ctxt->external == 0) && (ctxt->inputNr == 1))
-	xmlParsePEReference(ctxt);
-
-    /*
      * Conditional sections are allowed from entities included
      * by PE References in the internal subset.
      */
@@ -7071,11 +6863,10 @@
 	return;
     }
 
-    if (!IS_BLANK_CH(CUR)) {
+    if (SKIP_BLANKS == 0) {
 	xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 		       "Space needed after '<?xml'\n");
     }
-    SKIP_BLANKS;
 
     /*
      * We may have the VersionInfo here.
@@ -7084,7 +6875,7 @@
     if (version == NULL)
 	version = xmlCharStrdup(XML_DEFAULT_VERSION);
     else {
-	if (!IS_BLANK_CH(CUR)) {
+	if (SKIP_BLANKS == 0) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 		           "Space needed here\n");
 	}
@@ -7175,27 +6966,19 @@
 
     ctxt->instate = XML_PARSER_DTD;
     ctxt->external = 1;
+    SKIP_BLANKS;
     while (((RAW == '<') && (NXT(1) == '?')) ||
            ((RAW == '<') && (NXT(1) == '!')) ||
-	   (RAW == '%') || IS_BLANK_CH(CUR)) {
+	   (RAW == '%')) {
 	const xmlChar *check = CUR_PTR;
 	unsigned int cons = ctxt->input->consumed;
 
 	GROW;
         if ((RAW == '<') && (NXT(1) == '!') && (NXT(2) == '[')) {
 	    xmlParseConditionalSections(ctxt);
-	} else if (IS_BLANK_CH(CUR)) {
-	    NEXT;
-	} else if (RAW == '%') {
-            xmlParsePEReference(ctxt);
 	} else
 	    xmlParseMarkupDecl(ctxt);
-
-	/*
-	 * Pop-up of finished entities.
-	 */
-	while ((RAW == 0) && (ctxt->inputNr > 1))
-	    xmlPopInput(ctxt);
+        SKIP_BLANKS;
 
 	if ((CUR_PTR == check) && (cons == ctxt->input->consumed)) {
 	    xmlFatalErr(ctxt, XML_ERR_EXT_SUBSET_NOT_FINISHED, NULL);
@@ -7429,6 +7212,9 @@
 	}
 	if (ent->checked == 0)
 	    ent->checked = 2;
+
+        /* Prevent entity from being parsed and expanded twice (Bug 760367). */
+        was_checked = 0;
     } else if (ent->checked != 1) {
 	ctxt->nbentities += ent->checked / 2;
     }
@@ -8071,12 +7857,14 @@
     NEXT;
     name = xmlParseName(ctxt);
     if (name == NULL) {
-	xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
-		       "xmlParsePEReference: no name\n");
+	xmlFatalErrMsg(ctxt, XML_ERR_PEREF_NO_NAME, "PEReference: no name\n");
 	return;
     }
+    if (xmlParserDebugEntities)
+	xmlGenericError(xmlGenericErrorContext,
+		"PEReference: %s\n", name);
     if (RAW != ';') {
-	xmlFatalErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, NULL);
+	xmlFatalErr(ctxt, XML_ERR_PEREF_SEMICOL_MISSING, NULL);
         return;
     }
 
@@ -8118,10 +7906,15 @@
 	     * ... The declaration of a parameter entity must
 	     * precede any reference to it...
 	     */
-	    xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY,
-			  "PEReference: %%%s; not found\n",
-			  name, NULL);
-	    ctxt->valid = 0;
+            if ((ctxt->validate) && (ctxt->vctxt.error != NULL)) {
+                xmlValidityError(ctxt, XML_WAR_UNDECLARED_ENTITY,
+                                 "PEReference: %%%s; not found\n",
+                                 name, NULL);
+            } else
+                xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY,
+                              "PEReference: %%%s; not found\n",
+                              name, NULL);
+            ctxt->valid = 0;
 	}
 	xmlParserEntityCheck(ctxt, 0, NULL, 0);
     } else {
@@ -8133,11 +7926,10 @@
 	    xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY,
 		  "Internal: %%%s; is not a parameter entity\n",
 			  name, NULL);
-	} else if (ctxt->input->free != deallocblankswrapper) {
-	    input = xmlNewBlanksWrapperInputStream(ctxt, entity);
-	    if (xmlPushInput(ctxt, input) < 0)
-		return;
 	} else {
+            xmlChar start[4];
+            xmlCharEncoding enc;
+
 	    if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) &&
 	        ((ctxt->options & XML_PARSE_NOENT) == 0) &&
 		((ctxt->options & XML_PARSE_DTDVALID) == 0) &&
@@ -8147,28 +7939,41 @@
 		(ctxt->validate == 0))
 		return;
 
-	    /*
-	     * TODO !!!
-	     * handle the extra spaces added before and after
-	     * c.f. http://www.w3.org/TR/REC-xml#as-PE
-	     */
 	    input = xmlNewEntityInputStream(ctxt, entity);
-	    if (xmlPushInput(ctxt, input) < 0)
+	    if (xmlPushInput(ctxt, input) < 0) {
+                xmlFreeInputStream(input);
 		return;
-	    if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) &&
-		(CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) &&
-		(IS_BLANK_CH(NXT(5)))) {
-		xmlParseTextDecl(ctxt);
-		if (ctxt->errNo ==
-		    XML_ERR_UNSUPPORTED_ENCODING) {
-		    /*
-		     * The XML REC instructs us to stop parsing
-		     * right here
-		     */
-		    xmlHaltParser(ctxt);
-		    return;
-		}
-	    }
+            }
+
+	    if (entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) {
+                /*
+                 * Get the 4 first bytes and decode the charset
+                 * if enc != XML_CHAR_ENCODING_NONE
+                 * plug some encoding conversion routines.
+                 * Note that, since we may have some non-UTF8
+                 * encoding (like UTF16, bug 135229), the 'length'
+                 * is not known, but we can calculate based upon
+                 * the amount of data in the buffer.
+                 */
+                GROW
+                if (ctxt->instate == XML_PARSER_EOF)
+                    return;
+                if ((ctxt->input->end - ctxt->input->cur)>=4) {
+                    start[0] = RAW;
+                    start[1] = NXT(1);
+                    start[2] = NXT(2);
+                    start[3] = NXT(3);
+                    enc = xmlDetectCharEncoding(start, 4);
+                    if (enc != XML_CHAR_ENCODING_NONE) {
+                        xmlSwitchEncoding(ctxt, enc);
+                    }
+                }
+
+                if ((CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) &&
+                    (IS_BLANK_CH(NXT(5)))) {
+                    xmlParseTextDecl(ctxt);
+                }
+            }
 	}
     }
     ctxt->hasPErefs = 1;
@@ -8490,7 +8295,8 @@
 	 * PEReferences.
 	 * Subsequence (markupdecl | PEReference | S)*
 	 */
-	while ((RAW != ']') && (ctxt->instate != XML_PARSER_EOF)) {
+	while (((RAW != ']') || (ctxt->inputNr > 1)) &&
+               (ctxt->instate != XML_PARSER_EOF)) {
 	    const xmlChar *check = CUR_PTR;
 	    unsigned int cons = ctxt->input->consumed;
 
@@ -8498,16 +8304,13 @@
 	    xmlParseMarkupDecl(ctxt);
 	    xmlParsePEReference(ctxt);
 
-	    /*
-	     * Pop-up of finished entities.
-	     */
-	    while ((RAW == 0) && (ctxt->inputNr > 1))
-		xmlPopInput(ctxt);
-
 	    if ((CUR_PTR == check) && (cons == ctxt->input->consumed)) {
 		xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR,
 	     "xmlParseInternalSubset: error detected in Markup declaration\n");
-		break;
+                if (ctxt->inputNr > 1)
+                    xmlPopInput(ctxt);
+                else
+		    break;
 	    }
 	}
 	if (RAW == ']') {
@@ -8585,7 +8388,7 @@
 	ctxt->instate = XML_PARSER_CONTENT;
     } else {
 	xmlFatalErrMsgStr(ctxt, XML_ERR_ATTRIBUTE_WITHOUT_VALUE,
-	       "Specification mandate value for attribute %s\n", name);
+	       "Specification mandates value for attribute %s\n", name);
 	return(NULL);
     }
 
@@ -8742,11 +8545,10 @@
 	GROW
 	if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>'))))
 	    break;
-	if (!IS_BLANK_CH(RAW)) {
+	if (SKIP_BLANKS == 0) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 			   "attributes construct error\n");
 	}
-	SKIP_BLANKS;
         if ((cons == ctxt->input->consumed) && (q == CUR_PTR) &&
             (attname == NULL) && (attvalue == NULL)) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR,
@@ -9318,7 +9120,7 @@
         ctxt->instate = XML_PARSER_CONTENT;
     } else {
         xmlFatalErrMsgStr(ctxt, XML_ERR_ATTRIBUTE_WITHOUT_VALUE,
-                          "Specification mandate value for attribute %s\n",
+                          "Specification mandates value for attribute %s\n",
                           name);
         return (NULL);
     }
@@ -9401,7 +9203,7 @@
     xmlChar *attvalue;
     const xmlChar **atts = ctxt->atts;
     int maxatts = ctxt->maxatts;
-    int nratts, nbatts, nbdef;
+    int nratts, nbatts, nbdef, inputid;
     int i, j, nbNs, attval;
     unsigned long cur;
     int nsNr = ctxt->nsNr;
@@ -9418,6 +9220,7 @@
      */
     SHRINK;
     cur = ctxt->input->cur - ctxt->input->base;
+    inputid = ctxt->input->id;
     nbatts = 0;
     nratts = 0;
     nbdef = 0;
@@ -9621,12 +9424,11 @@
             break;
 	if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>'))))
 	    break;
-	if (!IS_BLANK_CH(RAW)) {
+	if (SKIP_BLANKS == 0) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 			   "attributes construct error\n");
 	    break;
 	}
-	SKIP_BLANKS;
         if ((cons == ctxt->input->consumed) && (q == CUR_PTR) &&
             (attname == NULL) && (attvalue == NULL)) {
 	    xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR,
@@ -9636,6 +9438,13 @@
         GROW;
     }
 
+    if (ctxt->input->id != inputid) {
+        xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR,
+                    "Unexpected change of input\n");
+        localname = NULL;
+        goto done;
+    }
+
     /* Reconstruct attribute value pointers. */
     for (i = 0, j = 0; j < nratts; i += 5, j++) {
         if (atts[i+2] != NULL) {
@@ -9794,6 +9603,7 @@
 	                  nsname, 0, NULL, nbatts / 5, nbdef, atts);
     }
 
+done:
     /*
      * Free up attribute allocated strings if needed
      */
@@ -10072,11 +9882,6 @@
 	}
 
 	GROW;
-	/*
-	 * Pop-up of finished entities.
-	 */
-	while ((RAW == 0) && (ctxt->inputNr > 1))
-	    xmlPopInput(ctxt);
 	SHRINK;
 
 	if ((cons == ctxt->input->consumed) && (test == CUR_PTR)) {
@@ -11229,7 +11034,7 @@
  * Check that the block of characters is okay as SCdata content [20]
  *
  * Returns the number of bytes to pass if okay, a negative index where an
- *         UTF-8 error occured otherwise
+ *         UTF-8 error occurred otherwise
  */
 static int
 xmlCheckCdataPush(const xmlChar *utf, int len, int complete) {
@@ -11371,13 +11176,6 @@
 	if ((ctxt->errNo != XML_ERR_OK) && (ctxt->disableSAX == 1))
 	    return(0);
 
-
-	/*
-	 * Pop-up of finished entities.
-	 */
-	while ((RAW == 0) && (ctxt->inputNr > 1))
-	    xmlPopInput(ctxt);
-
 	if (ctxt->input == NULL) break;
 	if (ctxt->input->buf == NULL)
 	    avail = ctxt->input->length -
@@ -11728,11 +11526,6 @@
 		    ctxt->checkIndex = 0;
 		    xmlParseCharData(ctxt, 0);
 		}
-		/*
-		 * Pop-up of finished entities.
-		 */
-		while ((RAW == 0) && (ctxt->inputNr > 1))
-		    xmlPopInput(ctxt);
 		if ((cons == ctxt->input->consumed) && (test == CUR_PTR)) {
 		    xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR,
 		                "detected an error in element content\n");
@@ -12675,6 +12468,8 @@
         return;
     ctxt->instate = XML_PARSER_EOF;
     ctxt->disableSAX = 1;
+    while (ctxt->inputNr > 1)
+        xmlFreeInputStream(inputPop(ctxt));
     if (ctxt->input != NULL) {
         /*
 	 * in case there was a specific allocation deallocate before
@@ -12686,6 +12481,7 @@
 	}
 	ctxt->input->cur = BAD_CAST"";
 	ctxt->input->base = ctxt->input->cur;
+        ctxt->input->end = ctxt->input->cur;
     }
 }
 
@@ -13454,7 +13250,7 @@
     /*
      * And record the last error if any
      */
-    if (ctxt->lastError.code != XML_ERR_OK)
+    if ((oldctxt != NULL) && (ctxt->lastError.code != XML_ERR_OK))
         xmlCopyError(&ctxt->lastError, &oldctxt->lastError);
 
     if (sax != NULL)
diff --git a/third_party/libxml/src/parserInternals.c b/third_party/libxml/src/parserInternals.c
index 475d35b..eb902398 100644
--- a/third_party/libxml/src/parserInternals.c
+++ b/third_party/libxml/src/parserInternals.c
@@ -435,8 +435,6 @@
 
     if ((*ctxt->input->cur == 0) &&
         (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) {
-        if ((ctxt->instate != XML_PARSER_COMMENT))
-            xmlPopInput(ctxt);
         return;
     }
 
@@ -523,8 +521,6 @@
             ctxt->input->cur++;
 
         ctxt->nbChars++;
-        if (*ctxt->input->cur == 0)
-            xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
     } else {
         /*
          * Assume it's a fixed length encoding (1) with
@@ -538,14 +534,9 @@
             ctxt->input->col++;
         ctxt->input->cur++;
         ctxt->nbChars++;
-        if (*ctxt->input->cur == 0)
-            xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
     }
-    if ((*ctxt->input->cur == '%') && (!ctxt->html))
-        xmlParserHandlePEReference(ctxt);
-    if ((*ctxt->input->cur == 0) &&
-        (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0))
-        xmlPopInput(ctxt);
+    if (*ctxt->input->cur == 0)
+        xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
     return;
 encoding_error:
     /*
@@ -1244,11 +1235,7 @@
 	    input->buf->rawconsumed += use - xmlBufUse(input->buf->raw);
         }
         return (0);
-    } else if (input->length == 0) {
-	/*
-	 * When parsing a static memory array one must know the
-	 * size to be able to convert the buffer.
-	 */
+    } else {
 	xmlErrInternal(ctxt, "switching encoding : no input\n", NULL);
 	return (-1);
     }
diff --git a/third_party/libxml/src/runtest.c b/third_party/libxml/src/runtest.c
index dcf1405d..714de275 100644
--- a/third_party/libxml/src/runtest.c
+++ b/third_party/libxml/src/runtest.c
@@ -23,6 +23,7 @@
 #include <fcntl.h>
 
 #include <libxml/parser.h>
+#include <libxml/parserInternals.h>
 #include <libxml/tree.h>
 #include <libxml/uri.h>
 
@@ -1677,7 +1678,6 @@
 static xmlSAXHandlerPtr debugHTMLSAXHandler = &debugHTMLSAXHandlerStruct;
 #endif /* LIBXML_HTML_ENABLED */
 
-#ifdef LIBXML_SAX1_ENABLED
 /**
  * saxParseTest:
  * @filename: the file to parse
@@ -1718,7 +1718,15 @@
 	ret = 0;
     } else
 #endif
-    ret = xmlSAXUserParseFile(emptySAXHandler, NULL, filename);
+    {
+        xmlParserCtxtPtr ctxt = xmlCreateFileParserCtxt(filename);
+        memcpy(ctxt->sax, emptySAXHandler, sizeof(xmlSAXHandler));
+        xmlCtxtUseOptions(ctxt, options);
+        xmlParseDocument(ctxt);
+        ret = ctxt->wellFormed ? 0 : ctxt->errNo;
+        xmlFreeDoc(ctxt->myDoc);
+        xmlFreeParserCtxt(ctxt);
+    }
     if (ret == XML_WAR_UNDECLARED_ENTITY) {
         fprintf(SAXdebug, "xmlSAXUserParseFile returned error %d\n", ret);
         ret = 0;
@@ -1734,10 +1742,19 @@
 	ret = 0;
     } else
 #endif
-    if (options & XML_PARSE_SAX1) {
-	ret = xmlSAXUserParseFile(debugSAXHandler, NULL, filename);
-    } else {
-	ret = xmlSAXUserParseFile(debugSAX2Handler, NULL, filename);
+    {
+        xmlParserCtxtPtr ctxt = xmlCreateFileParserCtxt(filename);
+        if (options & XML_PARSE_SAX1) {
+            memcpy(ctxt->sax, debugSAXHandler, sizeof(xmlSAXHandler));
+            options -= XML_PARSE_SAX1;
+        } else {
+            memcpy(ctxt->sax, debugSAX2Handler, sizeof(xmlSAXHandler));
+        }
+        xmlCtxtUseOptions(ctxt, options);
+        xmlParseDocument(ctxt);
+        ret = ctxt->wellFormed ? 0 : ctxt->errNo;
+        xmlFreeDoc(ctxt->myDoc);
+        xmlFreeParserCtxt(ctxt);
     }
     if (ret == XML_WAR_UNDECLARED_ENTITY) {
         fprintf(SAXdebug, "xmlSAXUserParseFile returned error %d\n", ret);
@@ -1761,7 +1778,6 @@
 
     return(ret);
 }
-#endif
 
 /************************************************************************
  *									*
@@ -2147,7 +2163,8 @@
 }
 static int
 streamProcessTest(const char *filename, const char *result, const char *err,
-                  xmlTextReaderPtr reader, const char *rng, int options) {
+                  xmlTextReaderPtr reader, const char *rng,
+                  int options ATTRIBUTE_UNUSED) {
     int ret;
     char *temp = NULL;
     FILE *t = NULL;
@@ -3922,7 +3939,7 @@
     return(c14nCommonTest(filename, 0, XML_C14N_1_1, "1-1-without-comments"));
 }
 #endif
-#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED) && defined (LIBXML_SAX1_ENABLED)
+#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED)
 /************************************************************************
  *									*
  *			Catalog and threads test			*
@@ -3969,7 +3986,11 @@
         xmlDoValidityCheckingDefaultValue = 1;
         xmlGenericErrorContext = stderr;
     }
+#ifdef LIBXML_SAX1_ENABLED
     myDoc = xmlParseFile(filename);
+#else
+    myDoc = xmlReadFile(filename, NULL, XML_WITH_CATALOG);
+#endif
     if (myDoc) {
         xmlFreeDoc(myDoc);
     } else {
@@ -4243,10 +4264,13 @@
     { "SAX1 callbacks regression tests" ,
       saxParseTest, "./test/*", "result/", ".sax", NULL,
       XML_PARSE_SAX1 },
+#endif
     { "SAX2 callbacks regression tests" ,
       saxParseTest, "./test/*", "result/", ".sax2", NULL,
       0 },
-#endif
+    { "SAX2 callbacks regression tests with entity substitution" ,
+      saxParseTest, "./test/*", "result/noent/", ".sax2", NULL,
+      XML_PARSE_NOENT },
 #ifdef LIBXML_PUSH_ENABLED
     { "XML push regression tests" ,
       pushParseTest, "./test/*", "result/", "", NULL,
@@ -4261,12 +4285,10 @@
       pushParseTest, "./test/HTML/*", "result/HTML/", "", ".err",
       XML_PARSE_HTML },
 #endif
-#ifdef LIBXML_SAX1_ENABLED
     { "HTML SAX regression tests" ,
       saxParseTest, "./test/HTML/*", "result/HTML/", ".sax", NULL,
       XML_PARSE_HTML },
 #endif
-#endif
 #ifdef LIBXML_VALID_ENABLED
     { "Valid documents regression tests" ,
       errParseTest, "./test/VCM/*", NULL, NULL, NULL,
@@ -4369,7 +4391,7 @@
       c14n11WithoutCommentTest, "./test/c14n/1-1-without-comments/*.xml", NULL, NULL, NULL,
       0 },
 #endif
-#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_SAX1_ENABLED)
+#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED)
     { "Catalog and Threads regression tests" ,
       threadsTest, NULL, NULL, NULL, NULL,
       0 },
diff --git a/third_party/libxml/src/testThreads.c b/third_party/libxml/src/testThreads.c
index bff5391..2ef70a7 100644
--- a/third_party/libxml/src/testThreads.c
+++ b/third_party/libxml/src/testThreads.c
@@ -3,7 +3,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 
-#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_SAX1_ENABLED)
+#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED)
 #include <libxml/globals.h>
 #include <libxml/threads.h>
 #include <libxml/parser.h>
@@ -61,7 +61,11 @@
         xmlDoValidityCheckingDefaultValue = 1;
         xmlGenericErrorContext = stderr;
     }
+#ifdef LIBXML_SAX1_ENABLED
     myDoc = xmlParseFile(filename);
+#else
+    myDoc = xmlReadFile(filename, NULL, XML_WITH_CATALOG);
+#endif
     if (myDoc) {
         xmlFreeDoc(myDoc);
     } else {
diff --git a/third_party/libxml/src/threads.c b/third_party/libxml/src/threads.c
index b9d6cae..8c57263 100644
--- a/third_party/libxml/src/threads.c
+++ b/third_party/libxml/src/threads.c
@@ -50,43 +50,23 @@
 #if defined(__GNUC__) && defined(__GLIBC__)
 #ifdef linux
 #if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (__GNUC__ > 3)
-extern int pthread_once (pthread_once_t *__once_control,
-                         void (*__init_routine) (void))
-	   __attribute((weak));
-extern void *pthread_getspecific (pthread_key_t __key)
-	   __attribute((weak));
-extern int pthread_setspecific (pthread_key_t __key,
-                                __const void *__pointer)
-	   __attribute((weak));
-extern int pthread_key_create (pthread_key_t *__key,
-                               void (*__destr_function) (void *))
-	   __attribute((weak));
-extern int pthread_key_delete (pthread_key_t __key)
-	   __attribute((weak));
-extern int pthread_mutex_init ()
-	   __attribute((weak));
-extern int pthread_mutex_destroy ()
-	   __attribute((weak));
-extern int pthread_mutex_lock ()
-	   __attribute((weak));
-extern int pthread_mutex_unlock ()
-	   __attribute((weak));
-extern int pthread_cond_init ()
-	   __attribute((weak));
-extern int pthread_cond_destroy ()
-	   __attribute((weak));
-extern int pthread_cond_wait ()
-	   __attribute((weak));
-extern int pthread_equal ()
-	   __attribute((weak));
-extern pthread_t pthread_self ()
-	   __attribute((weak));
-extern int pthread_key_create ()
-	   __attribute((weak));
-extern int pthread_key_delete ()
-	   __attribute((weak));
-extern int pthread_cond_signal ()
-	   __attribute((weak));
+#pragma weak pthread_once
+#pragma weak pthread_getspecific
+#pragma weak pthread_setspecific
+#pragma weak pthread_key_create
+#pragma weak pthread_key_delete
+#pragma weak pthread_mutex_init
+#pragma weak pthread_mutex_destroy
+#pragma weak pthread_mutex_lock
+#pragma weak pthread_mutex_unlock
+#pragma weak pthread_cond_init
+#pragma weak pthread_cond_destroy
+#pragma weak pthread_cond_wait
+#pragma weak pthread_equal
+#pragma weak pthread_self
+#pragma weak pthread_key_create
+#pragma weak pthread_key_delete
+#pragma weak pthread_cond_signal
 #endif
 #endif /* linux */
 #endif /* defined(__GNUC__) && defined(__GLIBC__) */
diff --git a/third_party/libxml/src/tree.c b/third_party/libxml/src/tree.c
index e154ec0..572185e 100644
--- a/third_party/libxml/src/tree.c
+++ b/third_party/libxml/src/tree.c
@@ -254,10 +254,10 @@
  *
  * [NS 7] LocalPart ::= NCName
  *
- * Returns NULL if not a QName, otherwise the local part, and prefix
- *   is updated to get the Prefix if any.
+ * Returns NULL if the name doesn't have a prefix. Otherwise, returns the
+ * local part, and prefix is updated to get the Prefix. Both the return value
+ * and the prefix must be freed by the caller.
  */
-
 xmlChar *
 xmlSplitQName2(const xmlChar *name, xmlChar **prefix) {
     int len = 0;
diff --git a/third_party/libxml/src/valid.c b/third_party/libxml/src/valid.c
index c51ea29..4df09e4 100644
--- a/third_party/libxml/src/valid.c
+++ b/third_party/libxml/src/valid.c
@@ -5738,7 +5738,7 @@
 	xmlElementPtr elemDecl;
 
 	/*
-	 * Check the new element agaisnt the content model of the new elem.
+	 * Check the new element against the content model of the new elem.
 	 */
 	if (state->elemDecl != NULL) {
 	    elemDecl = state->elemDecl;
@@ -5830,7 +5830,7 @@
 	xmlElementPtr elemDecl;
 
 	/*
-	 * Check the new element agaisnt the content model of the new elem.
+	 * Check the new element against the content model of the new elem.
 	 */
 	if (state->elemDecl != NULL) {
 	    elemDecl = state->elemDecl;
@@ -5904,7 +5904,7 @@
 	xmlElementPtr elemDecl;
 
 	/*
-	 * Check the new element agaisnt the content model of the new elem.
+	 * Check the new element against the content model of the new elem.
 	 */
 	if (state->elemDecl != NULL) {
 	    elemDecl = state->elemDecl;
diff --git a/third_party/libxml/src/xmlIO.c b/third_party/libxml/src/xmlIO.c
index 8c6509dd..c699d52 100644
--- a/third_party/libxml/src/xmlIO.c
+++ b/third_party/libxml/src/xmlIO.c
@@ -1286,7 +1286,7 @@
  *
  * Read @len bytes to @buffer from the compressed I/O channel.
  *
- * Returns the number of bytes written
+ * Returns the number of bytes read.
  */
 static int
 xmlGzfileRead (void * context, char * buffer, int len) {
@@ -1876,7 +1876,7 @@
  */
 
 void *
-xmlIOHTTPOpenW(const char *post_uri, int compression)
+xmlIOHTTPOpenW(const char *post_uri, int compression ATTRIBUTE_UNUSED)
 {
 
     xmlIOHTTPWriteCtxtPtr ctxt = NULL;
diff --git a/third_party/libxml/src/xmlmemory.c b/third_party/libxml/src/xmlmemory.c
index 58de2eda..64003959 100644
--- a/third_party/libxml/src/xmlmemory.c
+++ b/third_party/libxml/src/xmlmemory.c
@@ -111,7 +111,7 @@
 
 #define MAX_SIZE_T ((size_t)-1)
 
-#define CLIENT_2_HDR(a) ((MEMHDR *) (((char *) (a)) - RESERVE_SIZE))
+#define CLIENT_2_HDR(a) ((void *) (((char *) (a)) - RESERVE_SIZE))
 #define HDR_2_CLIENT(a)    ((void *) (((char *) (a)) + RESERVE_SIZE))
 
 
diff --git a/third_party/libxml/src/xmlreader.c b/third_party/libxml/src/xmlreader.c
index f285790b..34c4c6b 100644
--- a/third_party/libxml/src/xmlreader.c
+++ b/third_party/libxml/src/xmlreader.c
@@ -3982,7 +3982,7 @@
  * pattern. The caller must also use xmlTextReaderCurrentDoc() to
  * keep an handle on the resulting document once parsing has finished
  *
- * Returns a positive number in case of success and -1 in case of error
+ * Returns a non-negative number in case of success and -1 in case of error
  */
 int
 xmlTextReaderPreservePattern(xmlTextReaderPtr reader, const xmlChar *pattern,
diff --git a/third_party/libxml/src/xmlstring.c b/third_party/libxml/src/xmlstring.c
index 9e704a9..780c6435 100644
--- a/third_party/libxml/src/xmlstring.c
+++ b/third_party/libxml/src/xmlstring.c
@@ -440,8 +440,8 @@
  * first bytes of @add. Note that if @len < 0 then this is an API error
  * and NULL will be returned.
  *
- * Returns a new xmlChar *, the original @cur is reallocated if needed
- * and should not be freed
+ * Returns a new xmlChar *, the original @cur is reallocated and should
+ * not be freed.
  */
 
 xmlChar *
@@ -519,7 +519,8 @@
  * encoded in UTF-8 or an encoding with 8bit based chars, we assume
  * a termination mark of '0'.
  *
- * Returns a new xmlChar * containing the concatenated string.
+ * Returns a new xmlChar * containing the concatenated string. The original
+ * @cur is reallocated and should not be freed.
  */
 xmlChar *
 xmlStrcat(xmlChar *cur, const xmlChar *add) {
@@ -822,7 +823,7 @@
  * @len:  the number of characters in the array
  *
  * storage size of an UTF8 string
- * the behaviour is not garanteed if the input string is not UTF-8
+ * the behaviour is not guaranteed if the input string is not UTF-8
  *
  * Returns the storage size of
  * the first 'len' characters of ARRAY
diff --git a/third_party/mach_override/README.chromium b/third_party/mach_override/README.chromium
index 4c72b62..9206bde9 100644
--- a/third_party/mach_override/README.chromium
+++ b/third_party/mach_override/README.chromium
@@ -18,4 +18,4 @@
 
 Local Modifications: Sped up allocation of branch island memory via usage of
    vm_region to skip already allocated pages; add diagnostics for allocation
-   attempts.
+   attempts. Catch allocation attempts on restricted pages.
diff --git a/third_party/mach_override/chromium.patch b/third_party/mach_override/chromium.patch
index f125e1c..8a6abee 100644
--- a/third_party/mach_override/chromium.patch
+++ b/third_party/mach_override/chromium.patch
@@ -1,5 +1,5 @@
 diff --git a/third_party/mach_override/mach_override.c b/third_party/mach_override/mach_override.c
-index 85a75e5c2067..0232359582d4 100644
+index 85a75e5c2067..ca68c0e90e61 100644
 --- a/third_party/mach_override/mach_override.c
 +++ b/third_party/mach_override/mach_override.c
 @@ -8,6 +8,7 @@
@@ -27,10 +27,11 @@
  
  char kIslandTemplate[] = {
  	// kOriginalInstructionsSize nop instructions so that we 
-@@ -94,6 +96,14 @@ typedef	struct	{
+@@ -93,6 +95,14 @@ typedef	struct	{
+ 	int		allocatedHigh;
  }	BranchIsland;
  
- /**************************
++/**************************
 +*
 +*	Statistics
 +*
@@ -38,10 +39,9 @@
 +static volatile int64_t __attribute__((__aligned__((sizeof(int64_t)))))
 +    g_mach_override_allocation_attempts = 0;
 +
-+/**************************
+ /**************************
  *	
  *	Funky Protos
- *	
 @@ -101,6 +111,10 @@ typedef	struct	{
  #pragma mark	-
  #pragma mark	(Funky Protos)
@@ -113,7 +113,8 @@
  			err = vm_allocate( task_self, &page, PAGE_SIZE, 0 );
  			if( err == err_none )
  				allocated = 1;
- 			else if( err == KERN_NO_SPACE ) {
+-			else if( err == KERN_NO_SPACE ) {
++			else if( err == KERN_NO_SPACE || err == KERN_INVALID_ADDRESS) {
  #if defined(__x86_64__)
 -				page -= PAGE_SIZE;
 +				// This memory region is not suitable, skip it:
diff --git a/third_party/mach_override/mach_override.c b/third_party/mach_override/mach_override.c
index 0232359..ca68c0e 100644
--- a/third_party/mach_override/mach_override.c
+++ b/third_party/mach_override/mach_override.c
@@ -443,7 +443,7 @@
 			err = vm_allocate( task_self, &page, PAGE_SIZE, 0 );
 			if( err == err_none )
 				allocated = 1;
-			else if( err == KERN_NO_SPACE ) {
+			else if( err == KERN_NO_SPACE || err == KERN_INVALID_ADDRESS) {
 #if defined(__x86_64__)
 				// This memory region is not suitable, skip it:
 				vm_size_t region_size;
diff --git a/tools/clang/base_bind_rewriters/BaseBindRewriters.cpp b/tools/clang/base_bind_rewriters/BaseBindRewriters.cpp
index 5d4fc132..e74db14 100644
--- a/tools/clang/base_bind_rewriters/BaseBindRewriters.cpp
+++ b/tools/clang/base_bind_rewriters/BaseBindRewriters.cpp
@@ -1,9 +1,6 @@
 // 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.
-//
-// This file containts a clang tool to update base::Bind() callers:
-//  * Remove unneeded scoped_refptr<>::get() on method binding.
 
 #include <assert.h>
 #include <algorithm>
@@ -45,14 +42,16 @@
       : replacements_(replacements) {}
 
   StatementMatcher GetMatcher() {
-    auto is_once_callback = hasType(classTemplateSpecializationDecl(
-        hasName("::base::Callback"),
-        hasTemplateArgument(1, equalsIntegralValue("0")),
-        hasTemplateArgument(2, equalsIntegralValue("0"))));
-    auto is_repeating_callback = hasType(classTemplateSpecializationDecl(
-        hasName("::base::Callback"),
-        hasTemplateArgument(1, equalsIntegralValue("1")),
-        hasTemplateArgument(2, equalsIntegralValue("1"))));
+    auto is_once_callback =
+        hasType(hasCanonicalType(hasDeclaration(classTemplateSpecializationDecl(
+            hasName("::base::Callback"),
+            hasTemplateArgument(1, equalsIntegralValue("0")),
+            hasTemplateArgument(2, equalsIntegralValue("0"))))));
+    auto is_repeating_callback =
+        hasType(hasCanonicalType(hasDeclaration(classTemplateSpecializationDecl(
+            hasName("::base::Callback"),
+            hasTemplateArgument(1, equalsIntegralValue("1")),
+            hasTemplateArgument(2, equalsIntegralValue("1"))))));
 
     auto bind_call =
         callExpr(callee(namedDecl(hasName("::base::Bind")))).bind("target");
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index b59765eb3..ec2963c 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -27,7 +27,7 @@
 # Do NOT CHANGE this if you don't know what you're doing -- see
 # https://chromium.googlesource.com/chromium/src/+/master/docs/updating_clang.md
 # Reverting problematic clang rolls is safe, though.
-CLANG_REVISION = '309984'
+CLANG_REVISION = '310694'
 
 use_head_revision = 'LLVM_FORCE_HEAD_REVISION' in os.environ
 if use_head_revision:
diff --git a/tools/idl_parser/idl_parser_test.py b/tools/idl_parser/idl_parser_test.py
index 8460568..0eed650 100755
--- a/tools/idl_parser/idl_parser_test.py
+++ b/tools/idl_parser/idl_parser_test.py
@@ -9,6 +9,7 @@
 from idl_lexer import IDLLexer
 from idl_parser import IDLParser, ParseFile
 
+
 def ParseCommentTest(comment):
   comment = comment.strip()
   comments = comment.split(None, 1)
@@ -16,6 +17,7 @@
 
 
 class WebIDLParser(unittest.TestCase):
+
   def setUp(self):
     self.parser = IDLParser(IDLLexer(), mute_error=True)
     self.filenames = glob.glob('test_parser/*_web.idl')
@@ -36,7 +38,8 @@
       if check == 'TREE':
         quick = '\n'.join(node.Tree())
         lineno = node.GetProperty('LINENO')
-        msg = 'Mismatched tree at line %d:\n%sVS\n%s' % (lineno, value, quick)
+        msg = 'Mismatched tree at line %d:\n%sVS\n%s' % (
+            lineno, value, quick)
         self.assertEqual(value, quick, msg)
 
   def testExpectedNodes(self):
@@ -51,6 +54,7 @@
 
 
 class TestImplements(unittest.TestCase):
+
   def setUp(self):
     self.parser = IDLParser(IDLLexer(), mute_error=True)
 
@@ -98,5 +102,37 @@
                      error_message)
 
 
+class TestEnums(unittest.TestCase):
+
+  def setUp(self):
+    self.parser = IDLParser(IDLLexer(), mute_error=True)
+
+  def _ParseEnums(self, idl_text):
+    filenode = self.parser.ParseText(
+        filename='', data=idl_text)
+    self.assertEqual(1, len(filenode.GetChildren()))
+    return filenode.GetChildren()[0]
+
+  def testBasic(self):
+    idl_text = 'enum MealType { "rice", "noodles", "other" };'
+    node = self._ParseEnums(idl_text)
+    children = node.GetChildren()
+    self.assertEqual('Enum', node.GetClass())
+    self.assertEqual(3, len(children))
+    self.assertEqual('EnumItem', children[0].GetClass())
+    self.assertEqual('rice', children[0].GetName())
+    self.assertEqual('EnumItem', children[1].GetClass())
+    self.assertEqual('noodles', children[1].GetName())
+    self.assertEqual('EnumItem', children[2].GetClass())
+    self.assertEqual('other', children[2].GetName())
+
+  def testErrorMissingName(self):
+    idl_txt = 'enum {"rice","noodles","other"};'
+    node = self._ParseEnums(idl_txt)
+    self.assertEqual('Error', node.GetClass())
+    error_message = node.GetName()
+    self.assertEqual('Enum missing name.', error_message)
+
+
 if __name__ == '__main__':
   unittest.main(verbosity=2)
diff --git a/tools/idl_parser/test_parser/enum_web.idl b/tools/idl_parser/test_parser/enum_web.idl
index ef0abaf..da84cb7 100644
--- a/tools/idl_parser/test_parser/enum_web.idl
+++ b/tools/idl_parser/test_parser/enum_web.idl
@@ -26,29 +26,6 @@
 */
 
 /** TREE
- *Enum(MealType1)
- *  EnumItem(rice)
- *  EnumItem(noodles)
- *  EnumItem(other)
-*/
-enum MealType1 {
-  /** BUILD EnumItem (rice) */
-  "rice",
-  /** BUILD EnumItem (noodles) */
-  "noodles",
-  /** BUILD EnumItem(other) */
-  "other"
-};
-
-/** BUILD Error(Enum missing name.) */
-/** ERROR Enum missing name. */
-enum {
-  "rice",
-  "noodles",
-  "other"
-};
-
-/** TREE
  *Enum(MealType2)
  *  EnumItem(rice)
  *  EnumItem(noodles)
diff --git a/tools/json_schema_compiler/test/features_generation_unittest.cc b/tools/json_schema_compiler/test/features_generation_unittest.cc
index 28a90ed..81ab003 100644
--- a/tools/json_schema_compiler/test/features_generation_unittest.cc
+++ b/tools/json_schema_compiler/test/features_generation_unittest.cc
@@ -35,7 +35,7 @@
   explicit FeatureComparator(const std::string& name);
   ~FeatureComparator();
 
-  void CompareFeature(SimpleFeature* feature);
+  void CompareFeature(const SimpleFeature* feature);
 
   std::string name;
   std::vector<std::string> blacklist;
@@ -66,7 +66,7 @@
 
 FeatureComparator::~FeatureComparator() {}
 
-void FeatureComparator::CompareFeature(SimpleFeature* feature) {
+void FeatureComparator::CompareFeature(const SimpleFeature* feature) {
   ASSERT_TRUE(feature);
   EXPECT_EQ(name, feature->name());
   ExpectVectorsEqual(blacklist, feature->blacklist(), name);
@@ -95,22 +95,22 @@
   CompilerTestFeatureProvider provider;
 
   auto GetAsSimpleFeature = [&provider](const std::string& name) {
-    Feature* feature = provider.GetFeature(name);
+    const Feature* feature = provider.GetFeature(name);
     // Shame we can't test this more safely, but if our feature is declared as
     // the wrong class, things should blow up in a spectacular fashion.
-    return static_cast<SimpleFeature*>(feature);
+    return static_cast<const SimpleFeature*>(feature);
   };
 
   auto GetAsComplexFeature = [&provider](const std::string& name) {
-    Feature* feature = provider.GetFeature(name);
+    const Feature* feature = provider.GetFeature(name);
     // Shame we can't test this more safely, but if our feature is declared as
     // the wrong class, things should blow up in a spectacular fashion.
-    return static_cast<ComplexFeature*>(feature);
+    return static_cast<const ComplexFeature*>(feature);
   };
 
   // Check some simple features for accuracy.
   {
-    SimpleFeature* feature = GetAsSimpleFeature("alpha");
+    const SimpleFeature* feature = GetAsSimpleFeature("alpha");
     FeatureComparator comparator("alpha");
     comparator.dependencies = {"permission:alpha"};
     comparator.contexts = {Feature::BLESSED_EXTENSION_CONTEXT};
@@ -120,7 +120,7 @@
     comparator.CompareFeature(feature);
   }
   {
-    SimpleFeature* feature = GetAsSimpleFeature("beta");
+    const SimpleFeature* feature = GetAsSimpleFeature("beta");
     FeatureComparator comparator("beta");
     comparator.contexts = {Feature::BLESSED_EXTENSION_CONTEXT};
     comparator.channel.reset(
@@ -134,7 +134,7 @@
     comparator.CompareFeature(feature);
   }
   {
-    SimpleFeature* feature = GetAsSimpleFeature("gamma");
+    const SimpleFeature* feature = GetAsSimpleFeature("gamma");
     FeatureComparator comparator("gamma");
     comparator.channel.reset(
         new version_info::Channel(version_info::Channel::BETA));
@@ -157,7 +157,7 @@
   {
     // Features that specify 'noparent' should not inherit features from any
     // other feature.
-    SimpleFeature* feature = GetAsSimpleFeature("gamma.unparented");
+    const SimpleFeature* feature = GetAsSimpleFeature("gamma.unparented");
     FeatureComparator comparator("gamma.unparented");
     comparator.blacklist = {"ddd"};
     comparator.contexts = {Feature::UNBLESSED_EXTENSION_CONTEXT};
@@ -166,7 +166,7 @@
     comparator.CompareFeature(feature);
   }
   {
-    ComplexFeature* complex_feature =
+    const ComplexFeature* complex_feature =
         GetAsComplexFeature("gamma.complex_unparented");
     FeatureComparator comparator("gamma.complex_unparented");
     comparator.contexts = {Feature::UNBLESSED_EXTENSION_CONTEXT};
@@ -178,7 +178,7 @@
       comparator.CompareFeature(static_cast<SimpleFeature*>(feature.get()));
   }
   {
-    SimpleFeature* feature = GetAsSimpleFeature("delta");
+    const SimpleFeature* feature = GetAsSimpleFeature("delta");
     FeatureComparator comparator("delta");
     comparator.contexts = {Feature::BLESSED_EXTENSION_CONTEXT,
                            Feature::WEBUI_CONTEXT};
@@ -190,7 +190,7 @@
     comparator.CompareFeature(feature);
   }
   {
-    SimpleFeature* feature = GetAsSimpleFeature("allEnum");
+    const SimpleFeature* feature = GetAsSimpleFeature("allEnum");
     FeatureComparator comparator("allEnum");
     comparator.contexts = {Feature::BLESSED_EXTENSION_CONTEXT,
                            Feature::BLESSED_WEB_PAGE_CONTEXT,
@@ -210,7 +210,7 @@
   }
   {
     // Omega is imported from a second .json file.
-    SimpleFeature* feature = GetAsSimpleFeature("omega");
+    const SimpleFeature* feature = GetAsSimpleFeature("omega");
     FeatureComparator comparator("omega");
     comparator.contexts = {Feature::WEB_PAGE_CONTEXT};
     comparator.channel.reset(
@@ -220,24 +220,24 @@
   }
   {
     // Features specifying 'nocompile' should not be generated at all.
-    SimpleFeature* feature = GetAsSimpleFeature("uncompiled");
+    const SimpleFeature* feature = GetAsSimpleFeature("uncompiled");
     EXPECT_FALSE(feature);
   }
 
   // Test complex features.
   {
-    ComplexFeature* feature = GetAsComplexFeature("complex");
+    const ComplexFeature* feature = GetAsComplexFeature("complex");
     ASSERT_TRUE(feature);
     EXPECT_EQ(2u, feature->features_.size());
     // Find the default parent. This is a little tedious because it might not
     // be guaranteed that the default_parent is in a specific index, but it
     // specifies channel as 'stable'.
-    SimpleFeature* default_parent = nullptr;
-    SimpleFeature* other_parent = nullptr;
+    const SimpleFeature* default_parent = nullptr;
+    const SimpleFeature* other_parent = nullptr;
     {
-      SimpleFeature* parent1 =
+      const SimpleFeature* parent1 =
           static_cast<SimpleFeature*>(feature->features_[0].get());
-      SimpleFeature* parent2 =
+      const SimpleFeature* parent2 =
           static_cast<SimpleFeature*>(feature->features_[1].get());
       if (parent1->channel() == version_info::Channel::STABLE) {
         default_parent = parent1;
@@ -257,7 +257,7 @@
       comparator.CompareFeature(default_parent);
       // Check the child of the complex feature. It should inherit its
       // properties from the default parent.
-      SimpleFeature* child_feature = GetAsSimpleFeature("complex.child");
+      const SimpleFeature* child_feature = GetAsSimpleFeature("complex.child");
       comparator.name = "complex.child";
       comparator.platforms = {Feature::WIN_PLATFORM};
       comparator.dependencies = {"permission:complex.child"};
@@ -277,7 +277,7 @@
 
   // Test API aliases.
   {
-    SimpleFeature* feature = GetAsSimpleFeature("alias");
+    const SimpleFeature* feature = GetAsSimpleFeature("alias");
     FeatureComparator comparator("alias");
     comparator.contexts = {Feature::BLESSED_EXTENSION_CONTEXT};
     comparator.channel.reset(
@@ -286,7 +286,7 @@
     comparator.CompareFeature(feature);
   }
   {
-    SimpleFeature* feature = GetAsSimpleFeature("alias_source");
+    const SimpleFeature* feature = GetAsSimpleFeature("alias_source");
     FeatureComparator comparator("alias_source");
     comparator.contexts = {Feature::BLESSED_EXTENSION_CONTEXT};
     comparator.channel.reset(
@@ -295,37 +295,37 @@
     comparator.CompareFeature(feature);
   }
   {
-    Feature* feature = provider.GetFeature("complex_alias");
+    const Feature* feature = provider.GetFeature("complex_alias");
     ASSERT_EQ("", feature->alias());
     ASSERT_EQ("complex_alias_source", feature->source());
   }
   {
-    Feature* feature = provider.GetFeature("complex_alias_source");
+    const Feature* feature = provider.GetFeature("complex_alias_source");
     ASSERT_EQ("complex_alias", feature->alias());
     ASSERT_EQ("", feature->source());
   }
   {
-    Feature* feature = provider.GetFeature("parent_source");
+    const Feature* feature = provider.GetFeature("parent_source");
     ASSERT_EQ("parent_source_alias", feature->alias());
     ASSERT_EQ("", feature->source());
   }
   {
-    Feature* feature = provider.GetFeature("parent_source.child");
+    const Feature* feature = provider.GetFeature("parent_source.child");
     ASSERT_EQ("parent_source_alias", feature->alias());
     ASSERT_EQ("", feature->source());
   }
   {
-    Feature* feature = provider.GetFeature("parent_source.child_source");
+    const Feature* feature = provider.GetFeature("parent_source.child_source");
     ASSERT_EQ("parent_source_child_alias", feature->alias());
     ASSERT_EQ("", feature->source());
   }
   {
-    Feature* feature = provider.GetFeature("alias_parent");
+    const Feature* feature = provider.GetFeature("alias_parent");
     ASSERT_EQ("", feature->alias());
     ASSERT_EQ("", feature->source());
   }
   {
-    Feature* feature = provider.GetFeature("alias_parent.child");
+    const Feature* feature = provider.GetFeature("alias_parent.child");
     ASSERT_EQ("", feature->alias());
     ASSERT_EQ("child_source", feature->source());
   }
diff --git a/tools/luci-go/linux64/isolate.sha1 b/tools/luci-go/linux64/isolate.sha1
index acecc79..f923147 100644
--- a/tools/luci-go/linux64/isolate.sha1
+++ b/tools/luci-go/linux64/isolate.sha1
@@ -1 +1 @@
-21410c557b49620e8a44ec0f861f94605bdc6d5c
+48ffe036be8eff7d39ebbdbb705bd26f0ec6f404
diff --git a/tools/luci-go/mac64/isolate.sha1 b/tools/luci-go/mac64/isolate.sha1
index 16a7dd6a..328cc06 100644
--- a/tools/luci-go/mac64/isolate.sha1
+++ b/tools/luci-go/mac64/isolate.sha1
@@ -1 +1 @@
-1966687828a068eee4c5da45bbb8afd91cddda6f
+f0d9ea71e7059a164962658b588286ebf262c5dd
diff --git a/tools/luci-go/win64/isolate.exe.sha1 b/tools/luci-go/win64/isolate.exe.sha1
index 6f5491d..8038c79 100644
--- a/tools/luci-go/win64/isolate.exe.sha1
+++ b/tools/luci-go/win64/isolate.exe.sha1
@@ -1 +1 @@
-35482264cea0f9b9dd2efe0a01620557fc15b7c1
+40790017e9b7856009c36768bf9244a4182ad5d1
diff --git a/tools/mb/docs/user_guide.md b/tools/mb/docs/user_guide.md
index d31ea67..0abb235 100644
--- a/tools/mb/docs/user_guide.md
+++ b/tools/mb/docs/user_guide.md
@@ -167,6 +167,18 @@
 This is mostly useful as a presubmit check and for verifying changes to
 the config file.
 
+### `mb gerrit-buildbucket-config`
+
+Generates a gerrit buildbucket configuration file and prints it to
+stdout. This file contains the list of trybots shown in gerrit's UI.
+
+The master copy of the buildbucket.config file lives
+in a separate branch of the chromium repository. Run `mb
+gerrit-buildbucket-config > buildbucket.config.new && git fetch origin
+refs/meta/config:refs/remotes/origin/meta/config && git checkout
+-t -b meta_config origin/meta/config && mv buildbucket.config.new
+buildbucket.config` to update the file.
+
 ## Isolates and Swarming
 
 `mb gen` is also responsible for generating the `.isolate` and
diff --git a/tools/mb/mb.py b/tools/mb/mb.py
index 6905bcc..90c42bf 100755
--- a/tools/mb/mb.py
+++ b/tools/mb/mb.py
@@ -56,6 +56,7 @@
     self.sep = os.sep
     self.args = argparse.Namespace()
     self.configs = {}
+    self.luci_tryservers = {}
     self.masters = {}
     self.mixins = {}
 
@@ -235,6 +236,14 @@
                            ' do compiles')
     subp.set_defaults(func=self.CmdAudit)
 
+    subp = subps.add_parser('gerrit-buildbucket-config',
+                            help='Print buildbucket.config for gerrit '
+                            '(see MB user guide)')
+    subp.add_argument('-f', '--config-file', metavar='PATH',
+                      default=self.default_config,
+                      help='path to config file (default is %(default)s)')
+    subp.set_defaults(func=self.CmdBuildbucket)
+
     subp = subps.add_parser('help',
                             help='Get help on a subcommand.')
     subp.add_argument(nargs='?', action='store', dest='subcommand',
@@ -368,6 +377,25 @@
 
     return ret
 
+  def CmdBuildbucket(self):
+    self.ReadConfigFile()
+
+    self.Print('# This file was generated using '
+               '"tools/mb/mb.py gerrit-buildbucket-config".')
+
+    for luci_tryserver in sorted(self.luci_tryservers):
+      self.Print('[bucket "luci.%s"]' % luci_tryserver)
+      for bot in sorted(self.luci_tryservers[luci_tryserver]):
+        self.Print('\tbuilder = %s' % bot)
+
+    for master in sorted(self.masters):
+      if master.startswith('tryserver.'):
+        self.Print('[bucket "master.%s"]' % master)
+        for bot in sorted(self.masters[master]):
+          self.Print('\tbuilder = %s' % bot)
+
+    return 0
+
   def CmdValidate(self, print_ok=True):
     errs = []
 
@@ -674,6 +702,7 @@
                  (self.args.config_file, e))
 
     self.configs = contents['configs']
+    self.luci_tryservers = contents.get('luci_tryservers', {})
     self.masters = contents['masters']
     self.mixins = contents['mixins']
 
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 063438b..32c68f6 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -525,6 +525,7 @@
       'cast_shell_audio_linux': 'cast_audio_release_trybot',
       'chromeos_amd64-generic_chromium_compile_only_ng': 'cros_chrome_sdk',
       'chromeos_daisy_chromium_compile_only_ng': 'cros_chrome_sdk',
+      'chromium_presubmit': 'presubmit',
       'closure_compilation': 'closure_compilation',
       'fuchsia': 'release_trybot_fuchsia',
       'fuchsia_compile': 'release_trybot_fuchsia',
@@ -1415,6 +1416,11 @@
       'ozone_linux', 'release_trybot',
     ],
 
+    'presubmit': [
+      # The chromium_presubmit bot does not use mb.
+      'error',
+    ],
+
     'release_afl_asan': [
       'release', 'afl', 'asan', 'chromeos_codecs', 'pdf_xfa', 'disable_nacl',
     ],
@@ -1995,4 +2001,8 @@
       'gn_args': 'target_cpu="x86"',
     },
   },
+
+  'luci_tryservers': {
+    'chromium.try': [ 'LUCI linux_chromium_rel_ng' ],
+  },
 }
diff --git a/tools/mb/mb_unittest.py b/tools/mb/mb_unittest.py
index 29b75cf..73c3e9c 100755
--- a/tools/mb/mb_unittest.py
+++ b/tools/mb/mb_unittest.py
@@ -220,6 +220,28 @@
 }
 """
 
+TRYSERVER_CONFIG = """\
+{
+  'masters': {
+    'not_a_tryserver': {
+      'fake_builder': 'fake_config',
+    },
+    'tryserver.chromium.linux': {
+      'try_builder': 'fake_config',
+    },
+    'tryserver.chromium.mac': {
+      'try_builder2': 'fake_config',
+    },
+  },
+  'luci_tryservers': {
+    'luci_tryserver1': ['luci_builder1'],
+    'luci_tryserver2': ['luci_builder2'],
+  },
+  'configs': {},
+  'mixins': {},
+}
+"""
+
 
 class UnitTest(unittest.TestCase):
   def fake_mbw(self, files=None, win32=False):
@@ -555,6 +577,22 @@
                     "LLVM_FORCE_HEAD_REVISION=1\n"
                     "python build/gyp_chromium -G output_dir=_path_\n"))
 
+  def test_buildbucket(self):
+    mbw = self.fake_mbw()
+    mbw.files[mbw.default_config] = TRYSERVER_CONFIG
+    self.check(['gerrit-buildbucket-config'], mbw=mbw,
+               ret=0,
+               out=('# This file was generated using '
+                    '"tools/mb/mb.py gerrit-buildbucket-config".\n'
+                    '[bucket "luci.luci_tryserver1"]\n'
+                    '\tbuilder = luci_builder1\n'
+                    '[bucket "luci.luci_tryserver2"]\n'
+                    '\tbuilder = luci_builder2\n'
+                    '[bucket "master.tryserver.chromium.linux"]\n'
+                    '\tbuilder = try_builder\n'
+                    '[bucket "master.tryserver.chromium.mac"]\n'
+                    '\tbuilder = try_builder2\n'))
+
 
 if __name__ == '__main__':
   unittest.main()
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 3b98f244..5cb67fc 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -2626,6 +2626,7 @@
 <!-- Generated from components/guest_view/browser/bad_message.h -->
 
   <int value="0" label="GVM_EMBEDDER_FORBIDDEN_ACCESS_TO_GUEST"/>
+  <int value="1" label="GVM_INVALID_GUESTVIEW_TYPE"/>
 </enum>
 
 <enum name="BadMessageReasonNaCl">
@@ -22641,6 +22642,23 @@
   <int value="4" label="Success"/>
 </enum>
 
+<enum name="LockScreenActionAvailability">
+  <int value="0" label="Available"/>
+  <int value="1" label="Not available - no action handler app"/>
+  <int value="2" label="Not available - app with no lock screen support"/>
+  <int value="3" label="Not available - action not enabled on lock screen"/>
+  <int value="4" label="Not available - disallowed by policy"/>
+</enum>
+
+<enum name="LockScreenAppSessionState">
+  <int value="0" label="Not launched"/>
+  <int value="1" label="Launching"/>
+  <int value="2" label="App window created"/>
+  <int value="3" label="App window shown"/>
+  <int value="4" label="App window in foreground"/>
+  <int value="5" label="App window in background"/>
+</enum>
+
 <enum name="LockScreenDataItemOperationResult">
   <int value="0" label="Success"/>
   <int value="1" label="Operation failed"/>
@@ -22651,6 +22669,22 @@
   <int value="6" label="Wrong encryption key"/>
 </enum>
 
+<enum name="LockScreenNoteTakingExitReason">
+  <int value="0" label="Session was unlocked"/>
+  <int value="1" label="Session shutdown"/>
+  <int value="2" label="Screen turned off"/>
+  <int value="3" label="Device suspended"/>
+  <int value="4" label="App window closed"/>
+  <int value="5" label="Lock screen note taking disabled"/>
+</enum>
+
+<enum name="LockScreenNoteTakingUnlockUIAction">
+  <int value="0" label="User unlocked the session"/>
+  <int value="1" label="Session unlock was cancelled"/>
+  <int value="2" label="Device shut down"/>
+  <int value="3" label="User signed out"/>
+</enum>
+
 <enum name="LockScreenProgress">
   <int value="0" label="Start screen lock"/>
   <int value="1" label="Enter password correctly"/>
@@ -22670,6 +22704,7 @@
   <int value="-2143328006"
       label="enable-fill-on-account-select-no-highlighting"/>
   <int value="-2143113994" label="enable-ephemeral-apps-in-webstore"/>
+  <int value="-2141661938" label="AnimatedAppMenuIcon:enabled"/>
   <int value="-2134717874" label="Multidevice:disabled"/>
   <int value="-2134333982" label="ShowArcFilesApp:enabled"/>
   <int value="-2134244069" label="HttpFormWarning:enabled"/>
@@ -23505,6 +23540,7 @@
   <int value="506680761" label="WebNFC:disabled"/>
   <int value="510814146" label="OfflineBookmarks:enabled"/>
   <int value="513356954" label="InstantTethering:disabled"/>
+  <int value="517568645" label="AnimatedAppMenuIcon:disabled"/>
   <int value="535131384" label="OmniboxTailSuggestions:enabled"/>
   <int value="535976218" label="enable-plugin-power-saver"/>
   <int value="538468149" label="OfflinePagesCT:enabled"/>
@@ -27021,6 +27057,14 @@
   <int value="6" label="Unknown"/>
 </enum>
 
+<enum name="NewLockScreenNoteRequestType">
+  <int value="0" label="System tray action"/>
+  <int value="1" label="Lock screen - button tap"/>
+  <int value="2" label="Lock screen - swipe gesture"/>
+  <int value="3" label="Lock screen - button activated by keyboard"/>
+  <int value="4" label="Stylus ejected"/>
+</enum>
+
 <enum name="NewTabPageActionAndroid">
   <obsolete>
     Deprecated as of 01/2017. Replaced by NewTabPageActionAndroid2.
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 375f689..56edb6b 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -1803,6 +1803,120 @@
   </summary>
 </histogram>
 
+<histogram base="true" name="Apps.LockScreen.NoteTakingApp.AppWindowLifeTime"
+    units="ms">
+  <owner>tbarzic@chromium.org</owner>
+  <owner>tbuckley@chromium.org</owner>
+  <summary>
+    The amount of time a lock screen enabled app window spent in a certain state
+    during the app window activity. The state to which the histogram refers to
+    is defined by the suffix. The metric is logged upon leaving the associated
+    state.
+  </summary>
+</histogram>
+
+<histogram name="Apps.LockScreen.NoteTakingApp.AvailabilityOnScreenLock"
+    enum="LockScreenActionAvailability">
+  <owner>tbarzic@chromium.org</owner>
+  <owner>tbuckley@chromium.org</owner>
+  <summary>
+    The note taking action availability state on the lock screen, recorded when
+    the user session is locked.
+  </summary>
+</histogram>
+
+<histogram name="Apps.LockScreen.NoteTakingApp.FinalAppSessionState"
+    enum="LockScreenAppSessionState">
+  <owner>tbarzic@chromium.org</owner>
+  <owner>tbuckley@chromium.org</owner>
+  <summary>
+    The state in which lock screen enabled note taking app was when the note
+    taking session ended.
+  </summary>
+</histogram>
+
+<histogram name="Apps.LockScreen.NoteTakingApp.LaunchDurationAtLaunchCancel"
+    units="ms">
+  <owner>tbarzic@chromium.org</owner>
+  <owner>tbuckley@chromium.org</owner>
+  <summary>
+    The amount time a lock screen app had been launching when the app launch was
+    canceled. Logged if the lock screen app session ends before the lock screen
+    app window is shown.
+  </summary>
+</histogram>
+
+<histogram name="Apps.LockScreen.NoteTakingApp.LaunchRequestOrdinalNumber">
+  <owner>tbarzic@chromium.org</owner>
+  <owner>tbuckley@chromium.org</owner>
+  <summary>
+    Ordinal number of a note taking app launch request from a lock screen within
+    a lock screen session. If a note taking app is launched n times during a
+    single lock screen session, this histogram will be reported with values 1
+    through n. The launch counter is reset on screen unlock.
+  </summary>
+</histogram>
+
+<histogram name="Apps.LockScreen.NoteTakingApp.LaunchRequestReason"
+    enum="NewLockScreenNoteRequestType">
+  <owner>tbarzic@chromium.org</owner>
+  <owner>tbuckley@chromium.org</owner>
+  <summary>
+    The user action that launched note taking from the lock screen.
+  </summary>
+</histogram>
+
+<histogram name="Apps.LockScreen.NoteTakingApp.LockScreenInstallationDuration"
+    units="ms">
+  <owner>tbarzic@chromium.org</owner>
+  <owner>tbuckley@chromium.org</owner>
+  <summary>
+    Amount of time needed to install a copy of a lock screen note taking app
+    into lock screen apps profile.
+  </summary>
+</histogram>
+
+<histogram name="Apps.LockScreen.NoteTakingApp.NoteTakingExitReason"
+    enum="LockScreenNoteTakingExitReason">
+  <owner>tbarzic@chromium.org</owner>
+  <owner>tbuckley@chromium.org</owner>
+  <summary>
+    The reason the note taking on lock screen was ended (and lock screen app
+    window was closed).
+  </summary>
+</histogram>
+
+<histogram name="Apps.LockScreen.NoteTakingApp.TimeToLoadAppWindowContents"
+    units="ms">
+  <owner>tbarzic@chromium.org</owner>
+  <owner>tbuckley@chromium.org</owner>
+  <summary>
+    The amount of time needed to load a note taking app window contents on the
+    lock screen - i.e. the time passed from the user requesting an app launch to
+    the app window contents being loaded.
+  </summary>
+</histogram>
+
+<histogram name="Apps.LockScreen.NoteTakingApp.TimeToShowWindow" units="ms">
+  <owner>tbarzic@chromium.org</owner>
+  <owner>tbuckley@chromium.org</owner>
+  <summary>
+    The amount of time needed to launch a note taking app window from the lock
+    screen - i.e. the time passed from the user requesting an app launch to the
+    app window appearing on the screen.
+  </summary>
+</histogram>
+
+<histogram name="Apps.LockScreen.NoteTakingApp.UnlockUIAction"
+    enum="LockScreenNoteTakingUnlockUIAction">
+  <owner>tbarzic@chromium.org</owner>
+  <owner>tbuckley@chromium.org</owner>
+  <summary>
+    The action the user took on the lock screen UI shown when lock screen app
+    window is in background, shown under the lock screen.
+  </summary>
+</histogram>
+
 <histogram name="Apps.NoteTakingApp.DefaultLaunchResult"
     enum="NoteTakingAppLaunchResult">
   <owner>derat@chromium.org</owner>
@@ -53133,6 +53247,9 @@
 </histogram>
 
 <histogram name="Parser.AppendBytesDelay" units="ms">
+  <obsolete>
+    Deprecated Aug 2017
+  </obsolete>
   <owner>csharrison@chromium.org</owner>
   <summary>
     The delay from when bytes are received on the main thread to when the
@@ -53160,6 +53277,9 @@
 </histogram>
 
 <histogram name="Parser.PeakPendingChunkCount" units="chunks">
+  <obsolete>
+    Deprecated Aug 2017
+  </obsolete>
   <owner>csharrison@chromium.org</owner>
   <summary>
     The maximum number of pending Chunks in the ParsedChunkQueue after the
@@ -53168,6 +53288,9 @@
 </histogram>
 
 <histogram name="Parser.PeakPendingTokenCount" units="tokens">
+  <obsolete>
+    Deprecated Aug 2017
+  </obsolete>
   <owner>csharrison@chromium.org</owner>
   <summary>
     The maximum number of pending tokens in the ParsedChunkQueue after the
@@ -94223,6 +94346,16 @@
   <affected-histogram name="Apps.LockScreen.DataItemStorage.OperationResult"/>
 </histogram_suffixes>
 
+<histogram_suffixes name="LockScreenNoteTakingAppWindowState" separator=".">
+  <suffix name="Foreground"
+      label="The app window is in foreground (on top of the lock screen)"/>
+  <suffix name="Background"
+      label="The app window is in background (behind the lock screen)"/>
+  <suffix name="TotalActive"
+      label="The total amount of time an app window was active on lock screen"/>
+  <affected-histogram name="Apps.LockScreen.NoteTakingApp.AppWindowLifeTime"/>
+</histogram_suffixes>
+
 <histogram_suffixes name="LowMemoryMargin" separator="_">
   <suffix name="default" label="Low memory margin set to the system default"/>
   <suffix name="off" label="Low memory notification disabled"/>
diff --git a/tools/perf/benchmark.csv b/tools/perf/benchmark.csv
index db4f23a..91defb5 100644
--- a/tools/perf/benchmark.csv
+++ b/tools/perf/benchmark.csv
@@ -10,6 +10,7 @@
 blink_perf.dom,"jbroman@chromium.org, yukishiino@chromium.org, haraken@chromium.org",
 blink_perf.events,hayato@chromium.org,
 blink_perf.layout,eae@chromium.org,
+blink_perf.owp_storage,dmurph@chromium.org,
 blink_perf.paint,wangxianzhu@chromium.org,
 blink_perf.parser,"jbroman@chromium.org, yukishiino@chromium.org, haraken@chromium.org",
 blink_perf.shadow_dom,hayato@chromium.org,
@@ -51,8 +52,8 @@
 power.steady_state,,
 power.trivial_pages,erikchen@chromium.org,
 power.typical_10_mobile,perezju@chromium.org,
-rasterize_and_record_micro.partial_invalidation,,
-rasterize_and_record_micro.top_25,,
+rasterize_and_record_micro.partial_invalidation,"vmpstr@chromium.org, wkorman@chromium.org",Internals>Compositing>Rasterization
+rasterize_and_record_micro.top_25,"vmpstr@chromium.org, wkorman@chromium.org",Internals>Compositing>Rasterization
 resource_sizes,"agrieve@chromium.org, rnephew@chromium.org, perezju@chromium.org",
 scheduler.tough_scheduling_cases,"skyostil@chromium.org, brianderson@chromium.org",
 service_worker.service_worker,horo@chromium.org,
diff --git a/tools/perf/benchmarks/blink_perf.py b/tools/perf/benchmarks/blink_perf.py
index 2016be9e6..122785e 100644
--- a/tools/perf/benchmarks/blink_perf.py
+++ b/tools/perf/benchmarks/blink_perf.py
@@ -358,7 +358,10 @@
   def GetExpectations(self):
     class StoryExpectations(story.expectations.StoryExpectations):
       def SetExpectations(self):
-        pass # Nothing disabled.
+        self.DisableStory('structured-clone-long-string-deserialize.html',
+            [story.expectations.ALL_ANDROID], 'crbug.com/733655')
+        self.DisableStory('structured-clone-long-string-serialize.html',
+            [story.expectations.ALL_ANDROID], 'crbug.com/733655')
     return StoryExpectations()
 
 
@@ -444,6 +447,19 @@
     return Expectations()
 
 
+@benchmark.Owner(emails=['dmurph@chromium.org'])
+@benchmark.Disabled('all')
+class BlinkPerfOWPStorage(_BlinkPerfBenchmark):
+  tag = 'owp_storage'
+  subdir = 'OWPStorage'
+
+  def GetExpectations(self):
+    class StoryExpectations(story.expectations.StoryExpectations):
+      def SetExpectations(self):
+        pass # Nothing disabled.
+    return StoryExpectations()
+
+
 @benchmark.Owner(emails=['wangxianzhu@chromium.org'])
 class BlinkPerfPaint(_BlinkPerfBenchmark):
   tag = 'paint'
diff --git a/tools/perf/benchmarks/memory.py b/tools/perf/benchmarks/memory.py
index 5722153..472b0b2 100644
--- a/tools/perf/benchmarks/memory.py
+++ b/tools/perf/benchmarks/memory.py
@@ -132,6 +132,11 @@
     return False
 
   @classmethod
+  def ShouldTearDownStateAfterEachStorySetRun(cls):
+    # Browser will now be closed as instructed by the shared state.
+    return False
+
+  @classmethod
   def ValueCanBeAddedPredicate(cls, value, is_first_result):
     return DefaultValueCanBeAddedPredicateForMemoryMeasurement(value)
 
diff --git a/tools/perf/benchmarks/rasterize_and_record_micro.py b/tools/perf/benchmarks/rasterize_and_record_micro.py
index 1a8ece57..c950055 100644
--- a/tools/perf/benchmarks/rasterize_and_record_micro.py
+++ b/tools/perf/benchmarks/rasterize_and_record_micro.py
@@ -6,6 +6,7 @@
 
 from measurements import rasterize_and_record_micro
 import page_sets
+from telemetry import benchmark
 from telemetry import story
 
 
@@ -43,6 +44,9 @@
         options.record_repeat, options.timeout, options.report_detailed_results)
 
 
+@benchmark.Owner(
+    emails=['vmpstr@chromium.org', 'wkorman@chromium.org'],
+    component='Internals>Compositing>Rasterization')
 class RasterizeAndRecordMicroTop25(_RasterizeAndRecordMicro):
   """Measures rasterize and record performance on the top 25 web pages.
 
@@ -59,11 +63,14 @@
         self.DisableStory('http://www.cnn.com', [story.expectations.ALL],
                           'crbug.com/528472')
         self.DisableStory('https://mail.google.com/mail/',
-                          [story.expectations.ALL_LINUX],
+                          [story.expectations.ALL],
                           'crbug.com/747021')
     return StoryExpectations()
 
 
+@benchmark.Owner(
+    emails=['vmpstr@chromium.org', 'wkorman@chromium.org'],
+    component='Internals>Compositing>Rasterization')
 class RasterizeAndRecordMicroPartialInvalidation(_RasterizeAndRecordMicro):
   """Measures rasterize and record performance for partial inval. on big pages.
 
diff --git a/tools/perf/benchmarks/service_worker.py b/tools/perf/benchmarks/service_worker.py
index a6845ea..58e3faa 100644
--- a/tools/perf/benchmarks/service_worker.py
+++ b/tools/perf/benchmarks/service_worker.py
@@ -202,5 +202,7 @@
   def GetExpectations(self):
     class StoryExpectations(story.expectations.StoryExpectations):
       def SetExpectations(self):
-        pass # Nothing disabled.
+        self.DisableStory('http://localhost:8091/index.html',
+                          [story.expectations.ANDROID_WEBVIEW],
+                          'crbug.com/653924')
     return StoryExpectations()
diff --git a/tools/perf/benchmarks/smoothness.py b/tools/perf/benchmarks/smoothness.py
index 2cbc6f5..a790149 100644
--- a/tools/perf/benchmarks/smoothness.py
+++ b/tools/perf/benchmarks/smoothness.py
@@ -439,7 +439,82 @@
   def GetExpectations(self):
     class StoryExpectations(story_module.expectations.StoryExpectations):
       def SetExpectations(self):
-        pass # Nothing.
+        self.DisableStory('https://www.google.com/#hl=en&q=barack+obama',
+                          [story_module.expectations.ALL_ANDROID,
+                          story_module.expectations.ALL_WIN],
+                          'crbug.com/631015')
+        self.DisableStory('https://mail.google.com/mail/',
+                          [story_module.expectations.ALL_ANDROID,
+                          story_module.expectations.ALL_WIN],
+                          'crbug.com/631015')
+        self.DisableStory('https://www.google.com/calendar/',
+                          [story_module.expectations.ALL_ANDROID,
+                          story_module.expectations.ALL_WIN],
+                          'crbug.com/631015')
+        self.DisableStory('https://www.google.com/search?q=cats&tbm=isch',
+                          [story_module.expectations.ALL_ANDROID,
+                          story_module.expectations.ALL_WIN],
+                          'crbug.com/631015')
+        self.DisableStory('http://www.youtube.com',
+                          [story_module.expectations.ALL_ANDROID,
+                          story_module.expectations.ALL_WIN],
+                          'crbug.com/631015')
+        self.DisableStory('Blogger',
+                          [story_module.expectations.ALL_ANDROID,
+                          story_module.expectations.ALL_WIN],
+                          'crbug.com/631015')
+        self.DisableStory('Facebook',
+                          [story_module.expectations.ALL_ANDROID,
+                          story_module.expectations.ALL_WIN],
+                          'crbug.com/631015')
+        self.DisableStory('LinkedIn',
+                          [story_module.expectations.ALL_ANDROID,
+                          story_module.expectations.ALL_WIN],
+                          'crbug.com/631015')
+        self.DisableStory('Wikipedia (1 tab)',
+                          [story_module.expectations.ALL_ANDROID,
+                          story_module.expectations.ALL_WIN],
+                          'crbug.com/631015')
+        self.DisableStory('Twitter',
+                          [story_module.expectations.ALL_ANDROID,
+                          story_module.expectations.ALL_WIN],
+                          'crbug.com/631015')
+        self.DisableStory('ESPN',
+                          [story_module.expectations.ALL_ANDROID,
+                          story_module.expectations.ALL_WIN],
+                          'crbug.com/631015')
+        self.DisableStory('http://news.yahoo.com',
+                          [story_module.expectations.ALL_ANDROID,
+                          story_module.expectations.ALL_WIN],
+                          'crbug.com/631015')
+        self.DisableStory('http://www.cnn.com',
+                          [story_module.expectations.ALL_ANDROID,
+                          story_module.expectations.ALL_WIN],
+                          'crbug.com/631015')
+        self.DisableStory('Weather.com',
+                          [story_module.expectations.ALL_ANDROID,
+                          story_module.expectations.ALL_WIN],
+                          'crbug.com/631015')
+        self.DisableStory('http://www.amazon.com',
+                          [story_module.expectations.ALL_ANDROID,
+                          story_module.expectations.ALL_WIN],
+                          'crbug.com/631015')
+        self.DisableStory('http://www.ebay.com',
+                          [story_module.expectations.ALL_ANDROID,
+                          story_module.expectations.ALL_WIN],
+                          'crbug.com/631015')
+        self.DisableStory('http://games.yahoo.com',
+                          [story_module.expectations.ALL_ANDROID,
+                          story_module.expectations.ALL_WIN],
+                          'crbug.com/631015')
+        self.DisableStory('http://booking.com',
+                          [story_module.expectations.ALL_ANDROID,
+                          story_module.expectations.ALL_WIN],
+                          'crbug.com/631015')
+        self.DisableStory('http://sports.yahoo.com/',
+                          [story_module.expectations.ALL_ANDROID,
+                          story_module.expectations.ALL_WIN],
+                          'crbug.com/631015')
     return StoryExpectations()
 
 
@@ -480,9 +555,63 @@
     return 'smoothness.gpu_rasterization.tough_pinch_zoom_cases'
 
   def GetExpectations(self):
+
     class StoryExpectations(story_module.expectations.StoryExpectations):
+
       def SetExpectations(self):
-        pass # Nothing.
+        self.DisableStory('https://www.google.com/#hl=en&q=barack+obama',
+                          [story_module.expectations.ALL_ANDROID],
+                          'crbug.com/610021')
+        self.DisableStory('https://mail.google.com/mail/',
+                          [story_module.expectations.ALL_ANDROID],
+                          'crbug.com/610021')
+        self.DisableStory('https://www.google.com/calendar/',
+                          [story_module.expectations.ALL_ANDROID],
+                          'crbug.com/610021')
+        self.DisableStory('https://www.google.com/search?q=cats&tbm=isch',
+                          [story_module.expectations.ALL_ANDROID],
+                          'crbug.com/610021')
+        self.DisableStory('http://www.youtube.com',
+                          [story_module.expectations.ALL_ANDROID],
+                          'crbug.com/610021')
+        self.DisableStory('Blogger', [story_module.expectations.ALL_ANDROID],
+                          'crbug.com/610021')
+        self.DisableStory('Facebook', [story_module.expectations.ALL_ANDROID],
+                          'crbug.com/610021')
+        self.DisableStory('LinkedIn', [story_module.expectations.ALL_ANDROID],
+                          'crbug.com/610021')
+        self.DisableStory('Wikipedia (1 tab)',
+                          [story_module.expectations.ALL_ANDROID],
+                          'crbug.com/610021')
+        self.DisableStory('Twitter', [story_module.expectations.ALL_ANDROID],
+                          'crbug.com/610021')
+        self.DisableStory('ESPN', [story_module.expectations.ALL_ANDROID],
+                          'crbug.com/610021')
+        self.DisableStory('http://news.yahoo.com',
+                          [story_module.expectations.ALL_ANDROID],
+                          'crbug.com/610021')
+        self.DisableStory('http://www.cnn.com',
+                          [story_module.expectations.ALL_ANDROID],
+                          'crbug.com/610021')
+        self.DisableStory('Weather.com',
+                          [story_module.expectations.ALL_ANDROID],
+                          'crbug.com/610021')
+        self.DisableStory('http://www.amazon.com',
+                          [story_module.expectations.ALL_ANDROID],
+                          'crbug.com/610021')
+        self.DisableStory('http://www.ebay.com',
+                          [story_module.expectations.ALL_ANDROID],
+                          'crbug.com/610021')
+        self.DisableStory('http://games.yahoo.com',
+                          [story_module.expectations.ALL_ANDROID],
+                          'crbug.com/610021')
+        self.DisableStory('http://booking.com',
+                          [story_module.expectations.ALL_ANDROID],
+                          'crbug.com/610021')
+        self.DisableStory('http://sports.yahoo.com/',
+                          [story_module.expectations.ALL_ANDROID],
+                          'crbug.com/610021')
+
     return StoryExpectations()
 
 
diff --git a/tools/perf/contrib/memory_extras/memory_extras.py b/tools/perf/contrib/memory_extras/memory_extras.py
index abf810c06..33751abd 100644
--- a/tools/perf/contrib/memory_extras/memory_extras.py
+++ b/tools/perf/contrib/memory_extras/memory_extras.py
@@ -18,18 +18,26 @@
   on a webview-based browser (a stand in for the Search app), and loading
   pages on a select browser.
   """
-  page_set = page_sets.DualBrowserStorySet
   options = {'pageset_repeat': 5}
 
   @classmethod
   def Name(cls):
     return 'memory.dual_browser_test'
 
+  def CreateStorySet(self, options):
+    del options
+    return page_sets.DualBrowserStorySet()
+
   @classmethod
   def ShouldTearDownStateAfterEachStoryRun(cls):
     return False
 
   @classmethod
+  def ShouldTearDownStateAfterEachStorySetRun(cls):
+    # Browser will now be closed as instructed by the shared state.
+    return False
+
+  @classmethod
   def ValueCanBeAddedPredicate(cls, value, is_first_result):
     # TODO(crbug.com/610962): Remove this stopgap when the perf dashboard
     # is able to cope with the data load generated by TBMv2 metrics.
@@ -49,13 +57,16 @@
   Same as memory.dual_browser_test, but the test is run for 60 iterations
   and the browser is *not* restarted between page set repeats.
   """
-  page_set = page_sets.DualBrowserStorySet
   options = {'pageset_repeat': 60}
 
   @classmethod
   def Name(cls):
     return 'memory.long_running_dual_browser_test'
 
+  def CreateStorySet(self, options):
+    del options
+    return page_sets.DualBrowserStorySet(long_running=True)
+
   @classmethod
   def ShouldTearDownStateAfterEachStoryRun(cls):
     return False
diff --git a/tools/perf/page_sets/data/kraken.json b/tools/perf/page_sets/data/kraken.json
index a9b1d44..550d051e 100644
--- a/tools/perf/page_sets/data/kraken.json
+++ b/tools/perf/page_sets/data/kraken.json
@@ -1,7 +1,7 @@
 {
     "archives": {
         "http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html": {
-            "DEFAULT": "kraken_000.wpr"
+            "DEFAULT": "kraken_000.wprgo"
         }
     },
     "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.",
diff --git a/tools/perf/page_sets/data/kraken_000.wpr.sha1 b/tools/perf/page_sets/data/kraken_000.wpr.sha1
deleted file mode 100644
index 5b47e88..0000000
--- a/tools/perf/page_sets/data/kraken_000.wpr.sha1
+++ /dev/null
@@ -1 +0,0 @@
-c096ee93213072a013e1799e07e1337cc2a2e806
\ No newline at end of file
diff --git a/tools/perf/page_sets/data/kraken_000.wprgo.sha1 b/tools/perf/page_sets/data/kraken_000.wprgo.sha1
new file mode 100644
index 0000000..dc6a6463f
--- /dev/null
+++ b/tools/perf/page_sets/data/kraken_000.wprgo.sha1
@@ -0,0 +1 @@
+cdf2ba76caaf50bddf279601dbc268c3aee99a3f
\ No newline at end of file
diff --git a/tools/perf/page_sets/data/oortonline.json b/tools/perf/page_sets/data/oortonline.json
index 77c5982e..4ca5c7e7 100644
--- a/tools/perf/page_sets/data/oortonline.json
+++ b/tools/perf/page_sets/data/oortonline.json
@@ -1,7 +1,7 @@
 {
     "archives": {
         "http://oortonline.gl/#run": {
-            "DEFAULT": "oortonline_000.wpr"
+            "DEFAULT": "oortonline_000.wprgo"
         }
     },
     "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.",
diff --git a/tools/perf/page_sets/data/oortonline_000.wpr.sha1 b/tools/perf/page_sets/data/oortonline_000.wpr.sha1
deleted file mode 100644
index 8131fd8..0000000
--- a/tools/perf/page_sets/data/oortonline_000.wpr.sha1
+++ /dev/null
@@ -1 +0,0 @@
-b89e7b2fbbc545d60c5b061ec83c65175e59d284
\ No newline at end of file
diff --git a/tools/perf/page_sets/data/oortonline_000.wprgo.sha1 b/tools/perf/page_sets/data/oortonline_000.wprgo.sha1
new file mode 100644
index 0000000..b462b7e
--- /dev/null
+++ b/tools/perf/page_sets/data/oortonline_000.wprgo.sha1
@@ -0,0 +1 @@
+911b8a870ce29bed1adcded2e35b6be648660f42
\ No newline at end of file
diff --git a/tools/perf/page_sets/data/speedometer.json b/tools/perf/page_sets/data/speedometer.json
index 125b78c..c6912cf3c 100644
--- a/tools/perf/page_sets/data/speedometer.json
+++ b/tools/perf/page_sets/data/speedometer.json
@@ -1,7 +1,7 @@
 {
     "archives": {
         "http://browserbench.org/Speedometer/": {
-            "DEFAULT": "speedometer_000.wpr"
+            "DEFAULT": "speedometer_000.wprgo"
         }
     },
     "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.",
diff --git a/tools/perf/page_sets/data/speedometer_000.wpr.sha1 b/tools/perf/page_sets/data/speedometer_000.wpr.sha1
deleted file mode 100644
index 5388525..0000000
--- a/tools/perf/page_sets/data/speedometer_000.wpr.sha1
+++ /dev/null
@@ -1 +0,0 @@
-d9a5aa1403c33b623aafdcaa3be65a3edc568499
\ No newline at end of file
diff --git a/tools/perf/page_sets/data/speedometer_000.wprgo.sha1 b/tools/perf/page_sets/data/speedometer_000.wprgo.sha1
new file mode 100644
index 0000000..13e4893
--- /dev/null
+++ b/tools/perf/page_sets/data/speedometer_000.wprgo.sha1
@@ -0,0 +1 @@
+962642b357699cdf4aca5c51ea37f9a3faec339d
\ No newline at end of file
diff --git a/tools/perf/page_sets/data/v8_top_25.json b/tools/perf/page_sets/data/v8_top_25.json
index 3df5c96..64a5b172 100644
--- a/tools/perf/page_sets/data/v8_top_25.json
+++ b/tools/perf/page_sets/data/v8_top_25.json
@@ -1,109 +1,109 @@
 {
     "archives": {
         "http://edition.cnn.com": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://inbox.google.com": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://maps.google.co.jp/maps/search/restaurant+tokyo": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://meta.discourse.org": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://pollouer.muc/Speedometer/CustomRunner.html?angular": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://pollouer.muc/Speedometer/CustomRunner.html?backbone": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://pollouer.muc/Speedometer/CustomRunner.html?ember": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://pollouer.muc/Speedometer/CustomRunner.html?jquery": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://pollouer.muc/Speedometer/CustomRunner.html?vanilla": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://reddit.musicplayer.io": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://weibo.com": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://world.taobao.com": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://www.amazon.com/s/?field-keywords=v8": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://www.baidu.com/s?wd=v8": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://www.bing.com/search?q=v8+engine": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://www.ebay.fr/sch/i.html?_nkw=v8": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://www.instagram.com/archdigest": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://www.msn.com/ar-ae": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://www.pinterest.com/categories/popular": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://www.qq.com": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://www.reddit.com": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://www.sina.com.cn": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://www.twitter.com/taylorswift13": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://www.wikiwand.com/en/hill": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://www.yahoo.co.jp": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "http://yandex.ru/search/?text=v8": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "https://adwords.google.com": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "https://www.facebook.com/shakira": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "https://www.google.de/search?q=v8": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "https://www.linkedin.com/m/": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "https://www.youtube.com": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         },
         "https://www.youtube.com/watch?v=_kZsOISarzg": {
-            "DEFAULT": "v8_top_25_000.wpr"
+            "DEFAULT": "v8_top_25_000.wprgo"
         }
     },
     "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.",
diff --git a/tools/perf/page_sets/data/v8_top_25_000.wpr.sha1 b/tools/perf/page_sets/data/v8_top_25_000.wpr.sha1
deleted file mode 100644
index 791ed2c..0000000
--- a/tools/perf/page_sets/data/v8_top_25_000.wpr.sha1
+++ /dev/null
@@ -1 +0,0 @@
-f15edfe658462c60bd651d46f476008296af42e1
\ No newline at end of file
diff --git a/tools/perf/page_sets/data/v8_top_25_000.wprgo.sha1 b/tools/perf/page_sets/data/v8_top_25_000.wprgo.sha1
new file mode 100644
index 0000000..4c354c74
--- /dev/null
+++ b/tools/perf/page_sets/data/v8_top_25_000.wprgo.sha1
@@ -0,0 +1 @@
+69afbb4fc7875bfef69f4134f0e981fa492f4181
\ No newline at end of file
diff --git a/tools/perf/page_sets/desktop_memory.py b/tools/perf/page_sets/desktop_memory.py
index 59f9005..aef9de34d 100644
--- a/tools/perf/page_sets/desktop_memory.py
+++ b/tools/perf/page_sets/desktop_memory.py
@@ -6,17 +6,24 @@
 
 from telemetry.page import page as page_module
 from telemetry.page import shared_page_state
-from telemetry import story
+from telemetry import story as story_module
 
 _DUMP_WAIT_TIME = 3
 _ITERATIONS = 10
 
+
+class DesktopMemorySharedState(shared_page_state.SharedDesktopPageState):
+  def ShouldStopBrowserAfterStoryRun(self, story):
+    del story
+    return False  # Keep the same browser instance open across stories.
+
+
 class DesktopMemoryPage(page_module.Page):
 
   def __init__(self, url, page_set):
     super(DesktopMemoryPage, self).__init__(
         url=url, page_set=page_set,
-        shared_page_state_class=shared_page_state.SharedDesktopPageState,
+        shared_page_state_class=DesktopMemorySharedState,
         name=url)
 
   def _DumpMemory(self, action_runner, phase):
@@ -45,7 +52,7 @@
     self._DumpMemory(action_runner, 'post')
 
 
-class DesktopMemoryPageSet(story.StorySet):
+class DesktopMemoryPageSet(story_module.StorySet):
 
   """ Desktop sites with interesting memory characteristics """
 
diff --git a/tools/perf/page_sets/dual_browser_story.py b/tools/perf/page_sets/dual_browser_story.py
index e50fbe7..6ba5f2f 100644
--- a/tools/perf/page_sets/dual_browser_story.py
+++ b/tools/perf/page_sets/dual_browser_story.py
@@ -179,6 +179,11 @@
     self._current_story.Run(self)
 
   def DidRunStory(self, _):
+    if (not self._story_set.long_running and
+        self._story_set[-1] == self._current_story):
+      # In long_running mode we never close the browsers; otherwise we close
+      # them only after the last story in the set runs.
+      self._CloseAllBrowsers()
     self._current_story = None
 
   def TakeMemoryMeasurement(self):
@@ -238,10 +243,11 @@
 class DualBrowserStorySet(story_module.StorySet):
   """A story set that switches back and forth between two browsers."""
 
-  def __init__(self):
+  def __init__(self, long_running=False):
     super(DualBrowserStorySet, self).__init__(
         archive_data_file='data/dual_browser_story.json',
         cloud_storage_bucket=story_module.PARTNER_BUCKET)
+    self.long_running = long_running
 
     for query, url in zip(SEARCH_QUERIES, URL_LIST):
       # Stories that run on the android-webview browser.
diff --git a/tools/perf/page_sets/memory_top_10_mobile.py b/tools/perf/page_sets/memory_top_10_mobile.py
index 260af357..0a7239d 100644
--- a/tools/perf/page_sets/memory_top_10_mobile.py
+++ b/tools/perf/page_sets/memory_top_10_mobile.py
@@ -6,13 +6,25 @@
 
 from telemetry.page import page as page_module
 from telemetry.page import shared_page_state
-from telemetry import story
+from telemetry import story as story_module
 
 from devil.android.sdk import keyevent # pylint: disable=import-error
 
 from page_sets import top_10_mobile
 
 
+class Top10MobileSharedState(shared_page_state.SharedMobilePageState):
+  def __init__(self, test, finder_options, story_set):
+    super(Top10MobileSharedState, self).__init__(
+        test, finder_options, story_set)
+    self._story_set = story_set
+
+  def ShouldStopBrowserAfterStoryRun(self, story):
+    # Close the browser after the last story in the set.
+    # TODO(crbug.com/750055): Switch to close after each background page.
+    return self._story_set[-1] == story
+
+
 class MemoryMeasurementPage(page_module.Page):
   """Abstract class for measuring memory on a story unit."""
 
@@ -21,7 +33,7 @@
   def __init__(self, story_set, name, url):
     super(MemoryMeasurementPage, self).__init__(
         page_set=story_set, name=name, url=url,
-        shared_page_state_class=shared_page_state.SharedMobilePageState,
+        shared_page_state_class=Top10MobileSharedState,
         grouping_keys={'phase': self._PHASE})
 
 
@@ -61,14 +73,14 @@
         keyevent.KEYCODE_BACK)
 
 
-class MemoryTop10Mobile(story.StorySet):
+class MemoryTop10Mobile(story_module.StorySet):
   """User story to measure foreground/background memory in top 10 mobile."""
   DETERMINISTIC_MODE = True
 
   def __init__(self):
     super(MemoryTop10Mobile, self).__init__(
         archive_data_file='data/memory_top_10_mobile.json',
-        cloud_storage_bucket=story.PARTNER_BUCKET)
+        cloud_storage_bucket=story_module.PARTNER_BUCKET)
 
     for url in top_10_mobile.URL_LIST:
       # We name pages so their foreground/background counterparts are easy
diff --git a/tools/perf/scripts_smoke_unittest.py b/tools/perf/scripts_smoke_unittest.py
index c6d0fa6..da2e82a 100644
--- a/tools/perf/scripts_smoke_unittest.py
+++ b/tools/perf/scripts_smoke_unittest.py
@@ -6,9 +6,11 @@
 import os
 import subprocess
 import sys
-from telemetry.testing import options_for_unittests
 import unittest
 
+from telemetry import decorators
+from telemetry.testing import options_for_unittests
+
 
 class ScriptsSmokeTest(unittest.TestCase):
 
@@ -58,6 +60,7 @@
     self.assertEquals(return_code, 0, stdout)
     self.assertIn('kraken', stdout)
 
+  @decorators.Disabled('chromeos')  # crbug.com/754913
   def testRunTelemetryBenchmarkAsGoogletest(self):
     options = options_for_unittests.GetCopy()
     browser_type = options.browser_type
diff --git a/tools/perf/unowned_benchmarks.txt b/tools/perf/unowned_benchmarks.txt
index b3d2d7f..2a892f4 100644
--- a/tools/perf/unowned_benchmarks.txt
+++ b/tools/perf/unowned_benchmarks.txt
@@ -2,8 +2,6 @@
 load_library_perf_tests
 power.idle_platform
 power.steady_state
-rasterize_and_record_micro.partial_invalidation
-rasterize_and_record_micro.top_25
 smoothness.tough_image_decode_cases
 start_with_ext.cold.blank_page
 start_with_ext.warm.blank_page
diff --git a/tools/unused-symbols-report.py b/tools/unused-symbols-report.py
index 900bf16e..993e436b 100755
--- a/tools/unused-symbols-report.py
+++ b/tools/unused-symbols-report.py
@@ -42,7 +42,8 @@
   sym = sym.replace('std::basic_string<wchar_t, std::char_traits<wchar_t>, '
                     'std::allocator<wchar_t> >', 'std::wstring')
   sym = sym.replace('std::basic_string<unsigned short, '
-                    'base::string16_char_traits, '
+                    'base::string16_internals::'
+                    'string16_char_traits, '
                     'std::allocator<unsigned short> >', 'string16')
   sym = re.sub(r', std::allocator<\S+\s+>', '', sym)
   return sym
diff --git a/ui/accessibility/platform/ax_platform_node_mac.mm b/ui/accessibility/platform/ax_platform_node_mac.mm
index 2c2bd33..56dab4a 100644
--- a/ui/accessibility/platform/ax_platform_node_mac.mm
+++ b/ui/accessibility/platform/ax_platform_node_mac.mm
@@ -69,7 +69,9 @@
       {ui::AX_ROLE_FOOTER, NSAccessibilityGroupRole},
       {ui::AX_ROLE_FORM, NSAccessibilityGroupRole},
       {ui::AX_ROLE_GENERIC_CONTAINER, NSAccessibilityGroupRole},
-      {ui::AX_ROLE_GRID, NSAccessibilityGridRole},
+      // Should be NSAccessibilityGridRole but VoiceOver treating it like
+      // a list as of 10.12.6, so following WebKit and using table role:
+      {ui::AX_ROLE_GRID, NSAccessibilityTableRole},  // crbug.com/753925
       {ui::AX_ROLE_GROUP, NSAccessibilityGroupRole},
       {ui::AX_ROLE_HEADING, @"AXHeading"},
       {ui::AX_ROLE_IFRAME, NSAccessibilityGroupRole},
diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn
index e15ae48..65e9a6e1 100644
--- a/ui/android/BUILD.gn
+++ b/ui/android/BUILD.gn
@@ -61,6 +61,7 @@
     "//components/viz/host",
     "//components/viz/service",
     "//skia",
+    "//third_party/WebKit/public:blink_headers",
     "//ui/base",
     "//ui/display",
     "//ui/events",
@@ -248,7 +249,10 @@
     "//third_party/android_tools:android_support_annotations_java",
     "//third_party/android_tools:android_support_v7_appcompat_java",
   ]
-  srcjar_deps = [ ":java_enums_srcjar" ]
+  srcjar_deps = [
+    ":java_enums_srcjar",
+    "//third_party/WebKit/public:blink_cursor_type_java_enums_srcjar",
+  ]
 }
 
 junit_binary("ui_junit_tests") {
diff --git a/ui/android/DEPS b/ui/android/DEPS
index bec96dda..54c50b6 100644
--- a/ui/android/DEPS
+++ b/ui/android/DEPS
@@ -12,6 +12,7 @@
   "+components/viz/service/surfaces",
   "+jni",
   "+skia/ext",
+  "+third_party/WebKit/public/platform/WebCursorInfo.h",
   "+third_party/skia",
   "+ui/base",
   "+ui/display",
diff --git a/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java b/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java
index 6a661b3..0828e99 100644
--- a/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java
+++ b/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java
@@ -8,14 +8,17 @@
 import android.content.ClipData;
 import android.graphics.Bitmap;
 import android.os.Build;
+import android.view.PointerIcon;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.FrameLayout.LayoutParams;
 import android.widget.ImageView;
 
 import org.chromium.base.ApiCompatibilityUtils;
+import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.blink_public.web.WebCursorInfoType;
 
 /**
  * Class to acquire, position, and remove anchor views from the implementing View.
@@ -102,6 +105,146 @@
                 new View.DragShadowBuilder(imageView), null, View.DRAG_FLAG_GLOBAL);
     }
 
+    @VisibleForTesting
+    @CalledByNative
+    public void onCursorChangedToCustom(Bitmap customCursorBitmap, int hotspotX, int hotspotY) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            PointerIcon icon = PointerIcon.create(customCursorBitmap, hotspotX, hotspotY);
+            getContainerView().setPointerIcon(icon);
+        }
+    }
+
+    @VisibleForTesting
+    @CalledByNative
+    public void onCursorChanged(int cursorType) {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return;
+
+        int pointerIconType = PointerIcon.TYPE_ARROW;
+        switch (cursorType) {
+            case WebCursorInfoType.TYPE_NONE:
+                pointerIconType = PointerIcon.TYPE_NULL;
+                break;
+            case WebCursorInfoType.TYPE_POINTER:
+                pointerIconType = PointerIcon.TYPE_ARROW;
+                break;
+            case WebCursorInfoType.TYPE_CONTEXT_MENU:
+                pointerIconType = PointerIcon.TYPE_CONTEXT_MENU;
+                break;
+            case WebCursorInfoType.TYPE_HAND:
+                pointerIconType = PointerIcon.TYPE_HAND;
+                break;
+            case WebCursorInfoType.TYPE_HELP:
+                pointerIconType = PointerIcon.TYPE_HELP;
+                break;
+            case WebCursorInfoType.TYPE_WAIT:
+                pointerIconType = PointerIcon.TYPE_WAIT;
+                break;
+            case WebCursorInfoType.TYPE_CELL:
+                pointerIconType = PointerIcon.TYPE_CELL;
+                break;
+            case WebCursorInfoType.TYPE_CROSS:
+                pointerIconType = PointerIcon.TYPE_CROSSHAIR;
+                break;
+            case WebCursorInfoType.TYPE_I_BEAM:
+                pointerIconType = PointerIcon.TYPE_TEXT;
+                break;
+            case WebCursorInfoType.TYPE_VERTICAL_TEXT:
+                pointerIconType = PointerIcon.TYPE_VERTICAL_TEXT;
+                break;
+            case WebCursorInfoType.TYPE_ALIAS:
+                pointerIconType = PointerIcon.TYPE_ALIAS;
+                break;
+            case WebCursorInfoType.TYPE_COPY:
+                pointerIconType = PointerIcon.TYPE_COPY;
+                break;
+            case WebCursorInfoType.TYPE_NO_DROP:
+                pointerIconType = PointerIcon.TYPE_NO_DROP;
+                break;
+            case WebCursorInfoType.TYPE_COLUMN_RESIZE:
+                pointerIconType = PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW;
+                break;
+            case WebCursorInfoType.TYPE_ROW_RESIZE:
+                pointerIconType = PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW;
+                break;
+            case WebCursorInfoType.TYPE_NORTH_EAST_SOUTH_WEST_RESIZE:
+                pointerIconType = PointerIcon.TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW;
+                break;
+            case WebCursorInfoType.TYPE_NORTH_WEST_SOUTH_EAST_RESIZE:
+                pointerIconType = PointerIcon.TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW;
+                break;
+            case WebCursorInfoType.TYPE_ZOOM_IN:
+                pointerIconType = PointerIcon.TYPE_ZOOM_IN;
+                break;
+            case WebCursorInfoType.TYPE_ZOOM_OUT:
+                pointerIconType = PointerIcon.TYPE_ZOOM_OUT;
+                break;
+            case WebCursorInfoType.TYPE_GRAB:
+                pointerIconType = PointerIcon.TYPE_GRAB;
+                break;
+            case WebCursorInfoType.TYPE_GRABBING:
+                pointerIconType = PointerIcon.TYPE_GRABBING;
+                break;
+            // TODO(jaebaek): set types correctly
+            // after fixing http://crbug.com/584424.
+            case WebCursorInfoType.TYPE_EAST_WEST_RESIZE:
+                pointerIconType = PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW;
+                break;
+            case WebCursorInfoType.TYPE_NORTH_SOUTH_RESIZE:
+                pointerIconType = PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW;
+                break;
+            case WebCursorInfoType.TYPE_EAST_RESIZE:
+                pointerIconType = PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW;
+                break;
+            case WebCursorInfoType.TYPE_NORTH_RESIZE:
+                pointerIconType = PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW;
+                break;
+            case WebCursorInfoType.TYPE_NORTH_EAST_RESIZE:
+                pointerIconType = PointerIcon.TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW;
+                break;
+            case WebCursorInfoType.TYPE_NORTH_WEST_RESIZE:
+                pointerIconType = PointerIcon.TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW;
+                break;
+            case WebCursorInfoType.TYPE_SOUTH_RESIZE:
+                pointerIconType = PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW;
+                break;
+            case WebCursorInfoType.TYPE_SOUTH_EAST_RESIZE:
+                pointerIconType = PointerIcon.TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW;
+                break;
+            case WebCursorInfoType.TYPE_SOUTH_WEST_RESIZE:
+                pointerIconType = PointerIcon.TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW;
+                break;
+            case WebCursorInfoType.TYPE_WEST_RESIZE:
+                pointerIconType = PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW;
+                break;
+            case WebCursorInfoType.TYPE_PROGRESS:
+                pointerIconType = PointerIcon.TYPE_WAIT;
+                break;
+            case WebCursorInfoType.TYPE_NOT_ALLOWED:
+                pointerIconType = PointerIcon.TYPE_NO_DROP;
+                break;
+            case WebCursorInfoType.TYPE_MOVE:
+            case WebCursorInfoType.TYPE_MIDDLE_PANNING:
+                pointerIconType = PointerIcon.TYPE_ALL_SCROLL;
+                break;
+            case WebCursorInfoType.TYPE_EAST_PANNING:
+            case WebCursorInfoType.TYPE_NORTH_PANNING:
+            case WebCursorInfoType.TYPE_NORTH_EAST_PANNING:
+            case WebCursorInfoType.TYPE_NORTH_WEST_PANNING:
+            case WebCursorInfoType.TYPE_SOUTH_PANNING:
+            case WebCursorInfoType.TYPE_SOUTH_EAST_PANNING:
+            case WebCursorInfoType.TYPE_SOUTH_WEST_PANNING:
+            case WebCursorInfoType.TYPE_WEST_PANNING:
+                assert false : "These pointer icon types are not supported";
+                break;
+            case WebCursorInfoType.TYPE_CUSTOM:
+                assert false : "onCursorChangedToCustom must be called instead";
+                break;
+        }
+        ViewGroup containerView = getContainerView();
+        PointerIcon icon = PointerIcon.getSystemIcon(containerView.getContext(), pointerIconType);
+        containerView.setPointerIcon(icon);
+    }
+
     /**
      * Called whenever the background color of the page changes as notified by Blink.
      * @param color The new ARGB color of the page background.
diff --git a/ui/android/view_android.cc b/ui/android/view_android.cc
index 0dac1cc..fa6e38f 100644
--- a/ui/android/view_android.cc
+++ b/ui/android/view_android.cc
@@ -12,12 +12,14 @@
 #include "base/stl_util.h"
 #include "cc/layers/layer.h"
 #include "jni/ViewAndroidDelegate_jni.h"
+#include "third_party/WebKit/public/platform/WebCursorInfo.h"
 #include "ui/android/event_forwarder.h"
 #include "ui/android/view_client.h"
 #include "ui/android/window_android.h"
 #include "ui/base/layout.h"
 #include "ui/events/android/drag_event_android.h"
 #include "ui/events/android/motion_event_android.h"
+#include "ui/gfx/android/java_bitmap.h"
 #include "url/gurl.h"
 
 namespace ui {
@@ -25,6 +27,7 @@
 using base::android::ConvertUTF8ToJavaString;
 using base::android::JavaRef;
 using base::android::ScopedJavaLocalRef;
+using blink::WebCursorInfo;
 
 ViewAndroid::ScopedAnchorView::ScopedAnchorView(
     JNIEnv* env,
@@ -288,6 +291,23 @@
                                                    jimage);
 }
 
+void ViewAndroid::OnCursorChanged(int type,
+                                  const SkBitmap& custom_image,
+                                  const gfx::Point& hotspot) {
+  ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate());
+  if (delegate.is_null())
+    return;
+  JNIEnv* env = base::android::AttachCurrentThread();
+  if (type == WebCursorInfo::kTypeCustom) {
+    ScopedJavaLocalRef<jobject> java_bitmap =
+        gfx::ConvertToJavaBitmap(&custom_image);
+    Java_ViewAndroidDelegate_onCursorChangedToCustom(env, delegate, java_bitmap,
+                                                     hotspot.x(), hotspot.y());
+  } else {
+    Java_ViewAndroidDelegate_onCursorChanged(env, delegate, type);
+  }
+}
+
 void ViewAndroid::OnBackgroundColorChanged(unsigned int color) {
   ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate());
   if (delegate.is_null())
diff --git a/ui/android/view_android.h b/ui/android/view_android.h
index 6516f00b4..b12c3835 100644
--- a/ui/android/view_android.h
+++ b/ui/android/view_android.h
@@ -14,10 +14,16 @@
 #include "ui/android/ui_android_export.h"
 #include "ui/gfx/geometry/rect_f.h"
 
+class SkBitmap;
+
 namespace cc {
 class Layer;
 }
 
+namespace gfx {
+class Point;
+}
+
 namespace ui {
 class DragEventAndroid;
 class EventForwarder;
@@ -146,6 +152,9 @@
 
   gfx::Size GetPhysicalBackingSize();
   void OnPhysicalBackingSizeChanged(const gfx::Size& size);
+  void OnCursorChanged(int type,
+                       const SkBitmap& custom_image,
+                       const gfx::Point& hotspot);
   void OnBackgroundColorChanged(unsigned int color);
   void OnTopControlsChanged(float top_controls_offset,
                             float top_content_offset);
diff --git a/ui/app_list/app_list_constants.cc b/ui/app_list/app_list_constants.cc
index 1b503f8..2117297 100644
--- a/ui/app_list/app_list_constants.cc
+++ b/ui/app_list/app_list_constants.cc
@@ -134,9 +134,24 @@
 const int kSearchBoxPadding = 16;
 const int kSearchBoxTopPadding = 24;
 
+// Bottom padding of search box in peeking state.
+const int kSearchBoxPeekingBottomPadding = 12;
+
+// Bottom padding of search box in fullscreen state.
+const int kSearchBoxFullscreenBottomPadding = 24;
+
 // The background border corner radius of the search box in fullscreen mode.
 const int kSearchBoxBorderCornerRadiusFullscreen = 24;
 
+// Preferred height of search box.
+const int kSearchBoxPreferredHeight = 48;
+
+// The height of the peeking app list from the bottom of the screen.
+const int kPeekingAppListHeight = 320;
+
+// The height/width of the shelf from the bottom/side of the screen.
+const int kShelfSize = 48;
+
 // Max items allowed in a folder.
 size_t kMaxFolderItems = 16;
 
diff --git a/ui/app_list/app_list_constants.h b/ui/app_list/app_list_constants.h
index 01ab81d..8b96d84 100644
--- a/ui/app_list/app_list_constants.h
+++ b/ui/app_list/app_list_constants.h
@@ -99,7 +99,13 @@
 APP_LIST_EXPORT extern const int kAppsGridLeftRightPaddingFullscreen;
 APP_LIST_EXPORT extern const int kSearchBoxPadding;
 APP_LIST_EXPORT extern const int kSearchBoxTopPadding;
+APP_LIST_EXPORT extern const int kSearchBoxPeekingBottomPadding;
+APP_LIST_EXPORT extern const int kSearchBoxFullscreenBottomPadding;
 APP_LIST_EXPORT extern const int kSearchBoxBorderCornerRadiusFullscreen;
+APP_LIST_EXPORT extern const int kSearchBoxPreferredHeight;
+
+APP_LIST_EXPORT extern const int kPeekingAppListHeight;
+APP_LIST_EXPORT extern const int kShelfSize;
 
 APP_LIST_EXPORT extern size_t kMaxFolderItems;
 APP_LIST_EXPORT extern const size_t kNumFolderTopItems;
diff --git a/ui/app_list/presenter/app_list_presenter_impl.cc b/ui/app_list/presenter/app_list_presenter_impl.cc
index 7872f99..c3d1ebb 100644
--- a/ui/app_list/presenter/app_list_presenter_impl.cc
+++ b/ui/app_list/presenter/app_list_presenter_impl.cc
@@ -177,7 +177,9 @@
   views::Widget* widget = view_->GetWidget();
   ui::Layer* layer = GetLayer(widget);
   layer->GetAnimator()->StopAnimating();
-  gfx::Rect target_bounds = widget->GetWindowBoundsInScreen();
+  gfx::Rect target_bounds = is_fullscreen_app_list_enabled_
+                                ? widget->GetNativeView()->bounds()
+                                : widget->GetWindowBoundsInScreen();
   ui::ScopedLayerAnimationSettings animation(layer->GetAnimator());
   aura::Window* root_window = widget->GetNativeView()->GetRootWindow();
   const gfx::Vector2d offset =
@@ -200,6 +202,10 @@
 
   animation.AddObserver(this);
   layer->SetOpacity(is_visible_ ? 1.0 : 0.0);
+  if (is_fullscreen_app_list_enabled_) {
+    widget->GetNativeView()->SetBounds(target_bounds);
+    return;
+  }
   widget->SetBounds(target_bounds);
 }
 
diff --git a/ui/app_list/search/mixer.cc b/ui/app_list/search/mixer.cc
index c7328e60..0e49894 100644
--- a/ui/app_list/search/mixer.cc
+++ b/ui/app_list/search/mixer.cc
@@ -12,6 +12,7 @@
 
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
+#include "ui/app_list/app_list_features.h"
 #include "ui/app_list/search_provider.h"
 #include "ui/app_list/search_result.h"
 
@@ -47,8 +48,12 @@
 // Used to group relevant providers together for mixing their results.
 class Mixer::Group {
  public:
-  Group(size_t max_results, double multiplier)
-      : max_results_(max_results), multiplier_(multiplier) {}
+  Group(size_t max_results, double multiplier, double boost)
+      : max_results_(max_results),
+        multiplier_(multiplier),
+        boost_(boost),
+        is_fullscreen_app_list_enabled_(
+            features::IsFullscreenAppListEnabled()) {}
   ~Group() {}
 
   void AddProvider(SearchProvider* provider) {
@@ -63,43 +68,44 @@
         DCHECK(!result->id().empty());
 
         // We cannot rely on providers to give relevance scores in the range
-        // [0.0, 1.0] (e.g., PeopleProvider directly gives values from the
-        // Google+ API). Clamp to that range.
+        // [0.0, 1.0]. Clamp to that range.
         const double relevance =
             std::min(std::max(result->relevance(), 0.0), 1.0);
-        double boost = 0.0;
+        double boost = boost_;
 
-        // Recommendations should not be affected by query-to-launch correlation
-        // from KnownResults as it causes recommendations to become dominated by
-        // previously clicked results. This happens because the recommendation
-        // query is the empty string and the clicked results get forever
-        // boosted.
-        if (result->display_type() != SearchResult::DISPLAY_RECOMMENDATION) {
-          KnownResults::const_iterator known_it =
-              known_results.find(result->id());
-          if (known_it != known_results.end()) {
-            switch (known_it->second) {
-              case PERFECT_PRIMARY:
-                boost = 4.0;
-                break;
-              case PREFIX_PRIMARY:
-                boost = 3.75;
-                break;
-              case PERFECT_SECONDARY:
-                boost = 3.25;
-                break;
-              case PREFIX_SECONDARY:
-                boost = 3.0;
-                break;
-              case UNKNOWN_RESULT:
-                NOTREACHED() << "Unknown result in KnownResults?";
-                break;
+        if (!is_fullscreen_app_list_enabled_) {
+          // Recommendations should not be affected by query-to-launch
+          // correlation from KnownResults as it causes recommendations to
+          // become dominated by previously clicked results. This happens
+          // because the recommendation query is the empty string and the
+          // clicked results get forever boosted.
+          if (result->display_type() != SearchResult::DISPLAY_RECOMMENDATION) {
+            KnownResults::const_iterator known_it =
+                known_results.find(result->id());
+            if (known_it != known_results.end()) {
+              switch (known_it->second) {
+                case PERFECT_PRIMARY:
+                  boost = 4.0;
+                  break;
+                case PREFIX_PRIMARY:
+                  boost = 3.75;
+                  break;
+                case PERFECT_SECONDARY:
+                  boost = 3.25;
+                  break;
+                case PREFIX_SECONDARY:
+                  boost = 3.0;
+                  break;
+                case UNKNOWN_RESULT:
+                  NOTREACHED() << "Unknown result in KnownResults?";
+                  break;
+              }
             }
-          }
 
-          // If this is a voice query, voice results receive a massive boost.
-          if (is_voice_query && result->voice_result())
-            boost += 4.0;
+            // If this is a voice query, voice results receive a massive boost.
+            if (is_voice_query && result->voice_result())
+              boost += 4.0;
+          }
         }
 
         results_.emplace_back(result.get(), relevance * multiplier_ + boost);
@@ -117,6 +123,9 @@
   typedef std::vector<SearchProvider*> Providers;
   const size_t max_results_;
   const double multiplier_;
+  const double boost_;
+
+  const bool is_fullscreen_app_list_enabled_;
 
   Providers providers_;  // Not owned.
   SortedResults results_;
@@ -130,8 +139,8 @@
 Mixer::~Mixer() {
 }
 
-size_t Mixer::AddGroup(size_t max_results, double multiplier) {
-  groups_.push_back(base::MakeUnique<Group>(max_results, multiplier));
+size_t Mixer::AddGroup(size_t max_results, double multiplier, double boost) {
+  groups_.push_back(base::MakeUnique<Group>(max_results, multiplier, boost));
   return groups_.size() - 1;
 }
 
diff --git a/ui/app_list/search/mixer.h b/ui/app_list/search/mixer.h
index 253de6fd3..41818396 100644
--- a/ui/app_list/search/mixer.h
+++ b/ui/app_list/search/mixer.h
@@ -38,8 +38,9 @@
   // chosen from this group (if 0, will allow unlimited results from this
   // group). If there aren't enough results from all groups, more than
   // |max_results| may be chosen from this group. Each result in the group will
-  // have its score multiplied by |multiplier|. Returns the group's group_id.
-  size_t AddGroup(size_t max_results, double multiplier);
+  // have its score multiplied by |multiplier| and added by |boost|. Returns the
+  // group's group_id.
+  size_t AddGroup(size_t max_results, double multiplier, double boost);
 
   // Associates a provider with a mixer group.
   void AddProviderToGroup(size_t group_id, SearchProvider* provider);
diff --git a/ui/app_list/search/mixer_unittest.cc b/ui/app_list/search/mixer_unittest.cc
index fb4f91d..66546b3 100644
--- a/ui/app_list/search/mixer_unittest.cc
+++ b/ui/app_list/search/mixer_unittest.cc
@@ -131,9 +131,12 @@
 
     mixer_.reset(new Mixer(results_.get()));
 
-    size_t apps_group_id = mixer_->AddGroup(kMaxAppsGroupResults, 1.0);
-    size_t omnibox_group_id = mixer_->AddGroup(kMaxOmniboxResults, 1.0);
-    size_t webstore_group_id = mixer_->AddGroup(kMaxWebstoreResults, 0.5);
+    // TODO(warx): when fullscreen app list is default enabled, modify this test
+    // to (1) test answer card/apps group having relevance boost, (2) remove
+    // known results boost tests.
+    size_t apps_group_id = mixer_->AddGroup(kMaxAppsGroupResults, 1.0, 0.0);
+    size_t omnibox_group_id = mixer_->AddGroup(kMaxOmniboxResults, 1.0, 0.0);
+    size_t webstore_group_id = mixer_->AddGroup(kMaxWebstoreResults, 0.5, 0.0);
 
     mixer_->AddProviderToGroup(apps_group_id, providers_[0].get());
     mixer_->AddProviderToGroup(omnibox_group_id, providers_[1].get());
diff --git a/ui/app_list/search_controller.cc b/ui/app_list/search_controller.cc
index cae0583..b2628f25 100644
--- a/ui/app_list/search_controller.cc
+++ b/ui/app_list/search_controller.cc
@@ -103,8 +103,10 @@
   result->InvokeAction(action_index, event_flags);
 }
 
-size_t SearchController::AddGroup(size_t max_results, double multiplier) {
-  return mixer_->AddGroup(max_results, multiplier);
+size_t SearchController::AddGroup(size_t max_results,
+                                  double multiplier,
+                                  double boost) {
+  return mixer_->AddGroup(max_results, multiplier, boost);
 }
 
 void SearchController::AddProvider(size_t group_id,
diff --git a/ui/app_list/search_controller.h b/ui/app_list/search_controller.h
index ea57747a..4c6c9390 100644
--- a/ui/app_list/search_controller.h
+++ b/ui/app_list/search_controller.h
@@ -42,7 +42,7 @@
                           int event_flags);
 
   // Adds a new mixer group. See Mixer::AddGroup.
-  size_t AddGroup(size_t max_results, double multiplier);
+  size_t AddGroup(size_t max_results, double multiplier, double boost);
 
   // Takes ownership of |provider| and associates it with given mixer group.
   void AddProvider(size_t group_id, std::unique_ptr<SearchProvider> provider);
diff --git a/ui/app_list/views/app_list_page.cc b/ui/app_list/views/app_list_page.cc
index 9799f94..0953b75 100644
--- a/ui/app_list/views/app_list_page.cc
+++ b/ui/app_list/views/app_list_page.cc
@@ -30,6 +30,11 @@
                                      AppListModel::State from_state,
                                      AppListModel::State to_state) {}
 
+gfx::Rect AppListPage::GetPageBoundsDuringDragging(
+    AppListModel::State state) const {
+  return GetPageBoundsForState(state);
+}
+
 gfx::Rect AppListPage::GetSearchBoxBounds() const {
   DCHECK(contents_view_);
   return contents_view_->GetDefaultSearchBoxBounds();
diff --git a/ui/app_list/views/app_list_page.h b/ui/app_list/views/app_list_page.h
index f3c452b..0b07e42 100644
--- a/ui/app_list/views/app_list_page.h
+++ b/ui/app_list/views/app_list_page.h
@@ -36,6 +36,10 @@
   // Returns where this page should move to when the given state is active.
   virtual gfx::Rect GetPageBoundsForState(AppListModel::State state) const = 0;
 
+  // Returns the bounds of the page during dragging.
+  virtual gfx::Rect GetPageBoundsDuringDragging(
+      AppListModel::State state) const;
+
   // Returns where the search box should be when this page is shown. Is at the
   // top of the app list by default, in the contents view's coordinate space.
   virtual gfx::Rect GetSearchBoxBounds() const;
diff --git a/ui/app_list/views/app_list_view.cc b/ui/app_list/views/app_list_view.cc
index 7dd66588..6efa0e8 100644
--- a/ui/app_list/views/app_list_view.cc
+++ b/ui/app_list/views/app_list_view.cc
@@ -58,9 +58,6 @@
 // The margin from the edge to the speech UI.
 constexpr int kSpeechUIMargin = 12;
 
-// The height of the peeking app list from the bottom of the screen.
-constexpr int kPeekingAppListHeight = 320;
-
 // The height of the half app list from the bottom of the screen.
 constexpr int kHalfAppListHeight = 561;
 
@@ -178,16 +175,8 @@
 
 AppListView::AppListView(AppListViewDelegate* delegate)
     : delegate_(delegate),
-      app_list_main_view_(nullptr),
-      speech_view_(nullptr),
-      search_box_focus_host_(nullptr),
-      search_box_widget_(nullptr),
-      search_box_view_(nullptr),
       is_fullscreen_app_list_enabled_(features::IsFullscreenAppListEnabled()),
-      processing_scroll_event_series_(false),
-      app_list_state_(PEEKING),
       display_observer_(this),
-      overlay_view_(nullptr),
       animation_observer_(new HideViewAnimationObserver()) {
   CHECK(delegate);
   delegate_->GetSpeechUI()->AddObserver(this);
@@ -432,22 +421,17 @@
                                        int initial_apps_page) {
   const display::Display display_nearest_view = GetDisplayNearestView();
   const gfx::Rect display_work_area_bounds = display_nearest_view.work_area();
-  const int bottom_of_screen = display_nearest_view.size().height();
 
   // Set the widget height to the shelf height to replace the shelf background
   // on show animation with no flicker. In shelf mode we set the bounds to the
   // top of the screen because the widget does not animate.
-  const int overlay_view_bounds_y =
-      is_side_shelf_ ? 0 : (bottom_of_screen - kShelfSize);
-  const int overlay_view_bounds_x =
-      is_side_shelf_ ? 0 : display_work_area_bounds.x();
-  const int overlay_view_bounds_width =
-      display_work_area_bounds.width() + (is_side_shelf_ ? kShelfSize : 0);
-  const int overlay_view_bounds_height =
-      display_work_area_bounds.height() + (is_side_shelf_ ? 0 : kShelfSize);
+  const int overlay_view_bounds_y = is_side_shelf_
+                                        ? display_work_area_bounds.y()
+                                        : display_work_area_bounds.bottom();
   gfx::Rect app_list_overlay_view_bounds(
-      overlay_view_bounds_x, overlay_view_bounds_y, overlay_view_bounds_width,
-      overlay_view_bounds_height);
+      display_nearest_view.bounds().x(), overlay_view_bounds_y,
+      display_nearest_view.bounds().width(),
+      display_nearest_view.bounds().height());
 
   fullscreen_widget_ = new views::Widget;
   views::Widget::InitParams app_list_overlay_view_params(
@@ -458,11 +442,18 @@
   app_list_overlay_view_params.delegate = this;
   app_list_overlay_view_params.opacity =
       views::Widget::InitParams::TRANSLUCENT_WINDOW;
-  app_list_overlay_view_params.bounds = app_list_overlay_view_bounds;
   app_list_overlay_view_params.layer_type = ui::LAYER_SOLID_COLOR;
   fullscreen_widget_->Init(app_list_overlay_view_params);
 
+  // Set bounds directly in screen coordinates to avoid screen position
+  // controller setting bounds in the display where the widget has the largest
+  // intersection.
+  fullscreen_widget_->GetNativeView()->SetBoundsInScreen(
+      app_list_overlay_view_bounds, GetDisplayNearestView());
+
   overlay_view_ = new AppListOverlayView(0 /* no corners */);
+
+  work_area_bottom_ = fullscreen_widget_->GetWorkAreaBoundsInScreen().bottom();
 }
 
 void AppListView::InitializeBubble(gfx::NativeView parent,
@@ -484,10 +475,17 @@
   overlay_view_->SetBoundsRect(GetContentsBounds());
 }
 
-void AppListView::HandleClickOrTap() {
+void AppListView::HandleClickOrTap(ui::LocatedEvent* event) {
   if (!is_fullscreen_app_list_enabled_)
     return;
 
+  // No-op if app list is on fullscreen all apps state and the event location is
+  // within apps grid view's bounds.
+  if (app_list_state_ == FULLSCREEN_ALL_APPS &&
+      GetAppsGridView()->GetBoundsInScreen().Contains(event->location())) {
+    return;
+  }
+
   if (!search_box_view_->is_search_box_active()) {
     SetState(CLOSED);
     return;
@@ -498,17 +496,19 @@
 }
 
 void AppListView::StartDrag(const gfx::Point& location) {
+  // Convert drag point from widget coordinates to screen coordinates because
+  // the widget bounds changes during the dragging.
   initial_drag_point_ = location;
+  ConvertPointToScreen(this, &initial_drag_point_);
+  initial_window_bounds_ = fullscreen_widget_->GetWindowBoundsInScreen();
 }
 
 void AppListView::UpdateDrag(const gfx::Point& location) {
-  // Update the bounds of the widget while maintaining the
-  // relative position of the top of the widget and the mouse/gesture.
-  // Block drags north of 0 and recalculate the initial_drag_point_.
-  int new_y_position = location.y() - initial_drag_point_.y() +
-                       fullscreen_widget_->GetWindowBoundsInScreen().y();
-  if (new_y_position < 0)
-    initial_drag_point_ = location;
+  // Update the widget bounds based on the initial widget bounds and drag delta.
+  gfx::Point location_in_screen_coordinates = location;
+  ConvertPointToScreen(this, &location_in_screen_coordinates);
+  int new_y_position = location_in_screen_coordinates.y() -
+                       initial_drag_point_.y() + initial_window_bounds_.y();
 
   UpdateYPositionAndOpacity(new_y_position,
                             GetAppListBackgroundOpacityDuringDragging(),
@@ -520,8 +520,7 @@
   if (app_list_state_ == CLOSED)
     return;
 
-  // Restores opacity of all the items in app list if dragging ends.
-  UpdateOpacity(kAppListOpacity, true /* is_end_gesture */);
+  DraggingLayout();
   // Change the app list state based on where the drag ended. If fling velocity
   // was over the threshold, snap to the next state in the direction of the
   // fling.
@@ -585,13 +584,15 @@
         break;
     }
 
-    gfx::Point location_in_screen_coordinates = location;
-    ConvertPointToScreen(this, &location_in_screen_coordinates);
-    const int new_y_position =
-        location_in_screen_coordinates.y() - initial_drag_point_.y();
     const int app_list_threshold =
         app_list_height / kAppListThresholdDenominator;
-    const int drag_delta = app_list_y_for_state - new_y_position;
+    gfx::Point location_in_screen_coordinates = location;
+    ConvertPointToScreen(this, &location_in_screen_coordinates);
+    const int drag_delta =
+        initial_drag_point_.y() - location_in_screen_coordinates.y();
+    const int location_y_in_current_display =
+        location_in_screen_coordinates.y() -
+        GetDisplayNearestView().bounds().y();
     switch (app_list_state_) {
       case FULLSCREEN_ALL_APPS:
         if (std::abs(drag_delta) > app_list_threshold)
@@ -608,7 +609,7 @@
       case HALF:
         if (std::abs(drag_delta) > app_list_threshold) {
           SetState(drag_delta > 0 ? FULLSCREEN_SEARCH : CLOSED);
-        } else if (location_in_screen_coordinates.y() >=
+        } else if (location_y_in_current_display >=
                    display_height - kAppListBezelMargin) {
           // If the user drags to the bezel, close the app list.
           SetState(CLOSED);
@@ -619,7 +620,7 @@
       case PEEKING:
         if (std::abs(drag_delta) > app_list_threshold) {
           SetState(drag_delta > 0 ? FULLSCREEN_ALL_APPS : CLOSED);
-        } else if (location_in_screen_coordinates.y() >=
+        } else if (location_y_in_current_display >=
                    display_height - kAppListBezelMargin) {
           // If the user drags to the bezel, close the app list.
           SetState(CLOSED);
@@ -638,6 +639,12 @@
   return display::Screen::GetScreen()->GetDisplayNearestView(parent_window());
 }
 
+AppsGridView* AppListView::GetAppsGridView() const {
+  return app_list_main_view_->contents_view()
+      ->apps_container_view()
+      ->apps_grid_view();
+}
+
 void AppListView::OnBeforeBubbleWidgetInit(views::Widget::InitParams* params,
                                            views::Widget* widget) const {
   if (!params->native_widget) {
@@ -692,7 +699,7 @@
   switch (event->type()) {
     case ui::ET_MOUSE_PRESSED:
       event->SetHandled();
-      HandleClickOrTap();
+      HandleClickOrTap(event);
       break;
     case ui::ET_MOUSEWHEEL:
       if (HandleScroll(event))
@@ -709,32 +716,37 @@
 
   switch (event->type()) {
     case ui::ET_GESTURE_TAP:
-      processing_scroll_event_series_ = false;
+      is_in_drag_ = false;
       event->SetHandled();
-      HandleClickOrTap();
+      HandleClickOrTap(event);
       break;
     case ui::ET_SCROLL_FLING_START:
     case ui::ET_GESTURE_SCROLL_BEGIN:
       if (is_side_shelf_)
         return;
-      processing_scroll_event_series_ = true;
-      StartDrag(event->location());
+      // There may be multiple scroll begin events in one drag because the
+      // relative location of the finger and widget is almost unchanged and
+      // scroll begin event occurs when the relative location changes beyond a
+      // threshold. So avoid resetting the initial drag point in drag.
+      if (!is_in_drag_)
+        StartDrag(event->location());
+      is_in_drag_ = true;
       event->SetHandled();
       break;
     case ui::ET_GESTURE_SCROLL_UPDATE:
       if (is_side_shelf_)
         return;
-      processing_scroll_event_series_ = true;
+      is_in_drag_ = true;
       last_fling_velocity_ = event->details().scroll_y();
       UpdateDrag(event->location());
       event->SetHandled();
       break;
     case ui::ET_GESTURE_END:
-      if (!processing_scroll_event_series_)
+      if (!is_in_drag_)
         break;
       if (is_side_shelf_)
         return;
-      processing_scroll_event_series_ = false;
+      is_in_drag_ = false;
       EndDrag(event->location());
       event->SetHandled();
       break;
@@ -944,7 +956,7 @@
       break;
   }
 
-  gfx::Rect target_bounds = fullscreen_widget_->GetWindowBoundsInScreen();
+  gfx::Rect target_bounds = fullscreen_widget_->GetNativeView()->bounds();
   target_bounds.set_y(target_state_y);
 
   std::unique_ptr<ui::LayerAnimationElement> bounds_animation_element =
@@ -992,22 +1004,24 @@
 void AppListView::UpdateYPositionAndOpacity(int y_position_in_screen,
                                             float background_opacity,
                                             bool is_end_gesture) {
+  is_in_drag_ = !is_end_gesture;
+  background_opacity_ = background_opacity;
   if (is_end_gesture) {
     SetState(FULLSCREEN_ALL_APPS);
   } else {
     gfx::Rect new_widget_bounds = fullscreen_widget_->GetWindowBoundsInScreen();
-    new_widget_bounds.set_y(std::max(y_position_in_screen, 0));
-    fullscreen_widget_->SetBounds(new_widget_bounds);
+    app_list_y_position_in_screen_ =
+        std::max(y_position_in_screen, GetDisplayNearestView().bounds().y());
+    new_widget_bounds.set_y(app_list_y_position_in_screen_);
+    fullscreen_widget_->GetNativeView()->SetBoundsInScreen(
+        new_widget_bounds, GetDisplayNearestView());
   }
 
-  UpdateOpacity(background_opacity, is_end_gesture);
+  DraggingLayout();
 }
 
-PaginationModel* AppListView::GetAppsPaginationModel() {
-  return app_list_main_view_->contents_view()
-      ->apps_container_view()
-      ->apps_grid_view()
-      ->pagination_model();
+PaginationModel* AppListView::GetAppsPaginationModel() const {
+  return GetAppsGridView()->pagination_model();
 }
 
 void AppListView::OnSpeechRecognitionStateChanged(
@@ -1085,8 +1099,7 @@
     return;
 
   // Set the |fullscreen_widget_| size to fit the new display metrics.
-  gfx::Size size = GetDisplayNearestView().work_area().size();
-  size.Enlarge(0, kShelfSize);
+  gfx::Size size = GetDisplayNearestView().size();
   fullscreen_widget_->SetSize(size);
 
   // Update the |fullscreen_widget_| bounds to accomodate the new work
@@ -1094,28 +1107,25 @@
   SetState(app_list_state_);
 }
 
-void AppListView::UpdateOpacity(float background_opacity, bool is_end_gesture) {
+void AppListView::DraggingLayout() {
   app_list_background_shield_->layer()->SetOpacity(
-      is_end_gesture ? kAppListOpacity : background_opacity);
-  gfx::Rect work_area_bounds = fullscreen_widget_->GetWorkAreaBoundsInScreen();
-  search_box_view_->UpdateOpacity(work_area_bounds.bottom(), is_end_gesture);
-  app_list_main_view_->contents_view()
-      ->apps_container_view()
-      ->apps_grid_view()
-      ->UpdateOpacity(work_area_bounds.bottom(), is_end_gesture);
+      is_in_drag_ ? background_opacity_ : kAppListOpacity);
+
+  // Updates the opacity of the items in the app list.
+  search_box_view_->UpdateOpacity(app_list_y_position_in_screen_);
+  GetAppsGridView()->UpdateOpacity(app_list_y_position_in_screen_);
+
+  app_list_main_view_->contents_view()->Layout();
 
   if (app_list_state_ == PEEKING) {
     app_list_main_view_->contents_view()->start_page_view()->UpdateOpacity(
-        work_area_bounds.bottom(), is_end_gesture);
+        work_area_bottom_, !is_in_drag_);
   }
 }
 
 float AppListView::GetAppListBackgroundOpacityDuringDragging() {
   float top_of_applist = fullscreen_widget_->GetWindowBoundsInScreen().y();
-  float work_area_bottom =
-      fullscreen_widget_->GetWorkAreaBoundsInScreen().bottom();
-
-  float dragging_height = std::max((work_area_bottom - top_of_applist), 0.f);
+  float dragging_height = std::max((work_area_bottom_ - top_of_applist), 0.f);
   float coefficient =
       std::min(dragging_height / (kNumOfShelfSize * kShelfSize), 1.0f);
   return coefficient * kAppListOpacity;
diff --git a/ui/app_list/views/app_list_view.h b/ui/app_list/views/app_list_view.h
index b052b49..4119f77 100644
--- a/ui/app_list/views/app_list_view.h
+++ b/ui/app_list/views/app_list_view.h
@@ -27,6 +27,7 @@
 class AppListMainView;
 class AppListModel;
 class AppListViewDelegate;
+class AppsGridView;
 class HideViewAnimationObserver;
 class PaginationModel;
 class SearchBoxView;
@@ -43,9 +44,6 @@
                                     public display::DisplayObserver,
                                     public AppListViewDelegateObserver {
  public:
-  // The height/width of the shelf from the bottom/side of the screen.
-  static constexpr int kShelfSize = 48;
-
   // Number of the size of shelf. Used to determine the opacity of items in the
   // app list during dragging.
   static constexpr float kNumOfShelfSize = 2.0;
@@ -128,6 +126,11 @@
   void Layout() override;
   void SchedulePaintInRect(const gfx::Rect& rect) override;
 
+  // Overridden from ui::EventHandler:
+  void OnScrollEvent(ui::ScrollEvent* event) override;
+  void OnMouseEvent(ui::MouseEvent* event) override;
+  void OnGestureEvent(ui::GestureEvent* event) override;
+
   // Called when tablet mode starts and ends.
   void OnTabletModeChanged(bool started);
 
@@ -153,7 +156,7 @@
                                  bool is_end_gesture);
 
   // Gets the PaginationModel owned by this view's apps grid.
-  PaginationModel* GetAppsPaginationModel();
+  PaginationModel* GetAppsPaginationModel() const;
 
   views::Widget* get_fullscreen_widget_for_test() const {
     return fullscreen_widget_;
@@ -163,9 +166,9 @@
 
   views::Widget* search_box_widget() const { return search_box_widget_; }
 
-  SearchBoxView* search_box_view() { return search_box_view_; }
+  SearchBoxView* search_box_view() const { return search_box_view_; }
 
-  AppListMainView* app_list_main_view() { return app_list_main_view_; }
+  AppListMainView* app_list_main_view() const { return app_list_main_view_; }
 
   bool is_fullscreen() const {
     return app_list_state_ == FULLSCREEN_ALL_APPS ||
@@ -174,6 +177,14 @@
 
   bool is_tablet_mode() const { return is_tablet_mode_; }
 
+  bool is_in_drag() const { return is_in_drag_; }
+
+  int app_list_y_position_in_screen() const {
+    return app_list_y_position_in_screen_;
+  }
+
+  int work_area_bottom() const { return work_area_bottom_; }
+
  private:
   friend class test::AppListViewTestApi;
 
@@ -189,7 +200,7 @@
 
   // Closes the AppListView when a click or tap event propogates to the
   // AppListView.
-  void HandleClickOrTap();
+  void HandleClickOrTap(ui::LocatedEvent* event);
 
   // Initializes |initial_drag_point_|.
   void StartDrag(const gfx::Point& location);
@@ -205,6 +216,9 @@
   // Gets the display nearest to the parent window.
   display::Display GetDisplayNearestView() const;
 
+  // Gets the apps grid view owned by this view.
+  AppsGridView* GetAppsGridView() const;
+
   // Overridden from views::BubbleDialogDelegateView:
   void OnBeforeBubbleWidgetInit(views::Widget::InitParams* params,
                                 views::Widget* widget) const override;
@@ -215,11 +229,6 @@
   bool WidgetHasHitTestMask() const override;
   void GetWidgetHitTestMask(gfx::Path* mask) const override;
 
-  // Overridden from ui::EventHandler:
-  void OnScrollEvent(ui::ScrollEvent* event) override;
-  void OnMouseEvent(ui::MouseEvent* event) override;
-  void OnGestureEvent(ui::GestureEvent* event) override;
-
   // Overridden from views::WidgetObserver:
   void OnWidgetDestroying(views::Widget* widget) override;
   void OnWidgetVisibilityChanged(views::Widget* widget, bool visible) override;
@@ -232,8 +241,8 @@
   void OnDisplayMetricsChanged(const display::Display& display,
                                uint32_t changed_metrics) override;
 
-  // Updates opacity of both background and items in the app list.
-  void UpdateOpacity(float background_opacity, bool is_end_gesture);
+  // Layouts the app list during dragging.
+  void DraggingLayout();
 
   // Gets app list background opacity during dragging.
   float GetAppListBackgroundOpacityDuringDragging();
@@ -246,13 +255,15 @@
 
   AppListViewDelegate* delegate_;  // Weak. Owned by AppListService.
 
-  AppListMainView* app_list_main_view_;
-  SpeechView* speech_view_;
+  AppListMainView* app_list_main_view_ = nullptr;
+  SpeechView* speech_view_ = nullptr;
   views::Widget* fullscreen_widget_ = nullptr;  // Owned by AppListView.
 
-  views::View* search_box_focus_host_;  // Owned by the views hierarchy.
-  views::Widget* search_box_widget_;    // Owned by the app list's widget.
-  SearchBoxView* search_box_view_;      // Owned by |search_box_widget_|.
+  views::View* search_box_focus_host_ =
+      nullptr;  // Owned by the views hierarchy.
+  views::Widget* search_box_widget_ =
+      nullptr;                                // Owned by the app list's widget.
+  SearchBoxView* search_box_view_ = nullptr;  // Owned by |search_box_widget_|.
   // Owned by the app list's widget. Null if the fullscreen app list is not
   // enabled.
   views::View* app_list_background_shield_ = nullptr;
@@ -261,22 +272,37 @@
   // Whether the shelf is oriented on the side.
   bool is_side_shelf_ = false;
 
-  // The gap between the initial gesture event and the top of the window.
+  // True if the user is in the process of gesture-dragging on opened app list,
+  // or dragging the app list from shelf.
+  bool is_in_drag_ = false;
+
+  // Y position of the app list in screen space coordinate during dragging.
+  int app_list_y_position_in_screen_ = 0;
+
+  // Bottom of work area.
+  int work_area_bottom_ = 0;
+
+  // The opacity of app list background during dragging.
+  float background_opacity_ = 0.f;
+
+  // The location of initial gesture event in screen coordinates.
   gfx::Point initial_drag_point_;
+
+  // The rectangle of initial widget's window in screen coordinates.
+  gfx::Rect initial_window_bounds_;
+
   // The velocity of the gesture event.
   float last_fling_velocity_ = 0;
   // Whether the fullscreen app list feature is enabled.
   const bool is_fullscreen_app_list_enabled_;
-  // Whether a series of scroll events are being processed.
-  bool processing_scroll_event_series_;
   // The state of the app list, controlled via SetState().
-  AppListState app_list_state_;
+  AppListState app_list_state_ = PEEKING;
   // An observer that notifies AppListView when the display has changed.
   ScopedObserver<display::Screen, display::DisplayObserver> display_observer_;
 
   // A semi-transparent white overlay that covers the app list while dialogs
   // are open.
-  views::View* overlay_view_;
+  views::View* overlay_view_ = nullptr;
 
   std::unique_ptr<HideViewAnimationObserver> animation_observer_;
 
diff --git a/ui/app_list/views/app_list_view_unittest.cc b/ui/app_list/views/app_list_view_unittest.cc
index e4e02a4..fb42ae7 100644
--- a/ui/app_list/views/app_list_view_unittest.cc
+++ b/ui/app_list/views/app_list_view_unittest.cc
@@ -584,6 +584,36 @@
             start_page_view()->GetSelectedIndexForTest());
 }
 
+// Tests that when a click or tap event propagates to the AppListView, if the
+// event location is within the bounds of AppsGridView, do not close the
+// AppListView.
+TEST_F(AppListViewFullscreenTest, TapAndClickWithinAppsGridView) {
+  Initialize(0, false, false);
+  delegate_->GetTestModel()->PopulateApps(kInitialItems);
+  Show();
+  view_->SetState(AppListView::FULLSCREEN_ALL_APPS);
+  EXPECT_EQ(AppListView::FULLSCREEN_ALL_APPS, view_->app_list_state());
+  ContentsView* contents_view = view_->app_list_main_view()->contents_view();
+  AppsContainerView* container_view = contents_view->apps_container_view();
+  const gfx::Rect grid_view_bounds =
+      container_view->apps_grid_view()->GetBoundsInScreen();
+  gfx::Point target_point = grid_view_bounds.origin();
+  target_point.Offset(100, 100);
+  ASSERT_TRUE(grid_view_bounds.Contains(target_point));
+
+  // Tests gesture tap within apps grid view doesn't close app list view.
+  ui::GestureEvent tap(target_point.x(), target_point.y(), 0, base::TimeTicks(),
+                       ui::GestureEventDetails(ui::ET_GESTURE_TAP));
+  view_->OnGestureEvent(&tap);
+  EXPECT_EQ(AppListView::FULLSCREEN_ALL_APPS, view_->app_list_state());
+
+  // Tests mouse click within apps grid view doesn't close app list view.
+  ui::MouseEvent mouse_click(ui::ET_MOUSE_PRESSED, target_point, target_point,
+                             base::TimeTicks(), 0, 0);
+  view_->OnMouseEvent(&mouse_click);
+  EXPECT_EQ(AppListView::FULLSCREEN_ALL_APPS, view_->app_list_state());
+}
+
 // Tests displaying the app list and performs a standard set of checks on its
 // top level views. Then closes the window.
 TEST_F(AppListViewTest, DisplayTest) {
diff --git a/ui/app_list/views/apps_container_view.cc b/ui/app_list/views/apps_container_view.cc
index ab652ab5..10ce60e 100644
--- a/ui/app_list/views/apps_container_view.cc
+++ b/ui/app_list/views/apps_container_view.cc
@@ -15,9 +15,11 @@
 #include "ui/app_list/views/app_list_folder_view.h"
 #include "ui/app_list/views/app_list_item_view.h"
 #include "ui/app_list/views/app_list_main_view.h"
+#include "ui/app_list/views/app_list_view.h"
 #include "ui/app_list/views/apps_grid_view.h"
 #include "ui/app_list/views/contents_view.h"
 #include "ui/app_list/views/folder_background_view.h"
+#include "ui/app_list/views/search_box_view.h"
 #include "ui/app_list/views/suggestions_container_view.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/events/event.h"
@@ -25,6 +27,15 @@
 
 namespace app_list {
 
+// Initial search box top padding in shelf mode.
+constexpr int kSearchBoxInitalTopPadding = 12;
+
+// Top padding of search box in peeking state.
+constexpr int kSearchBoxPeekingTopPadding = 24;
+
+// Minimum top padding of search box in fullscreen state.
+constexpr int kSearchBoxMinimumTopPadding = 24;
+
 AppsContainerView::AppsContainerView(AppListMainView* app_list_main_view,
                                      AppListModel* model)
     : is_fullscreen_app_list_enabled_(features::IsFullscreenAppListEnabled()) {
@@ -163,16 +174,58 @@
   if (!is_fullscreen_app_list_enabled_)
     return AppListPage::GetSearchBoxBounds();
 
-  // Makes search box and content vertically centered in screen.
   gfx::Rect search_box_bounds(contents_view()->GetDefaultSearchBoxBounds());
-  const int total_height =
-      GetDefaultContentsBounds().bottom() - search_box_bounds.y();
-  search_box_bounds.set_y(
-      std::max(search_box_bounds.y(),
-               (contents_view()->GetDisplayHeight() - total_height) / 2));
+  if (contents_view()->app_list_view()->is_in_drag())
+    search_box_bounds.set_y(GetSearchBoxTopPaddingDuringDragging());
+  else
+    search_box_bounds.set_y(GetSearchBoxFinalTopPadding());
+
   return search_box_bounds;
 }
 
+gfx::Rect AppsContainerView::GetPageBoundsDuringDragging(
+    AppListModel::State state) const {
+  float app_list_y_position_in_screen =
+      contents_view()->app_list_view()->app_list_y_position_in_screen();
+  float work_area_bottom = contents_view()->app_list_view()->work_area_bottom();
+  float drag_amount =
+      std::max(0.f, work_area_bottom - app_list_y_position_in_screen);
+
+  float y = 0;
+  float peeking_final_y =
+      kSearchBoxPeekingTopPadding + kSearchBoxPreferredHeight +
+      kSearchBoxPeekingBottomPadding - kSearchBoxFullscreenBottomPadding;
+  if (drag_amount <= (kPeekingAppListHeight - kShelfSize)) {
+    // App list is dragged from collapsed to peeking, which moved up at most
+    // |kPeekingAppListHeight - kShelfSize| (272px). The top padding of apps
+    // container view changes from |-kSearchBoxFullscreenBottomPadding| to
+    // |kSearchBoxPeekingTopPadding + kSearchBoxPreferredHeight +
+    // kSearchBoxPeekingBottomPadding - kSearchBoxFullscreenBottomPadding|.
+    y = std::ceil(
+        ((peeking_final_y + kSearchBoxFullscreenBottomPadding) * drag_amount) /
+            (kPeekingAppListHeight - kShelfSize) -
+        kSearchBoxFullscreenBottomPadding);
+  } else {
+    // App list is dragged from peeking to fullscreen, which moved up at most
+    // |peeking_to_fullscreen_height|. The top padding of apps container view
+    // changes from |peeking_final_y| to |final_y|.
+    float final_y = GetSearchBoxFinalTopPadding() + kSearchBoxPreferredHeight;
+    float peeking_to_fullscreen_height =
+        contents_view()->GetDisplayHeight() - kPeekingAppListHeight;
+    y = std::ceil((final_y - peeking_final_y) *
+                      (drag_amount - (kPeekingAppListHeight - kShelfSize)) /
+                      peeking_to_fullscreen_height +
+                  peeking_final_y);
+    y = std::max(std::min(final_y, y), peeking_final_y);
+  }
+
+  gfx::Rect onscreen_bounds = GetPageBoundsForState(state);
+  if (state == AppListModel::STATE_APPS)
+    onscreen_bounds.set_y(y);
+
+  return onscreen_bounds;
+}
+
 void AppsContainerView::OnTopIconAnimationsComplete() {
   --top_icon_animation_pending_count_;
 
@@ -273,4 +326,49 @@
     apps_grid_view_->activated_folder_item_view()->SetVisible(false);
 }
 
+int AppsContainerView::GetSearchBoxFinalTopPadding() const {
+  gfx::Rect search_box_bounds(contents_view()->GetDefaultSearchBoxBounds());
+  const int total_height =
+      GetDefaultContentsBounds().bottom() - search_box_bounds.y();
+
+  // Makes search box and content vertically centered in contents_view.
+  int y = std::max(search_box_bounds.y(),
+                   (contents_view()->GetDisplayHeight() - total_height) / 2);
+
+  // Top padding of the searchbox should not be smaller than
+  // |kSearchBoxMinimumTopPadding|
+  return std::max(y, kSearchBoxMinimumTopPadding);
+}
+
+int AppsContainerView::GetSearchBoxTopPaddingDuringDragging() const {
+  float searchbox_final_y = GetSearchBoxFinalTopPadding();
+  float peeking_to_fullscreen_height =
+      contents_view()->GetDisplayHeight() - kPeekingAppListHeight;
+  float drag_amount = std::max(
+      0, contents_view()->app_list_view()->work_area_bottom() -
+             contents_view()->app_list_view()->app_list_y_position_in_screen());
+
+  if (drag_amount <= (kPeekingAppListHeight - kShelfSize)) {
+    // App list is dragged from collapsed to peeking, which moved up at most
+    // |kPeekingAppListHeight - kShelfSize| (272px). The top padding of search
+    // box changes from |kSearchBoxInitalTopPadding| to
+    // |kSearchBoxPeekingTopPadding|,
+    return std::ceil(
+        (kSearchBoxPeekingTopPadding - kSearchBoxInitalTopPadding) +
+        ((kSearchBoxPeekingTopPadding - kSearchBoxInitalTopPadding) *
+         drag_amount) /
+            (kPeekingAppListHeight - kShelfSize));
+  } else {
+    // App list is dragged from peeking to fullscreen, which moved up at most
+    // |peeking_to_fullscreen_height|. The top padding of search box changes
+    // from |kSearchBoxPeekingTopPadding| to |searchbox_final_y|.
+    int y = (kSearchBoxPeekingTopPadding +
+             std::ceil((searchbox_final_y - kSearchBoxPeekingTopPadding) *
+                       (drag_amount - (kPeekingAppListHeight - kShelfSize)) /
+                       peeking_to_fullscreen_height));
+    y = std::max(kSearchBoxPeekingTopPadding, y);
+    return y;
+  }
+}
+
 }  // namespace app_list
diff --git a/ui/app_list/views/apps_container_view.h b/ui/app_list/views/apps_container_view.h
index c55654d..934c9529 100644
--- a/ui/app_list/views/apps_container_view.h
+++ b/ui/app_list/views/apps_container_view.h
@@ -73,6 +73,8 @@
   void OnWillBeShown() override;
   gfx::Rect GetPageBoundsForState(AppListModel::State state) const override;
   gfx::Rect GetSearchBoxBounds() const override;
+  gfx::Rect GetPageBoundsDuringDragging(
+      AppListModel::State state) const override;
 
   // TopIconAnimationObserver overrides:
   void OnTopIconAnimationsComplete() override;
@@ -106,6 +108,12 @@
 
   void PrepareToShowApps(AppListFolderItem* folder_item);
 
+  // Gets the final top padding of search box.
+  int GetSearchBoxFinalTopPadding() const;
+
+  // Gets the top padding of search box during dragging.
+  int GetSearchBoxTopPaddingDuringDragging() const;
+
   // The views below are owned by views hierarchy.
   AppsGridView* apps_grid_view_ = nullptr;
   AppListFolderView* app_list_folder_view_ = nullptr;
diff --git a/ui/app_list/views/apps_grid_view.cc b/ui/app_list/views/apps_grid_view.cc
index 20811b3..facb7c3 100644
--- a/ui/app_list/views/apps_grid_view.cc
+++ b/ui/app_list/views/apps_grid_view.cc
@@ -97,9 +97,6 @@
 // UI.
 constexpr int kFolderDroppingCircleRadius = 39;
 
-// Bottom padding for search box.
-constexpr int kSearchBoxBottomPadding = 24;
-
 // Padding between suggested apps tiles and all apps indicator.
 constexpr int kSuggestionsAllAppsIndicatorPadding = 16;
 
@@ -109,6 +106,21 @@
 // The height of gradient fade-out zones.
 constexpr int kFadeoutZoneHeight = 24;
 
+// Range of the fraction of app list from collapsed to peeking that suggested
+// apps should change opacity.
+constexpr float kSuggestedAppsOpacityStartFraction = 0.3f;
+constexpr float kSuggestedAppsOpacityEndFraction = 0.7f;
+
+// Range of the fraction of app list from peeking to fullscreen that all apps
+// indictor should change opacity.
+constexpr float kAllAppsIndicatorOpacityStartFraction = 0.7f;
+constexpr float kAllAppsIndicatorOpacityEndFraction = 1.0f;
+
+// Range of the height of centerline above screen bottom that all apps should
+// change opacity.
+constexpr float kAllAppsOpacityStartPx = 8.0f;
+constexpr float kAllAppsOpacityEndPx = 144.0f;
+
 // Returns the size of a tile view excluding its padding.
 gfx::Size GetTileViewSize() {
   if (features::IsFullscreenAppListEnabled())
@@ -774,7 +786,7 @@
 
   if (is_fullscreen_app_list_enabled_) {
     fadeout_layer_delegate_->layer()->SetBounds(layer()->bounds());
-    rect.Inset(0, kSearchBoxBottomPadding, 0, 0);
+    rect.Inset(0, kSearchBoxFullscreenBottomPadding, 0, 0);
   }
 
   if (!folder_delegate_) {
@@ -1618,14 +1630,6 @@
   return folder_delegate_->IsOEMFolder();
 }
 
-void AppsGridView::UpdateOpacityOfItem(views::View* view_item,
-                                       float centroid_y) {
-  float delta_y = std::max(work_area_bottom_ - centroid_y, 0.0f);
-  float opacity = std::min(
-      delta_y / (AppListView::kNumOfShelfSize * AppListView::kShelfSize), 1.0f);
-  view_item->layer()->SetOpacity(is_end_gesture_ ? 1.0f : opacity);
-}
-
 void AppsGridView::DispatchDragEventForReparent(Pointer pointer,
                                                 const gfx::Point& drag_point) {
   folder_delegate_->DispatchDragEventForReparent(pointer, drag_point);
@@ -1689,36 +1693,75 @@
   item_list_ = nullptr;
 }
 
-void AppsGridView::UpdateOpacity(float work_area_bottom, bool is_end_gesture) {
-  work_area_bottom_ = work_area_bottom;
-  is_end_gesture_ = is_end_gesture;
+void AppsGridView::UpdateOpacity(int app_list_y_position_in_screen) {
+  int work_area_bottom = contents_view_->app_list_view()->work_area_bottom();
+  bool is_in_drag = contents_view_->app_list_view()->is_in_drag();
+  // The opacity of suggested apps is a function of the fractional displacement
+  // of the app list from collapsed(0) to peeking(1) state. When the fraction
+  // changes from |kSuggestedAppsOpacityStartFraction| to
+  // |kSuggestedAppsOpacityEndFraction|, the opacity of suggested apps changes
+  // from 0.f to 1.0f.
+  float fraction =
+      std::max<float>(work_area_bottom - app_list_y_position_in_screen, 0) /
+      (kPeekingAppListHeight - kShelfSize);
+  float opacity =
+      std::min(std::max((fraction - kSuggestedAppsOpacityStartFraction) /
+                            (kSuggestedAppsOpacityEndFraction -
+                             kSuggestedAppsOpacityStartFraction),
+                        0.f),
+               1.0f);
+  suggestions_container_->layer()->SetOpacity(is_in_drag ? opacity : 1.0f);
 
-  // Updates the opacity of suggestions container.
-  gfx::Rect suggestions_container_bounds =
-      suggestions_container_->GetBoundsInScreen();
-  UpdateOpacityOfItem(suggestions_container_,
-                      suggestions_container_bounds.CenterPoint().y());
+  // The opacity of all apps indicator is a function of the fractional
+  // displacement of the app list from peeking(0) to fullscreen(1) state. When
+  // the fraction changes from |kAllAppsIndicatorOpacityStartFraction| to
+  // |kAllAppsIndicatorOpacityEndFraction|, the opacity of all apps indicator
+  // changes from 0.f to 1.0f.
+  float peeking_to_fullscreen_height =
+      contents_view_->GetDisplayHeight() - kPeekingAppListHeight;
+  float drag_amount = (work_area_bottom + kShelfSize) -
+                      app_list_y_position_in_screen - kPeekingAppListHeight;
+  fraction = std::max(drag_amount / peeking_to_fullscreen_height, 0.f);
+  opacity = std::min(std::max((fraction + kAllAppsIndicatorOpacityEndFraction -
+                               kAllAppsIndicatorOpacityStartFraction - 1.0f) /
+                                  (kAllAppsIndicatorOpacityEndFraction -
+                                   kAllAppsIndicatorOpacityStartFraction),
+                              0.f),
+                     1.0f);
+  all_apps_indicator_->layer()->SetOpacity(is_in_drag ? opacity : 1.0f);
 
-  // Updates the opacity of all apps indicator.
-  gfx::Rect all_apps_indicator_bounds =
-      all_apps_indicator_->GetLabelBoundsInScreen();
-  UpdateOpacityOfItem(all_apps_indicator_,
-                      all_apps_indicator_bounds.CenterPoint().y());
-
-  // Updates the opacity of all apps.
+  // Updates the opacity of all apps. The opacity of the app starting at 0.f
+  // when the ceterline of the app is |kAllAppsOpacityStartPx| above the bottom
+  // of work area and transitioning to 1.0f by the time the centerline reaches
+  // |kAllAppsOpacityEndPx| above the work area bottom.
+  float centerline_above_work_area = 0.f;
   for (int i = 0; i < view_model_.view_size(); ++i) {
     AppListItemView* item_view = GetItemViewAt(i);
     if (item_view != drag_view_) {
       gfx::Rect view_bounds = view_model_.ideal_bounds(i);
       views::View::ConvertRectToScreen(this, &view_bounds);
-      UpdateOpacityOfItem(item_view, view_bounds.CenterPoint().y());
+      centerline_above_work_area = std::max<float>(
+          work_area_bottom + kShelfSize - view_bounds.CenterPoint().y(), 0.f);
+      opacity = std::min(
+          std::max((centerline_above_work_area - kAllAppsOpacityStartPx) /
+                       (kAllAppsOpacityEndPx - kAllAppsOpacityStartPx),
+                   0.f),
+          1.0f);
+      item_view->layer()->SetOpacity(is_in_drag ? opacity : 1.0f);
     }
   }
 
-  // Updates the opacity of page switcher buttons.
+  // Updates the opacity of page switcher buttons. The same rule as all apps.
   if (page_switcher_view_) {
     gfx::Rect switcher_bounds = page_switcher_view_->GetBoundsInScreen();
-    UpdateOpacityOfItem(page_switcher_view_, switcher_bounds.CenterPoint().y());
+    centerline_above_work_area = std::max<float>(
+        work_area_bottom + kShelfSize - switcher_bounds.CenterPoint().y(), 0.f);
+    opacity = std::min(
+        std::max((centerline_above_work_area - kAllAppsOpacityStartPx) /
+                     (kAllAppsOpacityEndPx - kAllAppsOpacityStartPx),
+                 0.f),
+        1.0f);
+    page_switcher_view_->layer()->SetOpacity(is_in_drag ? opacity : 1.0f);
   }
 }
 
@@ -2249,13 +2292,13 @@
     return 0;
 
   if (page == 0) {
-    return kSearchBoxBottomPadding +
+    return kSearchBoxFullscreenBottomPadding +
            suggestions_container_->GetPreferredSize().height() +
            kSuggestionsAllAppsIndicatorPadding +
            all_apps_indicator_->GetPreferredSize().height() +
            kAllAppsIndicatorExtraPadding;
   }
-  return kSearchBoxBottomPadding - kTileVerticalPadding;
+  return kSearchBoxFullscreenBottomPadding - kTileVerticalPadding;
 }
 
 gfx::Rect AppsGridView::GetExpectedTileBounds(int slot) const {
diff --git a/ui/app_list/views/apps_grid_view.h b/ui/app_list/views/apps_grid_view.h
index 37cb41f4..68c04cad 100644
--- a/ui/app_list/views/apps_grid_view.h
+++ b/ui/app_list/views/apps_grid_view.h
@@ -193,11 +193,8 @@
   // The grid view must be inside a folder view.
   void OnFolderItemRemoved();
 
-  // Updates the opacity of all the items in the grid during dragging. The
-  // opacity of each item is based on how much the item's |centroid_y| is above
-  // |work_area_bottom|. If |is_end_gesture| is true, set all the items opacity
-  // to 1.0f.
-  void UpdateOpacity(float work_area_bottom, bool is_end_gesture);
+  // Updates the opacity of all the items in the grid during dragging.
+  void UpdateOpacity(int app_list_y_position_in_screen);
 
   // Return the view model for test purposes.
   const views::ViewModelT<AppListItemView>* view_model_for_test() const {
@@ -488,9 +485,6 @@
   // Returns true if the grid view is under an OEM folder.
   bool IsUnderOEMFolder();
 
-  // Updates opacity of |view_item| in the app list based on |centroid_y|.
-  void UpdateOpacityOfItem(views::View* view_item, float centroid_y);
-
   AppListModel* model_ = nullptr;         // Owned by AppListView.
   AppListItemList* item_list_ = nullptr;  // Not owned.
 
@@ -599,9 +593,6 @@
   // True if the fullscreen app list feature is enabled.
   const bool is_fullscreen_app_list_enabled_;
 
-  // The bottom of work area.
-  float work_area_bottom_ = 0.f;
-
   // True if it is the end gesture from shelf dragging.
   bool is_end_gesture_ = false;
 
diff --git a/ui/app_list/views/contents_view.cc b/ui/app_list/views/contents_view.cc
index c6c9f75..99b4ce6 100644
--- a/ui/app_list/views/contents_view.cc
+++ b/ui/app_list/views/contents_view.cc
@@ -487,7 +487,10 @@
     return;
 
   for (AppListPage* page : app_list_pages_) {
-    page->SetBoundsRect(page->GetPageBoundsForState(GetActiveState()));
+    if (app_list_view_ && app_list_view_->is_in_drag())
+      page->SetBoundsRect(page->GetPageBoundsDuringDragging(GetActiveState()));
+    else
+      page->SetBoundsRect(page->GetPageBoundsForState(GetActiveState()));
   }
 
   // The search box is contained in a widget so set the bounds of the widget
diff --git a/ui/app_list/views/contents_view.h b/ui/app_list/views/contents_view.h
index f8ff40d..56a55c04 100644
--- a/ui/app_list/views/contents_view.h
+++ b/ui/app_list/views/contents_view.h
@@ -105,6 +105,8 @@
 
   AppListMainView* app_list_main_view() const { return app_list_main_view_; }
 
+  AppListView* app_list_view() const { return app_list_view_; }
+
   // Returns the pagination model for the ContentsView.
   const PaginationModel& pagination_model() { return pagination_model_; }
 
diff --git a/ui/app_list/views/search_box_view.cc b/ui/app_list/views/search_box_view.cc
index c8a5c68..2b62cfc 100644
--- a/ui/app_list/views/search_box_view.cc
+++ b/ui/app_list/views/search_box_view.cc
@@ -22,6 +22,7 @@
 #include "ui/app_list/views/app_list_view.h"
 #include "ui/app_list/views/contents_view.h"
 #include "ui/app_list/views/search_box_view_delegate.h"
+#include "ui/app_list/views/search_result_page_view.h"
 #include "ui/base/ime/text_input_flags.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
@@ -54,7 +55,6 @@
 constexpr int kInnerPadding = 24;
 constexpr int kPreferredWidth = 360;
 constexpr int kPreferredWidthFullscreen = 544;
-constexpr int kSearchBoxPreferredHeight = 48;
 constexpr int kSearchBoxBorderWidth = 4;
 
 constexpr SkColor kHintTextColor = SkColorSetARGBMacro(0xFF, 0xA0, 0xA0, 0xA0);
@@ -69,6 +69,11 @@
 
 constexpr int kLightVibrantBlendAlpha = 0xE6;
 
+// Range of the fraction of app list from collapsed to peeking that search box
+// should change opacity.
+constexpr float kOpacityStartFraction = 0.1f;
+constexpr float kOpacityEndFraction = 0.6f;
+
 // Color of placeholder text in zero query state.
 constexpr SkColor kZeroQuerySearchboxColor =
     SkColorSetARGBMacro(0x8A, 0x00, 0x00, 0x00);
@@ -644,21 +649,28 @@
   return background_color_;
 }
 
-void SearchBoxView::UpdateOpacity(float work_area_bottom, bool is_end_gesture) {
-  float opacity = 1.0f;
-  if (!is_end_gesture) {
-    gfx::Rect search_box_bounds = this->GetBoundsInScreen();
-    float delta_y = std::max(
-        (work_area_bottom - search_box_bounds.CenterPoint().y()), 0.0f);
-    opacity = std::min(
-        delta_y / (AppListView::kNumOfShelfSize * AppListView::kShelfSize),
-        1.0f);
-  }
+void SearchBoxView::UpdateOpacity(int app_list_y_position_in_screen) {
+  // The opacity of searchbox is a function of the fractional displacement of
+  // the app list from collapsed(0) to peeking(1) state. When the fraction
+  // changes from |kOpacityStartFraction| to |kOpaticyEndFraction|, the opacity
+  // of searchbox changes from 0.f to 1.0f.
+  ContentsView* contents_view = static_cast<ContentsView*>(contents_view_);
+  float fraction =
+      std::max<float>(0, contents_view->app_list_view()->work_area_bottom() -
+                             app_list_y_position_in_screen) /
+      (kPeekingAppListHeight - kShelfSize);
 
-  // Restores the opacity of searchbox to 1.0f if it is the end of the gesture
-  // dragging.
+  float opacity = 1.0f;
+  if (contents_view->app_list_view()->is_in_drag())
+    opacity =
+        std::min(std::max((fraction - kOpacityStartFraction) /
+                              (kOpacityEndFraction - kOpacityStartFraction),
+                          0.f),
+                 1.0f);
+
+  // Restores the opacity of searchbox if the gesture dragging ends.
   this->layer()->SetOpacity(opacity);
-  contents_view_->layer()->SetOpacity(opacity);
+  contents_view->search_results_page_view()->layer()->SetOpacity(opacity);
 }
 
 bool SearchBoxView::IsArrowKey(const ui::KeyEvent& event) {
diff --git a/ui/app_list/views/search_box_view.h b/ui/app_list/views/search_box_view.h
index 25af2b31..d0de2036 100644
--- a/ui/app_list/views/search_box_view.h
+++ b/ui/app_list/views/search_box_view.h
@@ -135,7 +135,7 @@
   SkColor GetBackgroundColorForState(AppListModel::State state) const;
 
   // Updates the opacity of the searchbox.
-  void UpdateOpacity(float work_area_bottom, bool is_end_gesture);
+  void UpdateOpacity(int app_list_y_position_in_screen);
 
   // Used only in the tests to get the current search icon.
   views::ImageView* get_search_icon_for_test() { return search_icon_; }
diff --git a/ui/app_list/views/search_result_page_view.cc b/ui/app_list/views/search_result_page_view.cc
index 0f4d9ad..4e4146b 100644
--- a/ui/app_list/views/search_result_page_view.cc
+++ b/ui/app_list/views/search_result_page_view.cc
@@ -144,6 +144,9 @@
     : selected_index_(0),
       is_fullscreen_app_list_enabled_(features::IsFullscreenAppListEnabled()),
       contents_view_(new views::View) {
+  SetPaintToLayer();
+  layer()->SetFillsBoundsOpaquely(false);
+
   if (is_fullscreen_app_list_enabled_) {
     contents_view_->SetLayoutManager(
         new views::BoxLayout(views::BoxLayout::kVertical, gfx::Insets(), 0));
diff --git a/ui/app_list/views/start_page_view.cc b/ui/app_list/views/start_page_view.cc
index f982bb6..bd95de0 100644
--- a/ui/app_list/views/start_page_view.cc
+++ b/ui/app_list/views/start_page_view.cc
@@ -47,7 +47,6 @@
 
 // Layout constants.
 constexpr int kInstantContainerSpacing = 24;
-constexpr int kSearchBoxBottomPadding = 12;
 constexpr int kSearchBoxAndTilesSpacing = 35;
 constexpr int kStartPageSearchBoxWidth = 480;
 constexpr int kStartPageSearchBoxWidthFullscreen = 544;
@@ -147,8 +146,8 @@
   views::BoxLayout* instant_layout_manager = new views::BoxLayout(
       views::BoxLayout::kVertical, gfx::Insets(), kInstantContainerSpacing);
   if (is_fullscreen_app_list_enabled_) {
-    instant_layout_manager->set_inside_border_insets(
-        gfx::Insets(kSearchBoxTopPadding, 0, kSearchBoxBottomPadding, 0));
+    instant_layout_manager->set_inside_border_insets(gfx::Insets(
+        kSearchBoxTopPadding, 0, kSearchBoxPeekingBottomPadding, 0));
   } else {
     instant_layout_manager->set_inside_border_insets(
         gfx::Insets(0, 0, kSearchBoxAndTilesSpacing, 0));
@@ -446,8 +445,8 @@
 void StartPageView::UpdateOpacityOfItem(views::View* view_item,
                                         float centroid_y) {
   float delta_y = std::max(work_area_bottom_ - centroid_y, 0.f);
-  float opacity = std::min(
-      delta_y / (AppListView::kNumOfShelfSize * AppListView::kShelfSize), 1.0f);
+  float opacity =
+      std::min(delta_y / (AppListView::kNumOfShelfSize * kShelfSize), 1.0f);
   view_item->layer()->SetOpacity(is_end_gesture_ ? 1.0f : opacity);
 }
 
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn
index f1e6c73b..002a68d0 100644
--- a/ui/base/BUILD.gn
+++ b/ui/base/BUILD.gn
@@ -377,8 +377,6 @@
 
   if (is_fuchsia) {
     sources += [
-      "clipboard/clipboard_fuchsia.cc",
-      "clipboard/clipboard_fuchsia.h",
       "idle/idle_fuchsia.cc",
       "resource/resource_bundle_fuchsia.cc",
     ]
@@ -649,10 +647,6 @@
   if (is_android || is_ios) {
     sources -= [ "device_form_factor_desktop.cc" ]
   }
-
-  if (is_fuchsia) {
-    sources += [ "cursor/cursor_loader_fuchsia.cc" ]
-  }
 }
 
 static_library("test_support") {
diff --git a/ui/base/clipboard/clipboard_fuchsia.cc b/ui/base/clipboard/clipboard_fuchsia.cc
deleted file mode 100644
index 72de3f4..0000000
--- a/ui/base/clipboard/clipboard_fuchsia.cc
+++ /dev/null
@@ -1,281 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/base/clipboard/clipboard_fuchsia.h"
-
-#include <algorithm>
-#include <utility>
-
-#include "base/callback.h"
-#include "base/lazy_instance.h"
-#include "base/stl_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/synchronization/lock.h"
-#include "base/time/time.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/gfx/geometry/size.h"
-
-namespace ui {
-
-const char kMimeTypeBitmap[] = "image/bmp";
-
-// Clipboard::FormatType implementation.
-Clipboard::FormatType::FormatType() {}
-
-Clipboard::FormatType::FormatType(const std::string& native_format)
-    : data_(native_format) {}
-
-Clipboard::FormatType::~FormatType() {}
-
-std::string Clipboard::FormatType::Serialize() const {
-  return data_;
-}
-
-// static
-Clipboard::FormatType Clipboard::FormatType::Deserialize(
-    const std::string& serialization) {
-  return FormatType(serialization);
-}
-
-bool Clipboard::FormatType::operator<(const FormatType& other) const {
-  return data_ < other.data_;
-}
-
-bool Clipboard::FormatType::Equals(const FormatType& other) const {
-  return data_ == other.data_;
-}
-
-// Various predefined FormatTypes.
-// static
-Clipboard::FormatType Clipboard::GetFormatType(
-    const std::string& format_string) {
-  return FormatType::Deserialize(format_string);
-}
-
-// static
-const Clipboard::FormatType& Clipboard::GetUrlFormatType() {
-  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeURIList));
-  return type;
-}
-
-// static
-const Clipboard::FormatType& Clipboard::GetUrlWFormatType() {
-  return GetUrlFormatType();
-}
-
-// static
-const Clipboard::FormatType& Clipboard::GetPlainTextFormatType() {
-  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeText));
-  return type;
-}
-
-// static
-const Clipboard::FormatType& Clipboard::GetPlainTextWFormatType() {
-  return GetPlainTextFormatType();
-}
-
-// static
-const Clipboard::FormatType& Clipboard::GetWebKitSmartPasteFormatType() {
-  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebkitSmartPaste));
-  return type;
-}
-
-// static
-const Clipboard::FormatType& Clipboard::GetHtmlFormatType() {
-  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeHTML));
-  return type;
-}
-
-// static
-const Clipboard::FormatType& Clipboard::GetRtfFormatType() {
-  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeRTF));
-  return type;
-}
-
-// static
-const Clipboard::FormatType& Clipboard::GetBitmapFormatType() {
-  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeBitmap));
-  return type;
-}
-
-// static
-const Clipboard::FormatType& Clipboard::GetWebCustomDataFormatType() {
-  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebCustomData));
-  return type;
-}
-
-// static
-const Clipboard::FormatType& Clipboard::GetPepperCustomDataFormatType() {
-  CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypePepperCustomData));
-  return type;
-}
-
-// Clipboard factory method.
-// static
-Clipboard* Clipboard::Create() {
-  return new ClipboardFuchsia;
-}
-
-// ClipboardFuchsia implementation.
-
-ClipboardFuchsia::ClipboardFuchsia() {
-  DCHECK(CalledOnValidThread());
-}
-
-ClipboardFuchsia::~ClipboardFuchsia() {
-  DCHECK(CalledOnValidThread());
-}
-
-void ClipboardFuchsia::OnPreShutdown() {}
-
-uint64_t ClipboardFuchsia::GetSequenceNumber(ClipboardType type) const {
-  DCHECK(CalledOnValidThread());
-  NOTIMPLEMENTED();
-  return 0;
-}
-
-bool ClipboardFuchsia::IsFormatAvailable(const Clipboard::FormatType& format,
-                                         ClipboardType type) const {
-  DCHECK(CalledOnValidThread());
-  DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
-  NOTIMPLEMENTED();
-  return false;
-}
-
-void ClipboardFuchsia::Clear(ClipboardType type) {
-  DCHECK(CalledOnValidThread());
-  DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
-  NOTIMPLEMENTED();
-}
-
-void ClipboardFuchsia::ReadAvailableTypes(ClipboardType type,
-                                          std::vector<base::string16>* types,
-                                          bool* contains_filenames) const {
-  DCHECK(CalledOnValidThread());
-  DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
-  NOTIMPLEMENTED();
-  types->clear();
-  *contains_filenames = false;
-}
-
-void ClipboardFuchsia::ReadText(ClipboardType type,
-                                base::string16* result) const {
-  DCHECK(CalledOnValidThread());
-  DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
-  NOTREACHED();
-}
-
-void ClipboardFuchsia::ReadAsciiText(ClipboardType type,
-                                     std::string* result) const {
-  DCHECK(CalledOnValidThread());
-  DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
-  NOTREACHED();
-}
-
-// Note: |src_url| isn't really used. It is only implemented in Windows
-void ClipboardFuchsia::ReadHTML(ClipboardType type,
-                                base::string16* markup,
-                                std::string* src_url,
-                                uint32_t* fragment_start,
-                                uint32_t* fragment_end) const {
-  DCHECK(CalledOnValidThread());
-  DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
-  NOTREACHED();
-}
-
-void ClipboardFuchsia::ReadRTF(ClipboardType type, std::string* result) const {
-  DCHECK(CalledOnValidThread());
-  NOTREACHED();
-}
-
-SkBitmap ClipboardFuchsia::ReadImage(ClipboardType type) const {
-  DCHECK(CalledOnValidThread());
-  DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
-  NOTREACHED();
-  return SkBitmap();
-}
-
-void ClipboardFuchsia::ReadCustomData(ClipboardType clipboard_type,
-                                      const base::string16& type,
-                                      base::string16* result) const {
-  DCHECK(CalledOnValidThread());
-  NOTREACHED();
-}
-
-void ClipboardFuchsia::ReadBookmark(base::string16* title,
-                                    std::string* url) const {
-  DCHECK(CalledOnValidThread());
-  NOTREACHED();
-}
-
-void ClipboardFuchsia::ReadData(const Clipboard::FormatType& format,
-                                std::string* result) const {
-  DCHECK(CalledOnValidThread());
-  NOTIMPLEMENTED();
-  result->clear();
-}
-
-base::Time ClipboardFuchsia::GetLastModifiedTime() const {
-  DCHECK(CalledOnValidThread());
-  NOTIMPLEMENTED();
-  return base::Time();
-}
-
-void ClipboardFuchsia::ClearLastModifiedTime() {
-  DCHECK(CalledOnValidThread());
-  NOTIMPLEMENTED();
-}
-
-// Main entry point used to write several values in the clipboard.
-void ClipboardFuchsia::WriteObjects(ClipboardType type,
-                                    const ObjectMap& objects) {
-  DCHECK(CalledOnValidThread());
-  DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
-  NOTIMPLEMENTED();
-}
-
-void ClipboardFuchsia::WriteText(const char* text_data, size_t text_len) {
-  DCHECK(CalledOnValidThread());
-  NOTIMPLEMENTED();
-}
-
-void ClipboardFuchsia::WriteHTML(const char* markup_data,
-                                 size_t markup_len,
-                                 const char* url_data,
-                                 size_t url_len) {
-  DCHECK(CalledOnValidThread());
-  NOTIMPLEMENTED();
-}
-
-void ClipboardFuchsia::WriteRTF(const char* rtf_data, size_t data_len) {
-  DCHECK(CalledOnValidThread());
-  NOTIMPLEMENTED();
-}
-
-void ClipboardFuchsia::WriteBookmark(const char* title_data,
-                                     size_t title_len,
-                                     const char* url_data,
-                                     size_t url_len) {
-  DCHECK(CalledOnValidThread());
-  NOTIMPLEMENTED();
-}
-
-void ClipboardFuchsia::WriteWebSmartPaste() {
-  DCHECK(CalledOnValidThread());
-  NOTIMPLEMENTED();
-}
-
-void ClipboardFuchsia::WriteBitmap(const SkBitmap& bitmap) {
-  DCHECK(CalledOnValidThread());
-  NOTIMPLEMENTED();
-}
-
-void ClipboardFuchsia::WriteData(const Clipboard::FormatType& format,
-                                 const char* data_data,
-                                 size_t data_len) {
-  DCHECK(CalledOnValidThread());
-  NOTIMPLEMENTED();
-}
-
-}  // namespace ui
diff --git a/ui/base/clipboard/clipboard_fuchsia.h b/ui/base/clipboard/clipboard_fuchsia.h
deleted file mode 100644
index ca68893a..0000000
--- a/ui/base/clipboard/clipboard_fuchsia.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_BASE_CLIPBOARD_CLIPBOARD_FUCHSIA_H_
-#define UI_BASE_CLIPBOARD_CLIPBOARD_FUCHSIA_H_
-
-#include "ui/base/clipboard/clipboard.h"
-
-#include "base/macros.h"
-#include "base/time/time.h"
-
-namespace ui {
-
-// This is a stub implementation of Clipboard for Fuchsia.
-// TODO(fuchsia): Implement this class.
-class ClipboardFuchsia : public Clipboard {
- private:
-  friend class Clipboard;
-
-  ClipboardFuchsia();
-  ~ClipboardFuchsia() override;
-
-  // Clipboard overrides:
-  void OnPreShutdown() override;
-  uint64_t GetSequenceNumber(ClipboardType type) const override;
-  bool IsFormatAvailable(const FormatType& format,
-                         ClipboardType type) const override;
-  void Clear(ClipboardType type) override;
-  void ReadAvailableTypes(ClipboardType type,
-                          std::vector<base::string16>* types,
-                          bool* contains_filenames) const override;
-  void ReadText(ClipboardType type, base::string16* result) const override;
-  void ReadAsciiText(ClipboardType type, std::string* result) const override;
-  void ReadHTML(ClipboardType type,
-                base::string16* markup,
-                std::string* src_url,
-                uint32_t* fragment_start,
-                uint32_t* fragment_end) const override;
-  void ReadRTF(ClipboardType type, std::string* result) const override;
-  SkBitmap ReadImage(ClipboardType type) const override;
-  void ReadCustomData(ClipboardType clipboard_type,
-                      const base::string16& type,
-                      base::string16* result) const override;
-  void ReadBookmark(base::string16* title, std::string* url) const override;
-  void ReadData(const FormatType& format, std::string* result) const override;
-  base::Time GetLastModifiedTime() const override;
-  void ClearLastModifiedTime() override;
-  void WriteObjects(ClipboardType type, const ObjectMap& objects) override;
-  void WriteText(const char* text_data, size_t text_len) override;
-  void WriteHTML(const char* markup_data,
-                 size_t markup_len,
-                 const char* url_data,
-                 size_t url_len) override;
-  void WriteRTF(const char* rtf_data, size_t data_len) override;
-  void WriteBookmark(const char* title_data,
-                     size_t title_len,
-                     const char* url_data,
-                     size_t url_len) override;
-  void WriteWebSmartPaste() override;
-  void WriteBitmap(const SkBitmap& bitmap) override;
-  void WriteData(const FormatType& format,
-                 const char* data_data,
-                 size_t data_len) override;
-
-  DISALLOW_COPY_AND_ASSIGN(ClipboardFuchsia);
-};
-
-}  // namespace ui
-
-#endif  // UI_BASE_CLIPBOARD_CLIPBOARD_FUCHSIA_H_
diff --git a/ui/base/cursor/cursor_loader_fuchsia.cc b/ui/base/cursor/cursor_loader_fuchsia.cc
deleted file mode 100644
index a7e4280..0000000
--- a/ui/base/cursor/cursor_loader_fuchsia.cc
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/base/cursor/cursor_loader.h"
-
-#include "base/logging.h"
-
-namespace ui {
-
-CursorLoader* CursorLoader::Create() {
-  NOTIMPLEMENTED();
-  return nullptr;
-}
-
-}  // namespace ui
diff --git a/ui/base/ime/BUILD.gn b/ui/base/ime/BUILD.gn
index cc69675..6d44738 100644
--- a/ui/base/ime/BUILD.gn
+++ b/ui/base/ime/BUILD.gn
@@ -52,11 +52,11 @@
     "composition_text.h",
     "composition_text_util_pango.cc",
     "composition_text_util_pango.h",
-    "composition_underline.h",
     "ime_bridge.cc",
     "ime_bridge.h",
     "ime_engine_handler_interface.h",
     "ime_input_context_handler_interface.h",
+    "ime_text_span.h",
     "infolist_entry.cc",
     "infolist_entry.h",
     "input_method.h",
@@ -199,4 +199,11 @@
       "//ui/ozone",
     ]
   }
+
+  if (is_fuchsia) {
+    sources -= [
+      "input_method_auralinux.cc",
+      "input_method_auralinux.h",
+    ]
+  }
 }
diff --git a/ui/base/ime/composition_text.cc b/ui/base/ime/composition_text.cc
index a2e583f6..3ee2ae3 100644
--- a/ui/base/ime/composition_text.cc
+++ b/ui/base/ime/composition_text.cc
@@ -16,15 +16,15 @@
 
 void CompositionText::Clear() {
   text.clear();
-  underlines.clear();
+  ime_text_spans.clear();
   selection = gfx::Range();
 }
 
 void CompositionText::CopyFrom(const CompositionText& obj) {
   Clear();
   text = obj.text;
-  for (size_t i = 0; i < obj.underlines.size(); i++) {
-    underlines.push_back(obj.underlines[i]);
+  for (size_t i = 0; i < obj.ime_text_spans.size(); i++) {
+    ime_text_spans.push_back(obj.ime_text_spans[i]);
   }
   selection = obj.selection;
 }
diff --git a/ui/base/ime/composition_text.h b/ui/base/ime/composition_text.h
index ba56c62..f46dc3c 100644
--- a/ui/base/ime/composition_text.h
+++ b/ui/base/ime/composition_text.h
@@ -8,7 +8,7 @@
 #include <stddef.h>
 
 #include "base/strings/string16.h"
-#include "ui/base/ime/composition_underline.h"
+#include "ui/base/ime/ime_text_span.h"
 #include "ui/base/ime/ui_base_ime_export.h"
 #include "ui/gfx/range/range.h"
 
@@ -21,12 +21,11 @@
   ~CompositionText();
 
   bool operator==(const CompositionText& rhs) const {
-    if ((this->text != rhs.text) ||
-        (this->selection != rhs.selection) ||
-        (this->underlines.size() != rhs.underlines.size()))
+    if ((this->text != rhs.text) || (this->selection != rhs.selection) ||
+        (this->ime_text_spans.size() != rhs.ime_text_spans.size()))
       return false;
-    for (size_t i = 0; i < this->underlines.size(); ++i) {
-      if (this->underlines[i] != rhs.underlines[i])
+    for (size_t i = 0; i < this->ime_text_spans.size(); ++i) {
+      if (this->ime_text_spans[i] != rhs.ime_text_spans[i])
         return false;
     }
     return true;
@@ -43,10 +42,8 @@
   // Content of the composition text.
   base::string16 text;
 
-  // Underline information of the composition text.
-  // They must be sorted in ascending order by their start_offset and cannot be
-  // overlapped with each other.
-  CompositionUnderlines underlines;
+  // ImeTextSpan information for the composition text.
+  ImeTextSpans ime_text_spans;
 
   // Selection range in the composition text. It represents the caret position
   // if the range length is zero. Usually it's used for representing the target
diff --git a/ui/base/ime/composition_text_unittest.cc b/ui/base/ime/composition_text_unittest.cc
index c03090a5..c1623af6 100644
--- a/ui/base/ime/composition_text_unittest.cc
+++ b/ui/base/ime/composition_text_unittest.cc
@@ -13,21 +13,21 @@
 
 TEST(CompositionTextTest, CopyTest) {
   const base::string16 kSampleText = base::UTF8ToUTF16("Sample Text");
-  const CompositionUnderline kSampleUnderline1(10, 20, SK_ColorBLACK, false,
-                                               SK_ColorTRANSPARENT);
+  const ImeTextSpan kSampleUnderline1(10, 20, SK_ColorBLACK, false,
+                                      SK_ColorTRANSPARENT);
 
-  const CompositionUnderline kSampleUnderline2(11, 21, SK_ColorBLACK, true,
-                                               SK_ColorTRANSPARENT);
+  const ImeTextSpan kSampleUnderline2(11, 21, SK_ColorBLACK, true,
+                                      SK_ColorTRANSPARENT);
 
-  const CompositionUnderline kSampleUnderline3(12, 22, SK_ColorRED, false,
-                                               SK_ColorTRANSPARENT);
+  const ImeTextSpan kSampleUnderline3(12, 22, SK_ColorRED, false,
+                                      SK_ColorTRANSPARENT);
 
   // Make CompositionText
   CompositionText text;
   text.text = kSampleText;
-  text.underlines.push_back(kSampleUnderline1);
-  text.underlines.push_back(kSampleUnderline2);
-  text.underlines.push_back(kSampleUnderline3);
+  text.ime_text_spans.push_back(kSampleUnderline1);
+  text.ime_text_spans.push_back(kSampleUnderline2);
+  text.ime_text_spans.push_back(kSampleUnderline3);
   text.selection.set_start(30);
   text.selection.set_end(40);
 
@@ -35,15 +35,16 @@
   text2.CopyFrom(text);
 
   EXPECT_EQ(text.text, text2.text);
-  EXPECT_EQ(text.underlines.size(), text2.underlines.size());
-  for (size_t i = 0; i < text.underlines.size(); ++i) {
-    EXPECT_EQ(text.underlines[i].start_offset,
-              text2.underlines[i].start_offset);
-    EXPECT_EQ(text.underlines[i].end_offset, text2.underlines[i].end_offset);
-    EXPECT_EQ(text.underlines[i].color, text2.underlines[i].color);
-    EXPECT_EQ(text.underlines[i].thick, text2.underlines[i].thick);
-    EXPECT_EQ(text.underlines[i].background_color,
-              text2.underlines[i].background_color);
+  EXPECT_EQ(text.ime_text_spans.size(), text2.ime_text_spans.size());
+  for (size_t i = 0; i < text.ime_text_spans.size(); ++i) {
+    EXPECT_EQ(text.ime_text_spans[i].start_offset,
+              text2.ime_text_spans[i].start_offset);
+    EXPECT_EQ(text.ime_text_spans[i].end_offset,
+              text2.ime_text_spans[i].end_offset);
+    EXPECT_EQ(text.ime_text_spans[i].color, text2.ime_text_spans[i].color);
+    EXPECT_EQ(text.ime_text_spans[i].thick, text2.ime_text_spans[i].thick);
+    EXPECT_EQ(text.ime_text_spans[i].background_color,
+              text2.ime_text_spans[i].background_color);
   }
 
   EXPECT_EQ(text.selection.start(), text2.selection.start());
diff --git a/ui/base/ime/composition_text_util_pango.cc b/ui/base/ime/composition_text_util_pango.cc
index b8a9297..8b30ff6 100644
--- a/ui/base/ime/composition_text_util_pango.cc
+++ b/ui/base/ime/composition_text_util_pango.cc
@@ -75,44 +75,41 @@
 
       if (background_attr || underline_attr) {
         // Use a black thin underline by default.
-        CompositionUnderline underline(char16_offsets[start],
-                                       char16_offsets[end],
-                                       SK_ColorBLACK,
-                                       false,
-                                       SK_ColorTRANSPARENT);
+        ImeTextSpan ime_text_span(char16_offsets[start], char16_offsets[end],
+                                  SK_ColorBLACK, false, SK_ColorTRANSPARENT);
 
         // Always use thick underline for a range with background color, which
         // is usually the selection range.
         if (background_attr) {
-          underline.thick = true;
+          ime_text_span.thick = true;
           // If the cursor is at start or end of this underline, then we treat
           // it as the selection range as well, but make sure to set the cursor
           // position to the selection end.
-          if (underline.start_offset == cursor_offset) {
-            composition->selection.set_start(underline.end_offset);
+          if (ime_text_span.start_offset == cursor_offset) {
+            composition->selection.set_start(ime_text_span.end_offset);
             composition->selection.set_end(cursor_offset);
-          } else if (underline.end_offset == cursor_offset) {
-            composition->selection.set_start(underline.start_offset);
+          } else if (ime_text_span.end_offset == cursor_offset) {
+            composition->selection.set_start(ime_text_span.start_offset);
             composition->selection.set_end(cursor_offset);
           }
         }
         if (underline_attr) {
           int type = reinterpret_cast<PangoAttrInt*>(underline_attr)->value;
           if (type == PANGO_UNDERLINE_DOUBLE)
-            underline.thick = true;
+            ime_text_span.thick = true;
           else if (type == PANGO_UNDERLINE_ERROR)
-            underline.color = SK_ColorRED;
+            ime_text_span.color = SK_ColorRED;
         }
-        composition->underlines.push_back(underline);
+        composition->ime_text_spans.push_back(ime_text_span);
       }
     } while (pango_attr_iterator_next(iter));
     pango_attr_iterator_destroy(iter);
   }
 
   // Use a black thin underline by default.
-  if (composition->underlines.empty()) {
-    composition->underlines.push_back(CompositionUnderline(
-        0, length, SK_ColorBLACK, false, SK_ColorTRANSPARENT));
+  if (composition->ime_text_spans.empty()) {
+    composition->ime_text_spans.push_back(
+        ImeTextSpan(0, length, SK_ColorBLACK, false, SK_ColorTRANSPARENT));
   }
 }
 
diff --git a/ui/base/ime/composition_text_util_pango_unittest.cc b/ui/base/ime/composition_text_util_pango_unittest.cc
index c645e30..eb2f340 100644
--- a/ui/base/ime/composition_text_util_pango_unittest.cc
+++ b/ui/base/ime/composition_text_util_pango_unittest.cc
@@ -25,7 +25,7 @@
   int end_offset;
 };
 
-struct Underline {
+struct ImeTextSpan {
   unsigned start_offset;
   unsigned end_offset;
   uint32_t color;
@@ -36,7 +36,7 @@
 struct TestData {
   const char* text;
   const AttributeInfo attrs[10];
-  const Underline underlines[10];
+  const ImeTextSpan ime_text_spans[10];
 };
 
 const TestData kTestData[] = {
@@ -95,8 +95,7 @@
       {0, 0, 0, false, SK_ColorTRANSPARENT}}},
 };
 
-void CompareUnderline(const Underline& a,
-                      const ui::CompositionUnderline& b) {
+void CompareImeTextSpan(const ImeTextSpan& a, const ui::ImeTextSpan& b) {
   EXPECT_EQ(a.start_offset, b.start_offset);
   EXPECT_EQ(a.end_offset, b.end_offset);
   EXPECT_EQ(a.color, b.color);
@@ -135,11 +134,11 @@
     ui::CompositionText result;
     ui::ExtractCompositionTextFromGtkPreedit(text, pango_attrs, 0, &result);
 
-    const Underline* underlines = kTestData[i].underlines;
-    for (size_t u = 0; underlines[u].color &&
-         u < result.underlines.size(); ++u) {
-      SCOPED_TRACE(testing::Message() << "Underline:" << u);
-      CompareUnderline(underlines[u], result.underlines[u]);
+    const ImeTextSpan* ime_text_spans = kTestData[i].ime_text_spans;
+    for (size_t u = 0;
+         ime_text_spans[u].color && u < result.ime_text_spans.size(); ++u) {
+      SCOPED_TRACE(testing::Message() << "ImeTextSpan:" << u);
+      CompareImeTextSpan(ime_text_spans[u], result.ime_text_spans[u]);
     }
 
     pango_attr_list_unref(pango_attrs);
diff --git a/ui/base/ime/composition_underline.h b/ui/base/ime/ime_text_span.h
similarity index 61%
rename from ui/base/ime/composition_underline.h
rename to ui/base/ime/ime_text_span.h
index 9eb7763..ddfbd43 100644
--- a/ui/base/ime/composition_underline.h
+++ b/ui/base/ime/ime_text_span.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_BASE_IME_COMPOSITION_UNDERLINE_H_
-#define UI_BASE_IME_COMPOSITION_UNDERLINE_H_
+#ifndef UI_BASE_IME_IME_TEXT_SPAN_H_
+#define UI_BASE_IME_IME_TEXT_SPAN_H_
 
 #include <stdint.h>
 
@@ -13,10 +13,10 @@
 
 namespace ui {
 
-// Intentionally keep sync with blink::WebCompositionUnderline defined in:
-// third_party/WebKit/public/web/WebCompositionUnderline.h
-struct CompositionUnderline {
-  CompositionUnderline()
+// Intentionally keep sync with blink::WebImeTextSpan defined in:
+// third_party/WebKit/public/web/WebImeTextSpan.h
+struct ImeTextSpan {
+  ImeTextSpan()
       : start_offset(0),
         end_offset(0),
         color(SK_ColorTRANSPARENT),
@@ -24,35 +24,33 @@
         background_color(SK_ColorTRANSPARENT) {}
 
   // TODO(huangs): remove this constructor.
-  CompositionUnderline(uint32_t s, uint32_t e, SkColor c, bool t)
+  ImeTextSpan(uint32_t s, uint32_t e, SkColor c, bool t)
       : start_offset(s),
         end_offset(e),
         color(c),
         thick(t),
         background_color(SK_ColorTRANSPARENT) {}
 
-  CompositionUnderline(uint32_t s, uint32_t e, SkColor c, bool t, SkColor bc)
+  ImeTextSpan(uint32_t s, uint32_t e, SkColor c, bool t, SkColor bc)
       : start_offset(s),
         end_offset(e),
         color(c),
         thick(t),
         background_color(bc) {}
 
-  bool operator<(const CompositionUnderline& rhs) const {
+  bool operator<(const ImeTextSpan& rhs) const {
     return std::tie(start_offset, end_offset) <
            std::tie(rhs.start_offset, rhs.end_offset);
   }
 
-  bool operator==(const CompositionUnderline& rhs) const {
+  bool operator==(const ImeTextSpan& rhs) const {
     return (this->start_offset == rhs.start_offset) &&
            (this->end_offset == rhs.end_offset) && (this->color == rhs.color) &&
            (this->thick == rhs.thick) &&
            (this->background_color == rhs.background_color);
   }
 
-  bool operator!=(const CompositionUnderline& rhs) const {
-    return !(*this == rhs);
-  }
+  bool operator!=(const ImeTextSpan& rhs) const { return !(*this == rhs); }
 
   uint32_t start_offset;
   uint32_t end_offset;
@@ -61,8 +59,8 @@
   SkColor background_color;
 };
 
-typedef std::vector<CompositionUnderline> CompositionUnderlines;
+typedef std::vector<ImeTextSpan> ImeTextSpans;
 
 }  // namespace ui
 
-#endif  // UI_BASE_IME_COMPOSITION_UNDERLINE_H_
+#endif  // UI_BASE_IME_IME_TEXT_SPAN_H_
diff --git a/ui/base/ime/input_method_chromeos.cc b/ui/base/ime/input_method_chromeos.cc
index 1312ba4..a5dd1d6a 100644
--- a/ui/base/ime/input_method_chromeos.cc
+++ b/ui/base/ime/input_method_chromeos.cc
@@ -613,17 +613,18 @@
 
   out_composition->selection = gfx::Range(cursor_offset);
 
-  const CompositionUnderlines text_underlines = text.underlines;
-  if (!text_underlines.empty()) {
-    for (size_t i = 0; i < text_underlines.size(); ++i) {
-      const uint32_t start = text_underlines[i].start_offset;
-      const uint32_t end = text_underlines[i].end_offset;
+  const ImeTextSpans text_ime_text_spans = text.ime_text_spans;
+  if (!text_ime_text_spans.empty()) {
+    for (size_t i = 0; i < text_ime_text_spans.size(); ++i) {
+      const uint32_t start = text_ime_text_spans[i].start_offset;
+      const uint32_t end = text_ime_text_spans[i].end_offset;
       if (start >= end)
         continue;
-      CompositionUnderline underline(
-          char16_offsets[start], char16_offsets[end], text_underlines[i].color,
-          text_underlines[i].thick, text_underlines[i].background_color);
-      out_composition->underlines.push_back(underline);
+      ImeTextSpan ime_text_span(char16_offsets[start], char16_offsets[end],
+                                text_ime_text_spans[i].color,
+                                text_ime_text_spans[i].thick,
+                                text_ime_text_spans[i].background_color);
+      out_composition->ime_text_spans.push_back(ime_text_span);
     }
   }
 
@@ -631,28 +632,26 @@
   if (text.selection.start() < text.selection.end()) {
     const uint32_t start = text.selection.start();
     const uint32_t end = text.selection.end();
-    CompositionUnderline underline(char16_offsets[start],
-                                   char16_offsets[end],
-                                   SK_ColorBLACK,
-                                   true /* thick */,
-                                   SK_ColorTRANSPARENT);
-    out_composition->underlines.push_back(underline);
+    ImeTextSpan ime_text_span(char16_offsets[start], char16_offsets[end],
+                              SK_ColorBLACK, true /* thick */,
+                              SK_ColorTRANSPARENT);
+    out_composition->ime_text_spans.push_back(ime_text_span);
 
-    // If the cursor is at start or end of this underline, then we treat
+    // If the cursor is at start or end of this ime_text_span, then we treat
     // it as the selection range as well, but make sure to set the cursor
     // position to the selection end.
-    if (underline.start_offset == cursor_offset) {
-      out_composition->selection.set_start(underline.end_offset);
+    if (ime_text_span.start_offset == cursor_offset) {
+      out_composition->selection.set_start(ime_text_span.end_offset);
       out_composition->selection.set_end(cursor_offset);
-    } else if (underline.end_offset == cursor_offset) {
-      out_composition->selection.set_start(underline.start_offset);
+    } else if (ime_text_span.end_offset == cursor_offset) {
+      out_composition->selection.set_start(ime_text_span.start_offset);
       out_composition->selection.set_end(cursor_offset);
     }
   }
 
   // Use a black thin underline by default.
-  if (out_composition->underlines.empty()) {
-    out_composition->underlines.push_back(CompositionUnderline(
+  if (out_composition->ime_text_spans.empty()) {
+    out_composition->ime_text_spans.push_back(ImeTextSpan(
         0, length, SK_ColorBLACK, false /* thick */, SK_ColorTRANSPARENT));
   }
 }
diff --git a/ui/base/ime/win/imm32_manager.cc b/ui/base/ime/win/imm32_manager.cc
index 8b868ce5..bc444b7 100644
--- a/ui/base/ime/win/imm32_manager.cc
+++ b/ui/base/ime/win/imm32_manager.cc
@@ -62,10 +62,10 @@
 
 // Helper function for IMM32Manager::GetCompositionInfo() method, to get
 // underlines information of the current composition string.
-void GetCompositionUnderlines(HIMC imm_context,
-                              int target_start,
-                              int target_end,
-                              ui::CompositionUnderlines* underlines) {
+void GetImeTextSpans(HIMC imm_context,
+                     int target_start,
+                     int target_end,
+                     ui::ImeTextSpans* ime_text_spans) {
   int clause_size = ::ImmGetCompositionString(imm_context, GCS_COMPCLAUSE,
                                               NULL, 0);
   int clause_length = clause_size / sizeof(uint32_t);
@@ -75,19 +75,19 @@
       ::ImmGetCompositionString(imm_context, GCS_COMPCLAUSE,
                                 clause_data.get(), clause_size);
       for (int i = 0; i < clause_length - 1; ++i) {
-        ui::CompositionUnderline underline;
-        underline.start_offset = clause_data[i];
-        underline.end_offset = clause_data[i+1];
-        underline.color = SK_ColorBLACK;
-        underline.thick = false;
-        underline.background_color = SK_ColorTRANSPARENT;
+        ui::ImeTextSpan ime_text_span;
+        ime_text_span.start_offset = clause_data[i];
+        ime_text_span.end_offset = clause_data[i + 1];
+        ime_text_span.color = SK_ColorBLACK;
+        ime_text_span.thick = false;
+        ime_text_span.background_color = SK_ColorTRANSPARENT;
 
         // Use thick underline for the target clause.
-        if (underline.start_offset >= static_cast<uint32_t>(target_start) &&
-            underline.end_offset <= static_cast<uint32_t>(target_end)) {
-          underline.thick = true;
+        if (ime_text_span.start_offset >= static_cast<uint32_t>(target_start) &&
+            ime_text_span.end_offset <= static_cast<uint32_t>(target_end)) {
+          ime_text_span.thick = true;
         }
-        underlines->push_back(underline);
+        ime_text_spans->push_back(ime_text_span);
       }
     }
   }
@@ -294,8 +294,8 @@
                                       LPARAM lparam,
                                       CompositionText* composition) {
   // We only care about GCS_COMPATTR, GCS_COMPCLAUSE and GCS_CURSORPOS, and
-  // convert them into underlines and selection range respectively.
-  composition->underlines.clear();
+  // convert them into composition underlines and selection range respectively.
+  composition->ime_text_spans.clear();
 
   int length = static_cast<int>(composition->text.length());
 
@@ -320,36 +320,36 @@
     composition->selection = gfx::Range(0);
   }
 
-  // Retrieve the clause segmentations and convert them to underlines.
+  // Retrieve the clause segmentations and convert them to ime_text_spans.
   if (lparam & GCS_COMPCLAUSE) {
-    GetCompositionUnderlines(imm_context, target_start, target_end,
-                             &composition->underlines);
+    GetImeTextSpans(imm_context, target_start, target_end,
+                    &composition->ime_text_spans);
   }
 
-  // Set default underlines in case there is no clause information.
-  if (!composition->underlines.empty())
+  // Set default composition underlines in case there is no clause information.
+  if (!composition->ime_text_spans.empty())
     return;
 
-  CompositionUnderline underline;
-  underline.color = SK_ColorBLACK;
-  underline.background_color = SK_ColorTRANSPARENT;
+  ImeTextSpan ime_text_span;
+  ime_text_span.color = SK_ColorBLACK;
+  ime_text_span.background_color = SK_ColorTRANSPARENT;
   if (target_start > 0) {
-    underline.start_offset = 0U;
-    underline.end_offset = static_cast<uint32_t>(target_start);
-    underline.thick = false;
-    composition->underlines.push_back(underline);
+    ime_text_span.start_offset = 0U;
+    ime_text_span.end_offset = static_cast<uint32_t>(target_start);
+    ime_text_span.thick = false;
+    composition->ime_text_spans.push_back(ime_text_span);
   }
   if (target_end > target_start) {
-    underline.start_offset = static_cast<uint32_t>(target_start);
-    underline.end_offset = static_cast<uint32_t>(target_end);
-    underline.thick = true;
-    composition->underlines.push_back(underline);
+    ime_text_span.start_offset = static_cast<uint32_t>(target_start);
+    ime_text_span.end_offset = static_cast<uint32_t>(target_end);
+    ime_text_span.thick = true;
+    composition->ime_text_spans.push_back(ime_text_span);
   }
   if (target_end < length) {
-    underline.start_offset = static_cast<uint32_t>(target_end);
-    underline.end_offset = static_cast<uint32_t>(length);
-    underline.thick = false;
-    composition->underlines.push_back(underline);
+    ime_text_span.start_offset = static_cast<uint32_t>(target_end);
+    ime_text_span.end_offset = static_cast<uint32_t>(length);
+    ime_text_span.thick = false;
+    composition->ime_text_spans.push_back(ime_text_span);
   }
 }
 
@@ -403,7 +403,7 @@
         composition->text[0] = 0xFF3F;
       }
 
-      // Retrieve the composition underlines and selection range information.
+      // Retrieve the IME text spans and selection range information.
       GetCompositionInfo(imm_context, lparam, composition);
 
       // Mark that there is an ongoing composition.
diff --git a/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_avocado.png b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_avocado.png
new file mode 100644
index 0000000..d36e36b
--- /dev/null
+++ b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_avocado.png
Binary files differ
diff --git a/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_cappucino.png b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_cappucino.png
new file mode 100644
index 0000000..b2aef62
--- /dev/null
+++ b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_cappucino.png
Binary files differ
diff --git a/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_icecream.png b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_icecream.png
new file mode 100644
index 0000000..247f4bd98
--- /dev/null
+++ b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_icecream.png
Binary files differ
diff --git a/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_icewater.png b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_icewater.png
new file mode 100644
index 0000000..b5427c3
--- /dev/null
+++ b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_icewater.png
Binary files differ
diff --git a/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_melon.png b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_melon.png
new file mode 100644
index 0000000..d3a8248
--- /dev/null
+++ b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_melon.png
Binary files differ
diff --git a/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_onigiri.png b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_onigiri.png
new file mode 100644
index 0000000..f2881146
--- /dev/null
+++ b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_onigiri.png
Binary files differ
diff --git a/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_pizza.png b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_pizza.png
new file mode 100644
index 0000000..d533653
--- /dev/null
+++ b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_pizza.png
Binary files differ
diff --git a/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_sandwich.png b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_sandwich.png
new file mode 100644
index 0000000..bbce58db
--- /dev/null
+++ b/ui/chromeos/resources/default_100_percent/default_user_images/abstract/avatar_sandwich.png
Binary files differ
diff --git a/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_avocado.png b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_avocado.png
new file mode 100644
index 0000000..036fc9b0
--- /dev/null
+++ b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_avocado.png
Binary files differ
diff --git a/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_cappucino.png b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_cappucino.png
new file mode 100644
index 0000000..8027ad4
--- /dev/null
+++ b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_cappucino.png
Binary files differ
diff --git a/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_icecream.png b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_icecream.png
new file mode 100644
index 0000000..2aef7b30
--- /dev/null
+++ b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_icecream.png
Binary files differ
diff --git a/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_icewater.png b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_icewater.png
new file mode 100644
index 0000000..9a38a16
--- /dev/null
+++ b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_icewater.png
Binary files differ
diff --git a/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_melon.png b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_melon.png
new file mode 100644
index 0000000..180155f
--- /dev/null
+++ b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_melon.png
Binary files differ
diff --git a/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_onigiri.png b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_onigiri.png
new file mode 100644
index 0000000..51b3b75
--- /dev/null
+++ b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_onigiri.png
Binary files differ
diff --git a/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_pizza.png b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_pizza.png
new file mode 100644
index 0000000..c5c8dd07
--- /dev/null
+++ b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_pizza.png
Binary files differ
diff --git a/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_sandwich.png b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_sandwich.png
new file mode 100644
index 0000000..dfbfd171
--- /dev/null
+++ b/ui/chromeos/resources/default_200_percent/default_user_images/abstract/avatar_sandwich.png
Binary files differ
diff --git a/ui/chromeos/resources/ui_chromeos_resources.grd b/ui/chromeos/resources/ui_chromeos_resources.grd
index d458dea..569f59d1 100644
--- a/ui/chromeos/resources/ui_chromeos_resources.grd
+++ b/ui/chromeos/resources/ui_chromeos_resources.grd
@@ -78,6 +78,14 @@
       <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_55" file="default_user_images/illustration/avatar_sushi.png" />
       <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_56" file="default_user_images/illustration/avatar_bike.png" />
       <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_57" file="default_user_images/illustration/avatar_sunglasses.png" />
+      <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_58" file="default_user_images/abstract/avatar_pizza.png" />
+      <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_59" file="default_user_images/abstract/avatar_sandwich.png" />
+      <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_60" file="default_user_images/abstract/avatar_cappucino.png" />
+      <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_61" file="default_user_images/abstract/avatar_icewater.png" />
+      <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_62" file="default_user_images/abstract/avatar_icecream.png" />
+      <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_63" file="default_user_images/abstract/avatar_onigiri.png" />
+      <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_64" file="default_user_images/abstract/avatar_melon.png" />
+      <structure type="chrome_scaled_image" name="IDR_LOGIN_DEFAULT_USER_65" file="default_user_images/abstract/avatar_avocado.png" />
 
       <!-- Print Job Notification images. -->
       <structure type="chrome_scaled_image" name="IDR_PRINT_NOTIFICATION_CANCEL" file="print_notification/cancel.png" />
diff --git a/ui/chromeos/ui_chromeos_strings.grd b/ui/chromeos/ui_chromeos_strings.grd
index 1ff7211..b1a2072 100644
--- a/ui/chromeos/ui_chromeos_strings.grd
+++ b/ui/chromeos/ui_chromeos_strings.grd
@@ -239,6 +239,30 @@
       <message name="IDS_LOGIN_DEFAULT_USER_DESC_57" desc="Description of the default user icon with a picture of a pair of sunglasses">
         Sunglasses
       </message>
+      <message name="IDS_LOGIN_DEFAULT_USER_DESC_58" desc="Description of the default user icon with a picture of a pizza">
+        Pizza
+      </message>
+      <message name="IDS_LOGIN_DEFAULT_USER_DESC_59" desc="Description of the default user icon with a picture of a sandwich">
+        Sandwich
+      </message>
+      <message name="IDS_LOGIN_DEFAULT_USER_DESC_60" desc="Description of the default user icon with a picture of a cappocino">
+        Cappocino
+      </message>
+      <message name="IDS_LOGIN_DEFAULT_USER_DESC_61" desc="Description of the default user icon with a picture of an ice water">
+        Ice water
+      </message>
+      <message name="IDS_LOGIN_DEFAULT_USER_DESC_62" desc="Description of the default user icon with a picture of an ice cream">
+        Ice cream
+      </message>
+      <message name="IDS_LOGIN_DEFAULT_USER_DESC_63" desc="Description of the default user icon with a picture of onigiri">
+        Onigiri
+      </message>
+      <message name="IDS_LOGIN_DEFAULT_USER_DESC_64" desc="Description of the default user icon with a picture of a melon">
+        Melon
+      </message>
+      <message name="IDS_LOGIN_DEFAULT_USER_DESC_65" desc="Description of the default user icon with a picture of an avocado">
+        Avocado
+      </message>
 
       <!-- Attribution strings for stock user images, not translateable. -->
       <message translateable="false" name="IDS_LOGIN_DEFAULT_USER_AUTHOR">
diff --git a/ui/display/BUILD.gn b/ui/display/BUILD.gn
index 8ec761f..dcede94 100644
--- a/ui/display/BUILD.gn
+++ b/ui/display/BUILD.gn
@@ -76,10 +76,6 @@
       "CoreGraphics.framework",
     ]
   }
-
-  if (is_fuchsia) {
-    sources += [ "screen_fuchsia.cc" ]
-  }
 }
 
 component("display_manager_test_api") {
diff --git a/ui/display/screen_fuchsia.cc b/ui/display/screen_fuchsia.cc
deleted file mode 100644
index e8f2cb87..0000000
--- a/ui/display/screen_fuchsia.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/display/screen.h"
-
-#include "base/logging.h"
-
-namespace display {
-
-// static
-gfx::NativeWindow Screen::GetWindowForView(gfx::NativeView view) {
-  // TODO(fuchsia): Stubbed during headless bringup https://crbug.com/743296.
-  NOTREACHED();
-  return nullptr;
-}
-
-}  // namespace display
diff --git a/ui/events/blink/input_handler_proxy_unittest.cc b/ui/events/blink/input_handler_proxy_unittest.cc
index 8666ffd..776a8c6 100644
--- a/ui/events/blink/input_handler_proxy_unittest.cc
+++ b/ui/events/blink/input_handler_proxy_unittest.cc
@@ -779,6 +779,8 @@
   gesture_.SetType(WebInputEvent::kGestureScrollBegin);
   EXPECT_EQ(expected_disposition_, input_handler_->HandleInputEvent(gesture_));
 
+  VERIFY_AND_RESET_MOCKS();
+
   // GSB is dropped and not sent to the main thread, GSE shouldn't get sent to
   // the main thread, either.
   expected_disposition_ = InputHandlerProxy::DROP_EVENT;
@@ -788,6 +790,12 @@
   EXPECT_EQ(expected_disposition_, input_handler_->HandleInputEvent(gesture_));
 
   VERIFY_AND_RESET_MOCKS();
+
+  expected_disposition_ = InputHandlerProxy::DROP_EVENT;
+  gesture_.SetType(WebInputEvent::kGestureFlingStart);
+  EXPECT_EQ(expected_disposition_, input_handler_->HandleInputEvent(gesture_));
+
+  VERIFY_AND_RESET_MOCKS();
 }
 
 TEST_P(InputHandlerProxyTest, GestureScrollByPage) {
diff --git a/ui/gfx/buffer_types.h b/ui/gfx/buffer_types.h
index 9cb5b7b6..cf53cdc 100644
--- a/ui/gfx/buffer_types.h
+++ b/ui/gfx/buffer_types.h
@@ -37,12 +37,16 @@
 // by the CPU. *_CPU_READ_WRITE_PERSISTENT adds the additional condition that
 // successive Map() calls (with Unmap() calls between) will return a pointer to
 // the same memory contents. SCANOUT implies GPU_READ_WRITE.
+// *_VDA_WRITE is for cases where a video decode accellerator writes into
+// the buffers.
+
 // TODO(reveman): Add GPU_READ_WRITE for use-cases where SCANOUT is not
 // required.
 enum class BufferUsage {
   GPU_READ,
   SCANOUT,
   SCANOUT_CPU_READ_WRITE,
+  SCANOUT_VDA_WRITE,
   GPU_READ_CPU_READ_WRITE,
   // TODO(reveman): Merge this with GPU_READ_CPU_READ_WRITE when SurfaceTexture
   // backed buffers are single buffered and support it.
diff --git a/ui/gfx/linux/client_native_pixmap_factory_dmabuf.cc b/ui/gfx/linux/client_native_pixmap_factory_dmabuf.cc
index a91e5064..16d4af4 100644
--- a/ui/gfx/linux/client_native_pixmap_factory_dmabuf.cc
+++ b/ui/gfx/linux/client_native_pixmap_factory_dmabuf.cc
@@ -68,6 +68,8 @@
                format == gfx::BufferFormat::BGRA_8888 ||
                format == gfx::BufferFormat::RGBX_8888 ||
                format == gfx::BufferFormat::RGBA_8888;
+      case gfx::BufferUsage::SCANOUT_VDA_WRITE:
+        return false;
       case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
       case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT: {
 #if defined(OS_CHROMEOS)
@@ -104,6 +106,7 @@
 #endif
       case gfx::BufferUsage::GPU_READ:
       case gfx::BufferUsage::SCANOUT:
+      case gfx::BufferUsage::SCANOUT_VDA_WRITE:
         // Close all the fds.
         for (const auto& fd : handle.fds)
           base::ScopedFD scoped_fd(fd.fd);
diff --git a/ui/gfx/mojo/buffer_types.mojom b/ui/gfx/mojo/buffer_types.mojom
index 29c50d54..b11bec3 100644
--- a/ui/gfx/mojo/buffer_types.mojom
+++ b/ui/gfx/mojo/buffer_types.mojom
@@ -33,6 +33,7 @@
   GPU_READ,
   SCANOUT,
   SCANOUT_CPU_READ_WRITE,
+  SCANOUT_VDA_WRITE,
   GPU_READ_CPU_READ_WRITE,
   GPU_READ_CPU_READ_WRITE_PERSISTENT,
 
diff --git a/ui/gfx/mojo/buffer_types_struct_traits.h b/ui/gfx/mojo/buffer_types_struct_traits.h
index fadb17a8..0f0b1ad 100644
--- a/ui/gfx/mojo/buffer_types_struct_traits.h
+++ b/ui/gfx/mojo/buffer_types_struct_traits.h
@@ -128,6 +128,8 @@
         return gfx::mojom::BufferUsage::SCANOUT;
       case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
         return gfx::mojom::BufferUsage::SCANOUT_CPU_READ_WRITE;
+      case gfx::BufferUsage::SCANOUT_VDA_WRITE:
+        return gfx::mojom::BufferUsage::SCANOUT_VDA_WRITE;
       case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
         return gfx::mojom::BufferUsage::GPU_READ_CPU_READ_WRITE;
       case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT:
@@ -148,6 +150,9 @@
       case gfx::mojom::BufferUsage::SCANOUT_CPU_READ_WRITE:
         *out = gfx::BufferUsage::SCANOUT_CPU_READ_WRITE;
         return true;
+      case gfx::mojom::BufferUsage::SCANOUT_VDA_WRITE:
+        *out = gfx::BufferUsage::SCANOUT_VDA_WRITE;
+        return true;
       case gfx::mojom::BufferUsage::GPU_READ_CPU_READ_WRITE:
         *out = gfx::BufferUsage::GPU_READ_CPU_READ_WRITE;
         return true;
diff --git a/ui/login/account_picker/md_user_pod_row.js b/ui/login/account_picker/md_user_pod_row.js
index dae3ddd1c..b2606f7f 100644
--- a/ui/login/account_picker/md_user_pod_row.js
+++ b/ui/login/account_picker/md_user_pod_row.js
@@ -2915,6 +2915,8 @@
     // If testing mode is enabled.
     testingModeEnabled_: false,
 
+    // The color used by the scroll list when the user count exceeds
+    // LANDSCAPE_MODE_LIMIT or PORTRAIT_MODE_LIMIT.
     overlayColors_: {maskColor: undefined, scrollColor: undefined},
 
     /** @override */
@@ -3577,7 +3579,15 @@
      * screen orientation and showing the virtual keyboard.
      */
     onWindowResize: function() {
-      this.placePods_();
+      var isAccountPicker =
+          $('login-header-bar').signinUIState == SIGNIN_UI_STATE.ACCOUNT_PICKER;
+      if (isAccountPicker) {
+        // Redo pod placement if account picker is the current screen.
+        this.placePods_();
+      } else {
+        // Postpone pod placement. |handleBeforeShow| will check this flag.
+        this.podPlacementPostponed_ = true;
+      }
     },
 
     /**
diff --git a/ui/login/display_manager.js b/ui/login/display_manager.js
index 1dcda53..87e40cc 100644
--- a/ui/login/display_manager.js
+++ b/ui/login/display_manager.js
@@ -105,10 +105,6 @@
   // A lock screen enabled app is running in foreground - an app window is
   // shown over the lock screen user pods (header bar should still be visible).
   FOREGROUND: 'LOCK_SCREEN_APPS_STATE.FOREGROUND',
-  // State used to request launch of a lock screen note-taking app - this state
-  // is not expected to be received from platform as a current state (instead,
-  // on successful launch, state will be changed to FOREGROUND).
-  LAUNCH_REQUESTED: 'LOCK_SCREEN_APPS_STATE.LAUNCH_REQUESTED'
 };
 
 /** @const */ var USER_ACTION_ROLLBACK_TOGGLED = 'rollback-toggled';
@@ -809,6 +805,9 @@
       var currentScreen = $(currentScreenId);
       if (currentScreen)
         currentScreen.onWindowResize();
+      // The account picker always needs to be notified of window size changes.
+      if (currentScreenId != SCREEN_ACCOUNT_PICKER && $(SCREEN_ACCOUNT_PICKER))
+        $(SCREEN_ACCOUNT_PICKER).onWindowResize();
     },
 
     /*
diff --git a/ui/message_center/views/notification_header_view.cc b/ui/message_center/views/notification_header_view.cc
index 651bc2c7..0c3cb8b8 100644
--- a/ui/message_center/views/notification_header_view.cc
+++ b/ui/message_center/views/notification_header_view.cc
@@ -138,6 +138,12 @@
       views::BoxLayout::CROSS_AXIS_ALIGNMENT_CENTER);
   SetLayoutManager(layout);
 
+  ink_drop_container_ = new views::InkDropContainerView();
+  ink_drop_container_->SetPaintToLayer();
+  ink_drop_container_->layer()->SetFillsBoundsOpaquely(false);
+  ink_drop_container_->SetVisible(false);
+  AddChildView(ink_drop_container_);
+
   views::View* app_info_container = new views::View();
   views::BoxLayout* app_info_layout =
       new views::BoxLayout(views::BoxLayout::kHorizontal,
@@ -308,6 +314,16 @@
   return highlight;
 }
 
+void NotificationHeaderView::AddInkDropLayer(ui::Layer* ink_drop_layer) {
+  ink_drop_container_->AddInkDropLayer(ink_drop_layer);
+  InstallInkDropMask(ink_drop_layer);
+}
+
+void NotificationHeaderView::RemoveInkDropLayer(ui::Layer* ink_drop_layer) {
+  ResetInkDropMask();
+  ink_drop_container_->RemoveInkDropLayer(ink_drop_layer);
+}
+
 void NotificationHeaderView::UpdateSummaryTextVisibility() {
   const bool visible = has_progress_ || has_overflow_indicator_;
   summary_text_divider_->SetVisible(visible);
diff --git a/ui/message_center/views/notification_header_view.h b/ui/message_center/views/notification_header_view.h
index fe9be9e..73c6f79 100644
--- a/ui/message_center/views/notification_header_view.h
+++ b/ui/message_center/views/notification_header_view.h
@@ -46,6 +46,8 @@
   std::unique_ptr<views::InkDropRipple> CreateInkDropRipple() const override;
   std::unique_ptr<views::InkDropHighlight> CreateInkDropHighlight()
       const override;
+  void AddInkDropLayer(ui::Layer* ink_drop_layer) override;
+  void RemoveInkDropLayer(ui::Layer* ink_drop_layer) override;
 
   views::ImageView* expand_button() { return expand_button_; }
 
@@ -55,6 +57,7 @@
 
   SkColor accent_color_ = message_center::kNotificationDefaultAccentColor;
 
+  views::InkDropContainerView* ink_drop_container_ = nullptr;
   views::Label* app_name_view_ = nullptr;
   views::Label* summary_text_divider_ = nullptr;
   views::Label* summary_text_view_ = nullptr;
diff --git a/ui/message_center/views/notification_view_md.cc b/ui/message_center/views/notification_view_md.cc
index ea22ba4..21eead2 100644
--- a/ui/message_center/views/notification_view_md.cc
+++ b/ui/message_center/views/notification_view_md.cc
@@ -573,6 +573,24 @@
 
 void NotificationViewMD::CreateOrUpdateContextTitleView(
     const Notification& notification) {
+#if defined(OS_CHROMEOS)
+  // If |origin_url| and |display_source| are both empty, assume it is
+  // system notification, and use default |display_source| and
+  // |accent_color| for system notification.
+  // TODO(tetsui): Remove this after all system notification transition is
+  // completed.
+  // All system notification should use Notification::CreateSystemNotification()
+  if (notification.display_source().empty() &&
+      notification.origin_url().is_empty()) {
+    header_row_->SetAppName(l10n_util::GetStringFUTF16(
+        IDS_MESSAGE_CENTER_NOTIFICATION_CHROMEOS_SYSTEM,
+        MessageCenter::Get()->GetProductOSName()));
+    header_row_->SetAccentColor(message_center::kSystemNotificationColorNormal);
+    header_row_->SetTimestamp(notification.timestamp());
+    return;
+  }
+#endif
+
   header_row_->SetAppName(notification.display_source());
   header_row_->SetAccentColor(
       notification.accent_color() == SK_ColorTRANSPARENT
diff --git a/ui/ozone/platform/drm/gpu/drm_thread.cc b/ui/ozone/platform/drm/gpu/drm_thread.cc
index 3b95263..1d3b205 100644
--- a/ui/ozone/platform/drm/gpu/drm_thread.cc
+++ b/ui/ozone/platform/drm/gpu/drm_thread.cc
@@ -125,6 +125,9 @@
     case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
       flags = GBM_BO_USE_LINEAR | GBM_BO_USE_SCANOUT | GBM_BO_USE_TEXTURING;
       break;
+    case gfx::BufferUsage::SCANOUT_VDA_WRITE:
+      flags = GBM_BO_USE_SCANOUT | GBM_BO_USE_TEXTURING;
+      break;
     case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
     case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT:
       flags = GBM_BO_USE_LINEAR | GBM_BO_USE_TEXTURING;
@@ -141,11 +144,21 @@
   if (window && window->GetController())
     modifiers = window->GetController()->GetFormatModifiers(fourcc_format);
 
-  if (modifiers.size() > 0 && !(flags & GBM_BO_USE_LINEAR))
-    *buffer = GbmBuffer::CreateBufferWithModifiers(gbm, fourcc_format, size,
-                                                   flags, modifiers);
-  else
-    *buffer = GbmBuffer::CreateBuffer(gbm, fourcc_format, size, flags);
+  // NOTE: BufferUsage::SCANOUT is used to create buffers that will be
+  // explicitly set via kms on a CRTC (e.g: BufferQueue buffers), therefore
+  // allocation should fail if it's not possible to allocate a BO_USE_SCANOUT
+  // buffer in that case.
+  bool retry_without_scanout = usage != gfx::BufferUsage::SCANOUT;
+  do {
+    if (modifiers.size() > 0 && !(flags & GBM_BO_USE_LINEAR))
+      *buffer = GbmBuffer::CreateBufferWithModifiers(gbm, fourcc_format, size,
+                                                     flags, modifiers);
+    else
+      *buffer = GbmBuffer::CreateBuffer(gbm, fourcc_format, size, flags);
+    retry_without_scanout =
+        retry_without_scanout && (flags & GBM_BO_USE_SCANOUT);
+    flags &= ~GBM_BO_USE_SCANOUT;
+  } while (retry_without_scanout);
 }
 
 void DrmThread::CreateBufferFromFds(
diff --git a/ui/ozone/platform/wayland/wayland_window.cc b/ui/ozone/platform/wayland/wayland_window.cc
index 85cfee52..a7f4313 100644
--- a/ui/ozone/platform/wayland/wayland_window.cc
+++ b/ui/ozone/platform/wayland/wayland_window.cc
@@ -96,7 +96,7 @@
 
 void WaylandWindow::SetTitle(const base::string16& title) {
   DCHECK(xdg_surface_);
-  xdg_surface_set_title(xdg_surface_.get(), UTF16ToUTF8(title).c_str());
+  xdg_surface_set_title(xdg_surface_.get(), base::UTF16ToUTF8(title).c_str());
   connection_->ScheduleFlush();
 }
 
diff --git a/ui/views/animation/OWNERS b/ui/views/animation/OWNERS
index 9710b4e0..be29560 100644
--- a/ui/views/animation/OWNERS
+++ b/ui/views/animation/OWNERS
@@ -1 +1 @@
-per-file *ink*=bruthig@chromium.org
+per-file *ink*=mohsen@chromium.org
diff --git a/ui/views/animation/test/OWNERS b/ui/views/animation/test/OWNERS
index 9710b4e0..be29560 100644
--- a/ui/views/animation/test/OWNERS
+++ b/ui/views/animation/test/OWNERS
@@ -1 +1 @@
-per-file *ink*=bruthig@chromium.org
+per-file *ink*=mohsen@chromium.org
diff --git a/ui/views/bubble/bubble_dialog_delegate_unittest.cc b/ui/views/bubble/bubble_dialog_delegate_unittest.cc
index 0887c89..a6c2b175 100644
--- a/ui/views/bubble/bubble_dialog_delegate_unittest.cc
+++ b/ui/views/bubble/bubble_dialog_delegate_unittest.cc
@@ -13,6 +13,7 @@
 #include "ui/events/event_utils.h"
 #include "ui/views/bubble/bubble_frame_view.h"
 #include "ui/views/controls/button/label_button.h"
+#include "ui/views/controls/styled_label.h"
 #include "ui/views/test/test_views.h"
 #include "ui/views/test/test_widget_observer.h"
 #include "ui/views/test/views_test_base.h"
@@ -58,6 +59,7 @@
 
   using BubbleDialogDelegateView::SetAnchorRect;
   using BubbleDialogDelegateView::GetBubbleFrameView;
+  using BubbleDialogDelegateView::SizeToContents;
 
  private:
   View* view_;
@@ -384,4 +386,37 @@
             title_view->bounds().right());
 }
 
+// Ensure the BubbleFrameView correctly resizes when the title is provided by a
+// StyledLabel.
+TEST_F(BubbleDialogDelegateTest, StyledLabelTitle) {
+  std::unique_ptr<Widget> anchor_widget(CreateTestWidget());
+  TestBubbleDialogDelegateView* bubble_delegate =
+      new TestBubbleDialogDelegateView(anchor_widget->GetContentsView());
+  StyledLabel* title_view = new StyledLabel(base::ASCIIToUTF16("123"), nullptr);
+  bubble_delegate->set_title_view(title_view);
+
+  Widget* bubble_widget =
+      BubbleDialogDelegateView::CreateBubble(bubble_delegate);
+  bubble_widget->Show();
+
+  const gfx::Size size_before_new_title =
+      bubble_widget->GetWindowBoundsInScreen().size();
+  title_view->SetText(base::ASCIIToUTF16("12"));
+  bubble_delegate->SizeToContents();
+
+  // A shorter title should change nothing, since both will be within the
+  // minimum dialog width.
+  EXPECT_EQ(size_before_new_title,
+            bubble_widget->GetWindowBoundsInScreen().size());
+
+  title_view->SetText(base::UTF8ToUTF16(std::string(200, '0')));
+  bubble_delegate->SizeToContents();
+
+  // A (much) longer title should increase the height, but not the width.
+  EXPECT_EQ(size_before_new_title.width(),
+            bubble_widget->GetWindowBoundsInScreen().width());
+  EXPECT_LT(size_before_new_title.height(),
+            bubble_widget->GetWindowBoundsInScreen().height());
+}
+
 }  // namespace views
diff --git a/ui/views/bubble/bubble_frame_view.cc b/ui/views/bubble/bubble_frame_view.cc
index 33849cdd..a7b5468 100644
--- a/ui/views/bubble/bubble_frame_view.cc
+++ b/ui/views/bubble/bubble_frame_view.cc
@@ -159,8 +159,10 @@
 }
 
 gfx::Rect BubbleFrameView::GetBoundsForClientView() const {
+  // When NonClientView asks for this, the size of the frame view has been set
+  // (i.e. |this|), but not the client view bounds.
   gfx::Rect client_bounds = GetContentsBounds();
-  client_bounds.Inset(GetInsets());
+  client_bounds.Inset(GetClientInsetsForFrameWidth(client_bounds.width()));
   // Only account for footnote_container_'s height if it's visible, because
   // content_margins_ adds extra padding even if all child views are invisible.
   if (footnote_container_ && footnote_container_->visible()) {
@@ -172,12 +174,17 @@
 
 gfx::Rect BubbleFrameView::GetWindowBoundsForClientBounds(
     const gfx::Rect& client_bounds) const {
-  gfx::Size size(GetSizeForClientSize(client_bounds.size()));
+  gfx::Size size(GetFrameSizeForClientSize(client_bounds.size()));
   return bubble_border_->GetBounds(gfx::Rect(), size);
 }
 
 bool BubbleFrameView::GetClientMask(const gfx::Size& size,
                                     gfx::Path* path) const {
+  // NonClientView calls this after setting the client view size from the return
+  // of GetBoundsForClientView(); feeding it back in |size|.
+  DCHECK(GetBoundsForClientView().size() == size);
+  DCHECK(GetWidget()->client_view()->size() == size);
+
   const int radius = bubble_border_->GetBorderCornerRadius();
   gfx::Insets content_insets = GetInsets();
   // If the client bounds don't touch the edges, no need to mask.
@@ -288,20 +295,7 @@
 }
 
 gfx::Insets BubbleFrameView::GetInsets() const {
-  gfx::Insets insets = content_margins_;
-
-  const int icon_height = title_icon_->GetPreferredSize().height();
-  const int label_height = title()->GetPreferredSize().height();
-  const bool has_title = icon_height > 0 || label_height > 0;
-  const int title_padding = has_title ? title_margins_.height() : 0;
-  const int title_height = std::max(icon_height, label_height) + title_padding;
-  const int close_height =
-      GetWidget()->widget_delegate()->ShouldShowCloseButton()
-          ? close_->height() + LayoutProvider::Get()->GetDistanceMetric(
-                                   DISTANCE_CLOSE_BUTTON_MARGIN)
-          : 0;
-  insets += gfx::Insets(std::max(title_height, close_height), 0, 0, 0);
-  return insets;
+  return GetClientInsetsForFrameWidth(GetContentsBounds().width());
 }
 
 gfx::Size BubbleFrameView::CalculatePreferredSize() const {
@@ -369,6 +363,17 @@
       title_icon_pref_size.width() > 0 ? title_margins_.left() : 0;
   const int title_label_x =
       bounds.x() + title_icon_pref_size.width() + title_icon_padding;
+
+  // TODO(tapted): Layout() should skip more surrounding code when !HasTitle().
+  // Currently DCHECKs fail since title_insets is 0 when there is no title.
+  if (DCHECK_IS_ON() && HasTitle()) {
+    gfx::Insets title_insets = GetTitleLabelInsetsFromFrame();
+    if (border())
+      title_insets += border()->GetInsets();
+    DCHECK_EQ(title_insets.left(), title_label_x);
+    DCHECK_EQ(title_insets.right(), width() - title_label_right);
+  }
+
   const int title_available_width =
       std::max(1, title_label_right - title_label_x);
   const int title_preferred_height =
@@ -470,7 +475,7 @@
 gfx::Rect BubbleFrameView::GetUpdatedWindowBounds(const gfx::Rect& anchor_rect,
                                                   const gfx::Size& client_size,
                                                   bool adjust_if_offscreen) {
-  gfx::Size size(GetSizeForClientSize(client_size));
+  gfx::Size size(GetFrameSizeForClientSize(client_size));
 
   const BubbleBorder::Arrow arrow = bubble_border_->arrow();
   if (adjust_if_offscreen && BubbleBorder::has_arrow(arrow)) {
@@ -572,34 +577,79 @@
     SchedulePaint();
 }
 
-gfx::Size BubbleFrameView::GetSizeForClientSize(
-    const gfx::Size& client_size) const {
-  // Accommodate the width of the title bar elements.
-  int title_bar_width = title_margins_.width() + border()->GetInsets().width();
-  gfx::Size title_icon_size = title_icon_->GetPreferredSize();
-  gfx::Size title_label_size = title()->GetPreferredSize();
-  if (title_icon_size.width() > 0 && title_label_size.width() > 0)
-    title_bar_width += title_margins_.left();
-  title_bar_width += title_icon_size.width();
-  if (close_->visible())
-    title_bar_width += close_->width() + 1;
+int BubbleFrameView::GetFrameWidthForClientWidth(int client_width) const {
+  // Note that GetMinimumSize() for multiline Labels is typically 0.
+  const int title_bar_width = title()->GetMinimumSize().width() +
+                              GetTitleLabelInsetsFromFrame().width();
+  const int client_area_width = client_width + content_margins_.width();
+  const int frame_width = std::max(title_bar_width, client_area_width);
+  DialogDelegate* dialog_delegate =
+      GetWidget()->widget_delegate()->AsDialogDelegate();
+  return dialog_delegate && dialog_delegate->ShouldSnapFrameWidth()
+             ? LayoutProvider::Get()->GetSnappedDialogWidth(frame_width)
+             : frame_width;
+}
 
-  gfx::Size size(client_size);
-  gfx::Insets client_insets = GetInsets();
-  size.Enlarge(client_insets.width(), client_insets.height());
-  size.SetToMax(gfx::Size(title_bar_width, 0));
+gfx::Size BubbleFrameView::GetFrameSizeForClientSize(
+    const gfx::Size& client_size) const {
+  const int frame_width = GetFrameWidthForClientWidth(client_size.width());
+  const gfx::Insets client_insets = GetClientInsetsForFrameWidth(frame_width);
+  DCHECK_GE(frame_width, client_size.width());
+  gfx::Size size(frame_width, client_size.height() + client_insets.height());
 
   // Only account for footnote_container_'s height if it's visible, because
   // content_margins_ adds extra padding even if all child views are invisible.
   if (footnote_container_ && footnote_container_->visible())
     size.Enlarge(0, footnote_container_->GetHeightForWidth(size.width()));
 
-  DialogDelegate* dialog_delegate =
-      GetWidget()->widget_delegate()->AsDialogDelegate();
-  if (dialog_delegate && dialog_delegate->ShouldSnapFrameWidth())
-    size.set_width(LayoutProvider::Get()->GetSnappedDialogWidth(size.width()));
-
   return size;
 }
 
+bool BubbleFrameView::HasTitle() const {
+  return custom_title_ != nullptr ||
+         default_title_->GetPreferredSize().height() > 0 ||
+         title_icon_->GetPreferredSize().height() > 0;
+}
+
+gfx::Insets BubbleFrameView::GetTitleLabelInsetsFromFrame() const {
+  int insets_right = 0;
+  if (GetWidget()->widget_delegate()->ShouldShowCloseButton()) {
+    const int close_margin =
+        LayoutProvider::Get()->GetDistanceMetric(DISTANCE_CLOSE_BUTTON_MARGIN);
+    insets_right = 2 * close_margin + close_->width();
+  }
+  if (!HasTitle())
+    return gfx::Insets(0, 0, 0, insets_right);
+
+  insets_right = std::max(insets_right, title_margins_.right());
+  const gfx::Size title_icon_pref_size = title_icon_->GetPreferredSize();
+  const int title_icon_padding =
+      title_icon_pref_size.width() > 0 ? title_margins_.left() : 0;
+  const int insets_left =
+      title_margins_.left() + title_icon_pref_size.width() + title_icon_padding;
+  return gfx::Insets(title_margins_.top(), insets_left, title_margins_.bottom(),
+                     insets_right);
+}
+
+gfx::Insets BubbleFrameView::GetClientInsetsForFrameWidth(
+    int frame_width) const {
+  int close_height = 0;
+  if (GetWidget()->widget_delegate()->ShouldShowCloseButton()) {
+    const int close_margin =
+        LayoutProvider::Get()->GetDistanceMetric(DISTANCE_CLOSE_BUTTON_MARGIN);
+    // Note: |close_margin| is not applied on the bottom of the icon.
+    close_height = close_margin + close_->height();
+  }
+  if (!HasTitle())
+    return content_margins_ + gfx::Insets(close_height, 0, 0, 0);
+
+  const int icon_height = title_icon_->GetPreferredSize().height();
+  const int label_height = title()->GetHeightForWidth(
+      frame_width - GetTitleLabelInsetsFromFrame().width());
+  const int title_height =
+      std::max(icon_height, label_height) + title_margins_.height();
+  return content_margins_ +
+         gfx::Insets(std::max(title_height, close_height), 0, 0, 0);
+}
+
 }  // namespace views
diff --git a/ui/views/bubble/bubble_frame_view.h b/ui/views/bubble/bubble_frame_view.h
index 37d2fddf..b456f3c 100644
--- a/ui/views/bubble/bubble_frame_view.h
+++ b/ui/views/bubble/bubble_frame_view.h
@@ -123,8 +123,26 @@
   void OffsetArrowIfOffScreen(const gfx::Rect& anchor_rect,
                               const gfx::Size& client_size);
 
+  // The width of the frame for the given |client_width|. The result accounts
+  // for the minimum title bar width and includes all insets and possible
+  // snapping. It does not include the border.
+  int GetFrameWidthForClientWidth(int client_width) const;
+
   // Calculates the size needed to accommodate the given client area.
-  gfx::Size GetSizeForClientSize(const gfx::Size& client_size) const;
+  gfx::Size GetFrameSizeForClientSize(const gfx::Size& client_size) const;
+
+  // True if the frame has a title area. This is the area affected by
+  // |title_margins_|, including the icon and title text, but not the close
+  // button.
+  bool HasTitle() const;
+
+  // The insets of the text portion of the title, based on |title_margins_| and
+  // whether there is an icon and/or close button. Note there may be no title,
+  // in which case only insets required for the close button are returned.
+  gfx::Insets GetTitleLabelInsetsFromFrame() const;
+
+  // The client_view insets (from the frame view) for the given |frame_width|.
+  gfx::Insets GetClientInsetsForFrameWidth(int frame_width) const;
 
   // The bubble border.
   BubbleBorder* bubble_border_;
diff --git a/ui/views/bubble/bubble_frame_view_unittest.cc b/ui/views/bubble/bubble_frame_view_unittest.cc
index 61066f0..92072dfe 100644
--- a/ui/views/bubble/bubble_frame_view_unittest.cc
+++ b/ui/views/bubble/bubble_frame_view_unittest.cc
@@ -552,11 +552,23 @@
   }
   ~TestBubbleDialogDelegateView() override {}
 
-  using BubbleDialogDelegateView::SetAnchorView;
+  void ChangeTitle(const base::string16& title) {
+    title_ = title;
+    // Note UpdateWindowTitle() always does a layout, which will be invalid if
+    // the Widget needs to change size. But also SizeToContents() _only_ does a
+    // layout if the size is actually changing.
+    GetWidget()->UpdateWindowTitle();
+    SizeToContents();
+  }
 
   void set_override_snap(bool value) { override_snap_ = value; }
 
   // BubbleDialogDelegateView:
+  using BubbleDialogDelegateView::SetAnchorView;
+  using BubbleDialogDelegateView::SizeToContents;
+  base::string16 GetWindowTitle() const override { return title_; }
+  bool ShouldShowWindowTitle() const override { return !title_.empty(); }
+
   void DeleteDelegate() override {
     // This delegate is owned by the test case itself, so it should not delete
     // itself here.
@@ -566,16 +578,34 @@
     return override_snap_.value_or(
         BubbleDialogDelegateView::ShouldSnapFrameWidth());
   }
+  gfx::Size GetMinimumSize() const override { return gfx::Size(); }
   gfx::Size CalculatePreferredSize() const override {
     return gfx::Size(200, 200);
   }
 
  private:
+  base::string16 title_;
   base::Optional<bool> override_snap_;
 
   DISALLOW_COPY_AND_ASSIGN(TestBubbleDialogDelegateView);
 };
 
+class TestAnchor {
+ public:
+  explicit TestAnchor(Widget::InitParams params) {
+    params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+    widget_.Init(params);
+    widget_.Show();
+  }
+
+  Widget& widget() { return widget_; }
+
+ private:
+  Widget widget_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestAnchor);
+};
+
 }  // namespace
 
 // This test ensures that if the installed LayoutProvider snaps dialog widths,
@@ -583,14 +613,9 @@
 TEST_F(BubbleFrameViewTest, WidthSnaps) {
   test::TestLayoutProvider provider;
   TestBubbleDialogDelegateView delegate;
+  TestAnchor anchor(CreateParams(Widget::InitParams::TYPE_WINDOW));
 
-  Widget anchor;
-  Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
-  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  anchor.Init(params);
-  anchor.Show();
-
-  delegate.SetAnchorView(anchor.GetContentsView());
+  delegate.SetAnchorView(anchor.widget().GetContentsView());
   delegate.set_margins(gfx::Insets());
 
   Widget* w0 = BubbleDialogDelegateView::CreateBubble(&delegate);
@@ -618,4 +643,83 @@
   w2->CloseNow();
 }
 
+// Tests edge cases when the frame's title view starts to wrap text. This is to
+// ensure that the calculations BubbleFrameView does to determine the Widget
+// size for a given client view are consistent with the eventual size that the
+// client view takes after Layout().
+TEST_F(BubbleFrameViewTest, LayoutEdgeCases) {
+  test::TestLayoutProvider provider;
+  TestBubbleDialogDelegateView delegate;
+  TestAnchor anchor(CreateParams(Widget::InitParams::TYPE_WINDOW));
+  delegate.SetAnchorView(anchor.widget().GetContentsView());
+
+  Widget* bubble = BubbleDialogDelegateView::CreateBubble(&delegate);
+  bubble->Show();
+
+  // Even though the bubble has default margins, the dialog view should have
+  // been given its preferred size.
+  EXPECT_FALSE(delegate.margins().IsEmpty());
+  EXPECT_EQ(delegate.size(), delegate.GetPreferredSize());
+
+  // Starting with a short title.
+  base::string16 title(1, 'i');
+  delegate.ChangeTitle(title);
+  const int min_bubble_height = bubble->GetWindowBoundsInScreen().height();
+  EXPECT_LT(delegate.GetPreferredSize().height(), min_bubble_height);
+
+  // Grow the title incrementally until word wrap is required. There should
+  // never be a point where the BubbleFrameView over- or under-estimates the
+  // size required for the title. If it did, it would cause SizeToContents() to
+  // Widget size requiring the subsequent Layout() to fill the remaining client
+  // area with something other than |delegate|'s preferred size.
+  while (bubble->GetWindowBoundsInScreen().height() == min_bubble_height) {
+    title += ' ';
+    title += 'i';
+    delegate.ChangeTitle(title);
+    EXPECT_EQ(delegate.GetPreferredSize(), delegate.size()) << title;
+  }
+
+  // Sanity check that something interesting happened. The bubble should have
+  // grown by "a line" for the wrapped title, and the title should have reached
+  // a length that would have likely caused word wrap. A typical result would be
+  // a +17-20 change in height and title length of 53 characters.
+  const int two_line_height = bubble->GetWindowBoundsInScreen().height();
+  EXPECT_LT(12, two_line_height - min_bubble_height);
+  EXPECT_GT(25, two_line_height - min_bubble_height);
+  EXPECT_LT(30u, title.size());
+  EXPECT_GT(80u, title.size());
+
+  // Now add dialog snapping.
+  provider.SetSnappedDialogWidth(300);
+  delegate.SizeToContents();
+
+  // Height should go back to |min_bubble_height| since the window is wider:
+  // word wrapping should no longer happen.
+  EXPECT_EQ(min_bubble_height, bubble->GetWindowBoundsInScreen().height());
+  EXPECT_EQ(300, bubble->GetWindowBoundsInScreen().width());
+
+  // Now we are allowed to diverge from the client view width, but not height.
+  EXPECT_EQ(delegate.GetPreferredSize().height(), delegate.height());
+  EXPECT_LT(delegate.GetPreferredSize().width(), delegate.width());
+  EXPECT_GT(300, delegate.width());  // Greater, since there are margins.
+
+  const gfx::Size snapped_size = delegate.size();
+  const size_t old_title_size = title.size();
+
+  // Grow the title again with width snapping until word wrapping occurs.
+  while (bubble->GetWindowBoundsInScreen().height() == min_bubble_height) {
+    title += ' ';
+    title += 'i';
+    delegate.ChangeTitle(title);
+    EXPECT_EQ(snapped_size, delegate.size()) << title;
+  }
+  // Change to the height should have been the same as before. Title should
+  // have grown about 50%.
+  EXPECT_EQ(two_line_height, bubble->GetWindowBoundsInScreen().height());
+  EXPECT_LT(15u, title.size() - old_title_size);
+  EXPECT_GT(40u, title.size() - old_title_size);
+
+  // When |anchor| goes out of scope it should take |bubble| with it.
+}
+
 }  // namespace views
diff --git a/ui/views/cocoa/bridged_content_view.mm b/ui/views/cocoa/bridged_content_view.mm
index e300b7e..6d05846 100644
--- a/ui/views/cocoa/bridged_content_view.mm
+++ b/ui/views/cocoa/bridged_content_view.mm
@@ -1449,7 +1449,7 @@
   // the Chrome renderer. Add code to extract underlines from |text| once our
   // render text implementation supports thick underlines and discontinous
   // underlines for consecutive characters. See http://crbug.com/612675.
-  composition.underlines.push_back(ui::CompositionUnderline(
+  composition.ime_text_spans.push_back(ui::ImeTextSpan(
       0, [text length], SK_ColorBLACK, false, SK_ColorTRANSPARENT));
   textInputClient_->SetCompositionText(composition);
   hasUnhandledKeyDownEvent_ = NO;
diff --git a/ui/views/cocoa/bridged_native_widget_unittest.mm b/ui/views/cocoa/bridged_native_widget_unittest.mm
index a500e998..733bd50 100644
--- a/ui/views/cocoa/bridged_native_widget_unittest.mm
+++ b/ui/views/cocoa/bridged_native_widget_unittest.mm
@@ -40,6 +40,7 @@
 using base::SysNSStringToUTF8;
 using base::SysNSStringToUTF16;
 using base::SysUTF8ToNSString;
+using base::SysUTF16ToNSString;
 
 #define EXPECT_EQ_RANGE(a, b)        \
   EXPECT_EQ(a.location, b.location); \
diff --git a/ui/views/controls/textfield/textfield_model.cc b/ui/views/controls/textfield/textfield_model.cc
index f4d2282..58d466b 100644
--- a/ui/views/controls/textfield/textfield_model.cc
+++ b/ui/views/controls/textfield/textfield_model.cc
@@ -256,8 +256,8 @@
 // representing the target clause (on Windows). Returns an invalid range if
 // there is no such a range.
 gfx::Range GetFirstEmphasizedRange(const ui::CompositionText& composition) {
-  for (size_t i = 0; i < composition.underlines.size(); ++i) {
-    const ui::CompositionUnderline& underline = composition.underlines[i];
+  for (size_t i = 0; i < composition.ime_text_spans.size(); ++i) {
+    const ui::ImeTextSpan& underline = composition.ime_text_spans[i];
     if (underline.thick)
       return gfx::Range(underline.start_offset, underline.end_offset);
   }
@@ -659,8 +659,9 @@
   base::string16 new_text = text();
   render_text_->SetText(new_text.insert(cursor, composition.text));
   composition_range_ = gfx::Range(cursor, cursor + composition.text.length());
-  // Don't render transparent composition underlines.
-  if (composition.underlines.size() > 0 && composition.underlines[0].color != 0)
+  // Don't render transparent IME spans.
+  if (composition.ime_text_spans.size() > 0 &&
+      composition.ime_text_spans[0].color != 0)
     render_text_->SetCompositionRange(composition_range_);
   else
     render_text_->SetCompositionRange(gfx::Range::InvalidRange());
diff --git a/ui/views/controls/textfield/textfield_model_unittest.cc b/ui/views/controls/textfield/textfield_model_unittest.cc
index d3722bb..a28fb1e 100644
--- a/ui/views/controls/textfield/textfield_model_unittest.cc
+++ b/ui/views/controls/textfield/textfield_model_unittest.cc
@@ -867,7 +867,7 @@
 
   ui::CompositionText composition;
   composition.text = base::ASCIIToUTF16("678");
-  composition.underlines.push_back(ui::CompositionUnderline(0, 3, 0, false));
+  composition.ime_text_spans.push_back(ui::ImeTextSpan(0, 3, 0, false));
 
   // Cursor should be at the end of composition when characters are just typed.
   composition.selection = gfx::Range(3, 3);
@@ -881,15 +881,15 @@
 
   // Restart composition with targeting "67" in "678".
   composition.selection = gfx::Range(1, 3);
-  composition.underlines.clear();
-  composition.underlines.push_back(ui::CompositionUnderline(0, 2, 0, true));
-  composition.underlines.push_back(ui::CompositionUnderline(2, 3, 0, false));
+  composition.ime_text_spans.clear();
+  composition.ime_text_spans.push_back(ui::ImeTextSpan(0, 2, 0, true));
+  composition.ime_text_spans.push_back(ui::ImeTextSpan(2, 3, 0, false));
   model.SetCompositionText(composition);
   EXPECT_TRUE(model.HasCompositionText());
   EXPECT_TRUE(model.HasSelection());
 #if !defined(OS_CHROMEOS)
   // |composition.selection| is ignored because SetCompositionText checks
-  // if a bold underline exists first.
+  // if a thick underline exists first.
   EXPECT_EQ(gfx::Range(5, 7), model.render_text()->selection());
   EXPECT_EQ(7U, model.render_text()->cursor_position());
 #else
@@ -922,9 +922,9 @@
   composition_text_confirmed_or_cleared_ = false;
   model.MoveCursor(gfx::LINE_BREAK, gfx::CURSOR_RIGHT, gfx::SELECTION_NONE);
 
-  // Also test the case where a selection exists but a bold underline doesn't.
+  // Also test the case where a selection exists but a thick underline doesn't.
   composition.selection = gfx::Range(0, 1);
-  composition.underlines.clear();
+  composition.ime_text_spans.clear();
   model.SetCompositionText(composition);
   EXPECT_STR_EQ("1234567890678", model.text());
   EXPECT_TRUE(model.HasSelection());
@@ -1475,7 +1475,7 @@
 
   ui::CompositionText composition;
   composition.text = base::ASCIIToUTF16("abc");
-  composition.underlines.push_back(ui::CompositionUnderline(0, 3, 0, false));
+  composition.ime_text_spans.push_back(ui::ImeTextSpan(0, 3, 0, false));
   composition.selection = gfx::Range(2, 3);
 
   model.SetText(base::ASCIIToUTF16("ABCDE"));
diff --git a/ui/views/view.cc b/ui/views/view.cc
index 72cdf76..44d60e4f 100644
--- a/ui/views/view.cc
+++ b/ui/views/view.cc
@@ -908,10 +908,10 @@
       // Transform |clip_path_| from local space to parent recording space.
       gfx::Transform to_parent_recording_space;
 
+      to_parent_recording_space.Translate(paint_info.offset_from_parent());
       to_parent_recording_space.Scale(
           SkFloatToScalar(paint_info.paint_recording_scale_x()),
           SkFloatToScalar(paint_info.paint_recording_scale_y()));
-      to_parent_recording_space.Translate(paint_info.offset_from_parent());
 
       clip_path_in_parent.transform(to_parent_recording_space.matrix());
       clip_recorder.ClipPathWithAntiAliasing(clip_path_in_parent);
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm
index 398ea45f..7494b20 100644
--- a/ui/views/widget/native_widget_mac.mm
+++ b/ui/views/widget/native_widget_mac.mm
@@ -268,7 +268,7 @@
 bool NativeWidgetMac::SetWindowTitle(const base::string16& title) {
   NSWindow* window = GetNativeWindow();
   NSString* current_title = [window title];
-  NSString* new_title = SysUTF16ToNSString(title);
+  NSString* new_title = base::SysUTF16ToNSString(title);
   if ([current_title isEqualToString:new_title])
     return false;
 
diff --git a/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.js b/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.js
index 0d06a9e6..40fe593 100644
--- a/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.js
+++ b/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.js
@@ -13,7 +13,7 @@
  * Dimensions for camera capture.
  * @const
  */
-var CAPTURE_SIZE = {height: 480, width: 480};
+var CAPTURE_SIZE = {height: 384, width: 384};
 
 Polymer({
   is: 'cr-camera',
diff --git a/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.html b/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.html
index 131d207..6765125 100644
--- a/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.html
+++ b/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.html
@@ -13,7 +13,17 @@
       }
 
       cr-camera {
-        --cr-camera-image-size: var(--cr-picture-image-size, 228px);
+        --cr-camera-image-size: 288px;
+      }
+
+      #preview {
+        bottom: 0;
+        height: var(--cr-picture-image-size, 228px);
+        left: 0;
+        margin: auto;
+        position: absolute;
+        right: 0;
+        top: 0;
       }
 
       img {
@@ -43,18 +53,21 @@
 
       #discard button {
         --iron-icon-fill-color: white;
+        -webkit-margin-start: 0;
         border-radius: 50%;
       }
     </style>
     <template is="dom-if"
         if="[[showImagePreview_(cameraActive_, imageSrc)]]">
-      <img alt="[[previewAltText]]" src="[[getImgSrc_(imageSrc)]]"
-          data-show-discard$="[[showDiscard_(imageType)]]">
-      <div id="discard" hidden="[[!showDiscard_(imageType)]]">
-        <button is="paper-icon-button-light" id="discardImage"
-            class="icon-delete-white" title="[[discardImageLabel]]"
-            on-tap="onTapDiscardImage_">
-        </button>
+      <div id="preview">
+        <img alt="[[previewAltText]]" src="[[getImgSrc_(imageSrc)]]"
+            data-show-discard$="[[showDiscard_(imageType)]]">
+        <div id="discard" hidden="[[!showDiscard_(imageType)]]">
+          <button is="paper-icon-button-light" id="discardImage"
+              class="icon-delete-white" title="[[discardImageLabel]]"
+              on-tap="onTapDiscardImage_">
+          </button>
+        </div>
       </div>
     </template>
     <template is="dom-if" if="[[cameraActive_]]">
diff --git a/ui/webui/resources/js/cr/ui/menu_button.js b/ui/webui/resources/js/cr/ui/menu_button.js
index d54de2d..b68c1802 100644
--- a/ui/webui/resources/js/cr/ui/menu_button.js
+++ b/ui/webui/resources/js/cr/ui/menu_button.js
@@ -43,6 +43,7 @@
      */
     decorate: function() {
       this.addEventListener('mousedown', this);
+      this.addEventListener('touchstart', this);
       this.addEventListener('keydown', this);
       this.addEventListener('dblclick', this);
 
@@ -98,6 +99,7 @@
 
       switch (e.type) {
         case 'mousedown':
+        case 'touchstart':
           if (e.currentTarget == this.ownerDocument) {
             if (e.target instanceof Node && !this.contains(e.target) &&
                 !this.menu.contains(e.target)) {
@@ -108,8 +110,8 @@
           } else {
             if (this.isMenuShown()) {
               this.hideMenu();
-            } else if (e.button == 0) {  // Only show the menu when using left
-                                         // mouse button.
+            } else if (e.type == 'mousedown' && e.button == 0) {
+              // Only show the menu when using left mouse button.
               this.showMenu(false, {x: e.screenX, y: e.screenY});
 
               // Prevent the button from stealing focus on mousedown.